Нахождение общего количества "стоп-слов" в файле

Я пытаюсь создать программу на 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

У вас есть многочисленные проблемы:

  1. readlines будет работать только один раз - после этого вы окажетесь в конце файла и вернете пустую строку.
  2. В любом случае абсурдно неэффективно воссоздавать список стоп-слов для каждой строки в другом файле.
  3. 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.Counters), но это должно помочь вам начать.

Другие вопросы по тегам