Нахождение общего количества "стоп-слов" в файле
Я пытаюсь создать программу на Python, которая читает два текстовых файла, один из которых содержит статью, а другой содержит список "стоп-слов" (по одному слову в каждой строке). Я хотел бы определить, сколько из этих "стоп-слов" содержится в конкретном текстовом файле, который я использую (суммарный итог частоты каждого "стоп-слова"), содержащем статью.
Я пробовал создавать вложенные for
Циклы для того, чтобы сделать это, где я перебираю каждую строку файла, содержащего статью (внешний для цикла), и внутри каждой строки, имея цикл for (внутренний для цикла), который проходит по списку "стоп-слов" и видит, есть ли в текущей строке "стоп-слово", и если да, то как часто. В конце я добавляю, как часто слово находится в текущей строке в накопителе, который будет отслеживать общее суммарное количество стоп-слов, найденных в файле, содержащем статью.
В настоящее время, когда я запускаю его, он говорит, что в файле 0 стоп-слов, что неверно.
import string
def main():
analyzed_file = open('LearnToCode_LearnToThink.txt', 'r')
stop_word_file = open('stopwords.txt', 'r')
stop_word_accumulator = 0
for analyzed_line in analyzed_file.readlines():
formatted_line = remove_punctuation(analyzed_line)
for stop_word_line in stop_word_file.readlines():
stop_formatted_line = create_stopword_list(stop_word_line)
if stop_formatted_line in formatted_line:
stop_word_frequency = formatted_line.count(stop_formatted_line)
stop_word_accumulator += stop_word_frequency
print("there are ",stop_word_accumulator, " words")
stop_word_file.close()
analyzed_file.close()
def create_stopword_list(stop_word_text):
clean_words = [] # create an empty list
stop_word_text = stop_word_text.rstrip() # remove trailing whitespace characters
new_words = stop_word_text.split() # create a list of words from the text
for word in new_words: # normalize and add to list
clean_words.append(word.strip(string.punctuation).lower())
return clean_words
def remove_punctuation(text):
clean_words = [] # create an empty list
text = text.rstrip() # remove trailing whitespace characters
words = text.split() # create a list of words from the text
for word in words: # normalize and add to list
clean_words.append(word.strip(string.punctuation).lower())
return clean_words
main()
2 ответа
Вы можете использовать NLTK для проверки стоп-слов и подсчета:
from nltk.corpus import stopwords
nltk.download('stopwords')
from nltk.tokenize import word_tokenize
nltk.download('punkt')
x = r"['Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, ché la
diritta via era smarrita.Ahi quanto a dir qual era è cosa dura esta selva selvaggia
e aspra e forte che nel pensier rinova la paura! Tant' è amara che poco è più morte;
ma per trattar del ben ch'i' vi trovai, dirò de l altre cose chi v ho scorte.']"
word_tokens = word_tokenize(x) #splitta i pezzi
stopwords_x = [w for w in word_tokens if w in stopWords]
len(stopwords_x) / len(word_tokens) * 100
У вас есть многочисленные проблемы:
readlines
будет работать только один раз - после этого вы окажетесь в конце файла и вернете пустую строку.- В любом случае абсурдно неэффективно воссоздавать список стоп-слов для каждой строки в другом файле.
one_list in another_list
а такжеone_list.count(another_list)
не делай то, что ты думаешь, они делают.
Вместо этого попробуйте что-то вроде:
stop_words = get_stop_word_list(stop_words_file_name)
stop_word_count = 0
with open(other_file_name) as other_file: # note 'context manager' file handling
for line in other_file:
cleaned_line = clean(line)
for stop_word in stop_words:
if stop_word in cleaned_line:
stop_word_count += cleaned_line.count(stop_word)
Есть более эффективные подходы (например, set
с и collections.Counter
s), но это должно помочь вам начать.