Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Почему код для определения частоты слов в тексте считает бесконечно?

#python


Почему код продолжается бесконечно и не заканчивается? Уже и ставила return, но тогда
просчитывает только первое слово и всё. 

Код:

def lol():
    import re #вызов регулярных выражени
    frequency = {} #задаем словарь частот {}-обозначение словаря
    with open(filename) as slova:
        text = slova.read()
        sentence_text = text.lower()
        pattern = re.findall(r'\b[a-z]{1,20}\b', sentence_text) #составляем регулярку
через функция findall (вызов + граница + слова + длина мин и макс + граница, переменная)
        for word in pattern:
            count = frequency.get(word,0) #задаем ключ
            frequency[word] = count + 1
            frequency_list = frequency.keys()
            for words in frequency_list:
                print (words)
                return (frequency[words])
print (lol())

    


Ответы

Ответ 1



Как уже объяснил @Эникейщик, вложенный цикл не нужен и только замедляет выполнение (сложность алгоритма из-за вложенного цикла - O(n^2)). Кроме того return внутри него ломает код. Попробуйте воспользоваться модулем nltk, который предназначен для работы с естественными текстами: In [54]: from nltk import word_tokenize, FreqDist In [55]: data = open(r'c:/temp/TWAIN.LOG').read() In [56]: fdist = FreqDist(word.lower() for word in word_tokenize(data) if word.isalpha()) 10 наиболее часто встречающихся слов: In [57]: fdist.most_common(10) Out[57]: [('message', 10), ('ctwtrace', 4), ('ctwunk', 3), ('dsm', 3), ('dsmentrydiagexit', 3), ('rc', 3), ('cc', 3), ('thunker', 2), ('scannerredirection', 2), ('to', 2)] весь словарь целиком: In [58]: dict(fdist) Out[58]: {'message': 10, 'ctwunk': 3, 'reset': 1, 'log': 1, 'starting': 1, 'thunker': 2, 'why': 1, 'ca': 1, 'we': 1, 'find': 1, 'the': 1, 'window': 1, 'dsm': 3, 'dsmentrydiagexit': 3, 'rc': 3, 'cc': 3, 'ctwtrace': 4, 'scannerredirection': 2, 'to': 2, 'null': 2, 'control': 2, 'identity': 2, 'getfirst': 1, 'getnext': 1}

Ответ 2



У вас один цикл (назначение которого мне, честно говоря, не очень понятно) вложен в другой, что а) ненужно, б) приводит к повторению одной и той же ненужной работы. И чем длиннее текст, тем больше этой ненужной работы. После первого цикла вам нужно просто вывести нужную информацию без всяких циклов: for word in pattern: count = frequency.get(word,0) #задаем ключ frequency[word] = count + 1 frequency_list = frequency.keys() print frequency # слова и их частота print frequency_list # список встречающихся слов print (lol()) - не надо. Достаточно lol(), т.к. вывод текста у вас происходит в самой функции.

Комментариев нет:

Отправить комментарий