1. Code
  2. Python

Подсчет Частоты Повторения Слова в Файле с Помощью Python

Scroll to top

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]

Если вы запустите программу, у вас должно получится что-то вроде этого:

Mac OS X terminalMac OS X terminalMac OS X terminal

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

(Подсказка: обратите внимание на слово с максимальной частотой).