Количество слов из файла: Проблемы с открытием файла или я его неправильно закодировал? - PullRequest
0 голосов
/ 10 февраля 2019

Проблема: программа застревает, открывая файл для чтения.

Моя проблема в том, что в самом начале программа кажется сломанной.Он просто отображает

[(1, 'C: \ Users \ .... \ Desktop \ Sense_and_Sensibility.txt')]

снова и снова, никогдаокончание.

( ПРИМЕЧАНИЕ: .... является заменой с целью публикации, поскольку мое имя пользователя на компьютере - мое полное имя).

Я не уверен, что яЯ закодировал это совершенно неправильно, или если у него есть проблемы с открытием файла.Любая помощь приветствуется.

Программа должна:

1: открыть файл, заменить все знаки препинания пробелами, изменить все слова на строчные, затем сохранить их в словаре.

2: посмотрите список слов (стоп-слов), которые будут удалены из исходного словаря.

3: подсчитать оставшиеся слова и отсортировать их по частоте.

fname = r"C:\Users\....\Desktop\Sense_and_Sensibility.txt"  # file to read
swfilename = r"C:\Users\....\Desktop\stopwords.txt"  # words to delete


with open(fname) as file:                 # have the program run the file
    for line in file:  # loop through
        fname.replace('-.,"!?', " ")  # replace punc. with space
        words = fname.lower()  # make all words lowercase

        word_list = fname.split()  # separate the words, store

        word_dict = {}  # create a dictionary


with open(swfilename) as delete:  # open stop word list
    for line in delete:
        sw_list = swfilename.split()  # separate the words, store them
        sw_dict = {}

        for key in sw_dict:
            word_dict.pop(key, None)  # delete common words


for word in word_list:  # loop through
    word_dict[word] = word_dict.get(word, 0) + 1  # count frequency

word_freq = []  # create index
for key, value in word_dict.items():  # count occurrences
    word_freq.append((value, key))  # append freq list

word_freq.sort(reverse=True)  # sort the words by freq
print(word_freq)  # print most to least

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Есть несколько проблем с вашим кодом.Я хотел бы обсудить только самый очевидный из них, учитывая, что невозможно воспроизвести ваши точные наблюдения, потому что используемый вами ввод недоступен для читателей.

Сначала я сообщу дословно ваш код и отмечу слабые места с помощью???, за которым следует число, к которому я буду обращаться после кода.

fname = r"C:\Users\....\Desktop\Sense_and_Sensibility.txt" #file to read
swfilename = r"C:\Users\....\Desktop\stopwords.txt"        #words to delete



with open(fname) as file:                 #???(1) have the program run the file  
    for line in file:                     #loop through                                     
       fname.replace ('-.,"!?', " ")         #???(2) replace punc. with space
       words = fname.lower()                 #???(3) make all words lowercase

       word_list = fname.split()             #separate the words, store 

       word_dict = {}                        #???(4) create a dictionary 





    with open(swfilename) as delete:       #open stop word list
        for line in delete: 
            sw_list = swfilename.split()   #separate the words, store them 
            sw_dict = {}

            for key in sw_dict:
                word_dict.pop(key, None)    #???(5) delete common words




    for word in word_list:                            #???(6) loop through
        word_dict[word] = word_dict.get(word, 0) + 1  #???(7) count frequency

    word_freq = []                                    #???(8)create index
    for key, value in word_dict.items():              #count occurrences           
        word_freq.append((value, key))                #append freq list         

    word_freq.sort(reverse = True)                  #sort the words by freq
    print(word_freq)                                #print most to least
  1. (несовершеннолетний) file - это зарезервированное слово в Python, и рекомендуется не использоватьдля пользовательских целей, как вы делаете
  2. (Major) .replace() заменит точную строку слева точной строкой справа, но вы хотели бы выполнить что-то вроде multi_replace(), который вы можете реализовать самостоятельно (например, как функцию) путем последовательных вызовов .replace(), например, в цикле (или используя functools.reduce()).
  3. (основной) fname содержит имя файла(путь, собственно), а не содержимое файла, с которым вы хотите работать.
  4. (основной) Вы просматриваете строки файла, но если вы создаете свои word_list и word_dict дляв каждой строке вы будете «перезаписывать» содержимое на каждой итерации.Кроме того, word_dict создается пустым и никогда не заполняется.
  5. (основной) Логика, которую вы пытаетесь реализовать, не будет работать в словаре, поскольку словари не могут содержать несколько идентичных ключей.Более эффективный подход - создать filtered_list из word_list, исключив stop_words.Затем словарь можно использовать для реализации счетчика.Я понимаю, что на вашем уровне, возможно, стоит научиться реализовывать счетчик, но имейте в виду, что модуль collections.Counter() из стандартной библиотеки (доступный через import collections) делает именно то, что вы хотите.
  6. (основной), учитывая, что на данный момент от вашего кода не осталось ничего полезного, но цикл по исходному списку вместо отфильтрованного списка не будет иметь информации о стоп-словах.
  7. (основной)dictionary[key] может использоваться как для доступа (что вы не делаете), так и для записи (что вы делаете) значения, связанного с определенным ключом в словаре.
  8. (несовершеннолетний) Очевидно, ваш подход к сортировкев соответствии с частотой слова будет работать, но гораздо лучше было бы использовать параметр key из .sort() и sorted().

Надеюсь, это поможет!

0 голосов
/ 10 февраля 2019

Импорт файлов в Windows с использованием Python несколько отличается от того, что происходит в Mac и Linux.

Просто измените путь к файлу с fname = r"C:\Users\....\Desktop\Sense_and_Sensibility.txt"

На fname = "C:\\Users\\....\\Desktop\\Sense_and_Sensibility.txt"

Используйте двойные косые черты

...