#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(), т.к. вывод текста у вас происходит в самой функции.
Комментариев нет:
Отправить комментарий