#python
#python
Вопрос:
Я пытаюсь прочитать все файлы в каталоге, получить доступ к файлу с стоп-словами, просмотреть каждый файл, удалить стоп-слова из каждого файла, а затем сгенерировать копию всех файлов с удаленными стоп-словами. Я могу читать во всех файлах, а также печатать их в виде массива, но я застреваю, когда дело доходит до двух шагов: удаление стоп-слов и печать полученных файлов в новый набор файлов. Последние три строки кода являются примером для генерации только одного текстового файла, но мне нужен какой-то цикл для генерации их всех.
import pathlib
stop_words = open("StopWordList.txt")
stop_words.read()
for path in pathlib.Path(r'C:UsersUsuarioDesktopHelloWorldemails').iterdir():
if path.is_file():
current_file = open(path, "r")
lines = current_file.read()
words = lines.split()
for y in stop_words:
if not y in stop_words:
appendFile = open('filteredtext.txt', 'a')
appendFile.write(" " y)
appendFile.close()
Комментарии:
1. перейдите по этой ссылке geeksforgeeks.org/removing-stop-words-nltk-python я считаю, что это то, чего вы могли бы хотеть
2. вы получаете
y
отstop_words
и позже проверяете, находится лиy
он внутриstop_words
? В этом нет никакого смысла. Вы должны получитьy
изwords
3. возможно, вам следует получить
words
, использовать его для создания нового списка безstopwords
, а затем объединить все слова в одну строку, а затем сохранить эту строку в файл. Это может работать быстрее, чем писать каждое слово отдельно.4. Кстати: что делать, если в конце слова есть какой-то символ —
.
,,
,!
,?
. Вы должны удалить его, прежде чем проверять его с помощью stopworkds. И вы также должны сравнить строчные буквы. Возможно, вам следует использовать modulenltk
для этого.5. вы должны использовать
path
для создания нового имени для результатов вместо'filteredtext.txt'
Ответ №1:
Я не тестировал это (у меня нет файла со стоп-словами), но я бы сделал
import pathlib
import sys
if len(sys.argv) > 1:
folder = sys.argv[1] # get folder as parameter
else:
folder = r'C:UsersUsuarioDesktopHelloWorldemails'
stop_words = open("StopWordList.txt").read().lower() # to compare lowercase stopwords with lowercase words
for path in pathlib.Path(folder).iterdir():
if path.is_file():
# --- read all text at once ---
input_file = open(path) # it use `r` as default
text = input_file.read()
input_file.close()
original_words = text.split() # text -> words
# --- remove stopwords ---
filtered_words = []
for word in original_words:
temp_word = word.lower().rstrip('.,!?')
if temp_word not in stop_words: # check lowercase without `.,!?`
filtered_words.appeend(word) # keep original word
# --- save all text at once ---
output_path = path '-filtered' # create new filename
text = " ".join(filtered_words) # words -> text
output_file = open('output_path', 'w')
output_file.write(text)
output_file.close()
Он не удаляет .,!?
и не преобразует в нижний регистр.
В конце концов, вы могли бы разделить код на функции
import pathlib
import sys
# --- functions ---
def read_words(path):
input_file = open(path) # it use `r` as default
text = input_file.read()
input_file.close()
words = text.split() # text -> words
return words
def filter_words(words, stopwords):
filtered_words = []
for word in all_words:
temp_word = word.lower().rstrip('.,!?')
if temp_word not in stop_words:
filtered_words.appeend(word)
return filtered_words
def write_words(path, words):
text = " ".join(words) # words -> text
output_file = open(path, 'w')
output_file.write(text)
output_file.close()
# --- main ---
if len(sys.argv) > 1:
folder = sys.argv[1] # get folder as parameter
else:
folder = r'C:UsersUsuarioDesktopHelloWorldemails'
stop_words = open("StopWordList.txt").read().lower() # to compare lowercase stopwords with lowercase words
for path in pathlib.Path(folder).iterdir():
if path.is_file():
words = read_words(path)
words = fiter_words(words, stopwords)
write_words(path '-fitered', words)
Комментарии:
1. вы можете получить стоп-слова из пакета nltk следующим образом из nltk.corpus импортируйте стоп-слова и получите стоп-слова на английском языке следующим образом stop_words = set(stopwords.words(‘english’))
2. @SachinRajput я знаю
nltk
(и, вероятно, у меня он даже установлен), но мне лень тестировать этот код 🙂
Ответ №2:
Следующий код, основанный на вашем коде, — моя помощь, я изменил имена некоторых переменных вашего исходного кода, чтобы они были более осмысленными, в дополнение к некоторым модификациям:
import os
import pathlib
# preparing the StopWordList to be used with each file
stop_words = open("StopWordList.txt")
StopWordList_raw = stop_words.read()
stop_words.close()
StopWordList = StopWordList_raw.split()
# Pathes of source files and that for after-modifications
files_path = 'C:UsersUsuarioDesktopHelloWorldemails'
# another folder, your should create first to store files after modifications in
files_after_path = 'C:UsersUsuarioDesktopHelloWorldemails2'
for path in pathlib.Path(files_path).iterdir():
if path.is_file():
current_file = open(path, "r")
# get the all contents of the file
original_file_content = current_file.read()
# get a copy for modifications if stop words exist
file_content_after = original_file_content
# remove stop words by replacing each of them with '' - if exist
for w in StopWordList:
file_content_after = file_content_after.replace(w, '')
# if modifications done to the original content, save the file in the atrget path
if original_file_content != file_content_after:
file_name_after = os.path.join(files_after_path, path.name)
print(file_name_after)
TargetFile = open(file_name_after, 'w')
TargetFile.write(file_content_after)
TargetFile.close()