2015-10-09 5 views
0

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

ответ

0

У вас есть множество проблем:

  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.Counter с), но это должно вам начать работу.

+0

Я предлагаю заменить внутренний цикл цикла на 'stop_word_count + = sum (map (cleaned_line.count, stop_words))' (возможно, заменить 'map' на' imap'). Есть ли причина, по которой вы проверяли, присутствовало ли слово до вызова 'count'? –

+0

Хорошо, я попробую это из @jonrsharpe и сообщит вам, если это сработает, и если он не заболел, отправьте код того, что я пересмотрел, до – heyyo9028

+0

@AlexHall в основном, чтобы он был достаточно близко к тому, что было в настоящее время OP пытаясь сделать! Это лишь незначительно менее эффективно, чем то, что вы предлагаете, и действительно вы можете сделать это только с одним проходом над каждой строкой, если вы используете словари. – jonrsharpe

Смежные вопросы