Russian (Pусский) translation by Andrey Rybin (you can also view the original English article)
Вы когда нибудь задавались вопросом, как быстро определить основную тему какого-то документа? О чем в нем говорится больше всего? Позвольте я вам подскажу. Составьте список уникальных слов упоминающихся в документе, и подсчитайте сколько раз каждое слово упоминалось (частоту). Это покажет вам, чему, в первую очередь, посвящен документ. Но сделать это в ручную не просто, поэтому нам нужно какое-то средство для автоматизации, не так ли?
Да, автоматизировав процесс, справится с такой задачей гораздо проще. Давайте посмотрим, каким образом мы можем составить список слов из файла и посчитать частоту их употребления, используя Python.
Тестовый Файл
В этом уроке, мы будем использовать файл test.txt в качестве тестового. Предлагаю вам его закачать, прямо сейчас, только не открывайте его! Давайте лучше поиграем немного. Текст в этом файле из одного из моих уроков на Envato Tuts+. Давайте попробуем угадать, на основании частотности словоупотребления, из какого урока был взят этот текст.
Начнем нашу игру!
Регулярные Выражения
Так как мы собираемся применять шаблоны в нашей игре, нам нужно воспользоваться регулярными выражениями (regex). Если "регулярные выражения" для вас незнакомый термин, посмотрите определение из Википедии:
Последовательность символов, которые определяют шаблон поиска, главным образом для определения соответствия шаблона строке, или строкового соответствия, операции типа «найти и заменить». Концепция возникла в 1950-х годах, когда американский математик Стивен Клини сформулировал описание регулярного языка, и стала активно использоваться в текстовых утилитах под UNIX: редактор ed, фильтр grep.
Если вы хотите узнать больше о регулярных выражениях, прежде чем продолжать этот урок, вы можете посмотреть тьюториал Регулярные выражения в Python, и потом вновь вернуться к этому уроку.
Пишем Программу
Давайте начнем шаг за шагом работать над нашей программой. Первое, что мы должны сделать - сохранить текстовый файл в виде строковой переменной.
1 |
document_text = open('test.txt', 'r') |
2 |
text_string = document_text.read() |
Теперь, давайте сделаем все буквы в нашем документе строчными, что бы нам легче было применить регулярное выражение, используем при этом функцию lower():
1 |
text_string = document_text.read().lower() |
Давайте теперь запишем регулярное выражение, которое вернет нам все слова, количество букв в которых лежит в диапазоне [3-15]. То, что мы начнем с 3, поможет отсеять не интересные для частотного анализа слова такие как и, с, не, а и другие, а слова длинна которых больше 15 букв, могут быть неправильными. Регулярное выражение для такого случая, запишется следующим образом:
1 |
\b[a-z]{3,15}\b |
\b относится к границам слова. Что бы узнать об этом побольше, посмотрите этот урок.
Поиск на основе данного регулярного выражения может быть описан таким кодом:
1 |
match_pattern = re.search(r'\b[a-z]{3,15}\b', text_string) |
Так как мы хотим пройтись по всем словам в документа, мы должны использовать функцию findall:
Возвращает все не пересекающиеся совпадения с шаблоном в строке, в виде списка строк. Строка просматривается слева на право, и совпадения возвращаются в порядке нахождения. Если одна или более групп соответствуют шаблону, возвращается список групп; это будет список кортежей, если шаблону соответствует более чем одна группа. Пустые соответствия включены в результат, если они не затрагивают начало других соответствий.
Мы хотели бы определить частоту с которой каждое слово повторяется в документе. В этом случае нам удобно использовать Словари Python, так как нам нужны пары ключ-значение, где ключ - это слово, а значение - представляет частоту появления слова в документе.
Допустим мы инициировали пустой словарь frequency = { }, сказанное выше можно записать следующим образом:
1 |
for word in match_pattern: |
2 |
count = frequency.get(word,0) |
3 |
frequency[word] = count + 1 |
Вот так используются ключи:
1 |
frequency_list = frequency.keys() |
И наконец, что бы получить слово и его частоту (количество упоминаний в тексте), мы должны сделать следующее:
1 |
for words in frequency_list: |
2 |
print words, frequency[words] |
Давайте в следующем разделе, соберем все вместе, и посмотрим, что у нас получится на выходе.
Собираем Все Вместе
Обсудив все детали нашего кода, давайте взглянем, что у нас в итоге получилось:
1 |
import re |
2 |
import string |
3 |
frequency = {} |
4 |
document_text = open('test.txt', 'r') |
5 |
text_string = document_text.read().lower() |
6 |
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string) |
7 |
|
8 |
for word in match_pattern: |
9 |
count = frequency.get(word,0) |
10 |
frequency[word] = count + 1 |
11 |
|
12 |
frequency_list = frequency.keys() |
13 |
|
14 |
for words in frequency_list: |
15 |
print words, frequency[words] |
Если вы запустите программу, у вас должно получится что-то вроде этого:



Вернемся к нашей игре. Взгляните на частоту для слов, и скажите, о чем говорится в текстовом файле (текст для которого взят из моего другого урока по Python)?
(Подсказка: обратите внимание на слово с максимальной частотой).



