Как изобразить частоту слов с помощью matplotlib с Python 3

Вступление

Текстовые данные существуют в самых разных формах, от журналистики до социальных сетей и электронной почты. Когда мы анализируем и визуализируем текстовые данные, мы можем выявить общие тенденции, которые могут изменить способ интерпретации текста.

В этом уроке мы будем изучать частоту графического слова в текстовом корпусе. Программа, которую мы будем создавать, будет искать в простом текстовом документе и организовывать каждое уникальное слово с его частотой. Затем мы отобразим данные, которые мы нашли с помощью + matplotlib +.

Предпосылки

Чтобы использовать этот учебник, убедитесь, что у вас есть следующие предварительные условия:

Наконец, убедитесь, что вы следуете https://www.digitalocean.com/community/tutorials/how-to-plot-data-in-python-3-using-matplotlib#step-1-%E2%80%94-importing -matplotlib [Шаг 1 - импорт + matplotlib +] нашего How для построения данных в Python 3 Использование matplotlib, так как для этого проекта необходимо установить + matplotlib +.

Шаг 1 - Настройка файла программы

Теперь, когда у нас установлен + matplotlib, мы можем приступить к созданию нашего проекта.

Используя выбранный вами текстовый редактор, создайте новый файл Python и назовите его + word_freq.py +. Это будет наш основной файл.

В этой программе мы будем import + matplotlib + и https: //www.digitalocean. com / community / tutorials / how-to-construct-classes-and-define-objects-in-python-3 [класс], который нам нужен (это + pyplot +), передав ему + plt + https: / /www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3#aliasing-modules[alias]. По сути, это объявляет + plt + как глобальную переменную, которая будет использоваться в нашем скрипте.

word_freq.py

import matplotlib.pyplot as plt

Далее мы импортируем некоторые пакеты по умолчанию в Python. Они будут использоваться для установки и ввода данных командной строки. Важный пакет, на который следует обратить внимание, это + argparse +. Это то, что мы будем использовать для получения информации из командной строки и включения текста справки для пользователя.

Давайте импортируем следующие пакеты по умолчанию в Python:

word_freq.py

import matplotlib.pyplot as plt

Наконец, создайте стандартный метод main и вызовите. Внутри основного метода мы напишем большую часть нашего кода.

word_freq.py

import matplotlib.pyplot as plt
import sys
import operator
import argparse

Теперь, когда мы импортировали все и настроили каркас для нашего проекта, мы можем перейти к использованию импортированных пакетов.

Шаг 2 - Настройка анализатора аргументов

В этой части мы будем создавать аргументы командной строки и сохранять их в variable для быстрого доступ.

В нашем методе main давайте создадим нашу переменную синтаксического анализатора и назначим ее конструктору по умолчанию, который предоставляет + argparse +. Затем мы назначим ожидаемый аргумент для слова, которое мы будем искать в файле. Наконец, мы назначим ожидаемый аргумент для файла, в котором содержится слово. Это будет файл + .txt +.

word_freq.py

...
def main():










if __name__ == "__main__":
 main()

На данный момент первый аргумент в методе - это заголовок того, что мы ожидаем в командной строке. Второй аргумент + help =" …​ "+ используется для предоставления пользователю некоторой информации о том, каким должен быть аргумент командной строки.

Далее мы сохраним данные аргументы в другую переменную, которую мы будем называть + args +.

word_freq.py

...
def main():
 parser = argparse.ArgumentParser()
 parser.add_argument(
     "word",
     help="the word to be searched for in the text file."
 )
 parser.add_argument(
     "filename",
     help="the path to the text file to be searched through"
 )



if __name__ == "__main__":
 main()

Для правильной оценки мы всегда должны проверять ваши входные данные в случае опечатки в аргументах командной строки. Это также предотвращает внезапный сбой нашего скрипта. Поэтому давайте обработаем ошибки с помощью оператора + try +.

word_freq.py

...
def main():
   ...
   args = parser.parser_args()








if __name__ == "__main__":
 main()

Мы используем + sys.exit (1) +, чтобы указать пользователю, что была проблема с кодом, и он не мог завершиться успешно.

Наш проект теперь сможет принимать аргументы командной строки. Следующим шагом является анализ нашего входного файла.

Шаг 3 - Разбор файла

На этом этапе мы будем брать файл, читать каждое слово, регистрировать, как часто они появляются, и сохранять все это в тип данных словаря.

Давайте create функцию с именем + word_freq () +, которая принимает два аргумента командной строки ( слово и имя файла), а затем вызвать эту функцию в + main () +.

word_freq.py

...
def main():
   ...




if __name__ == "__main__":
 main()

Первым шагом при разборе файла является создание типа данных словаря, который мы назовем + doc +. Это будет хранить каждое слово, найденное в файле, и отслеживать, сколько раз оно появилось.

word_freq.py

...
def word_freq( word, filename ):


if __name__ == "__main__":
 main()

Следующим шагом будет итерация по данному файлу. Это делается с использованием nested + for + loop.

Первый цикл + for + предназначен для открытия файла и получения первой строки из него. Затем он берет то, что находится в каждой строке, и разбивает его на основе строки пробела между словами, сохраняя слова в массиве.

Второй цикл + for + берет этот массив и проходит по нему, проверяя, находится ли он в словаре или нет. Если это так, мы добавляем один счет к нему. Если это не так, то мы создаем новую запись и инициализируем ее как 1.

word_freq.py

...
def word_freq(word, filename):
   doc = {}









if __name__ == "__main__":
 main()

Сейчас мы на полпути к завершению проекта.

Напомним, что + наш метод main () + должен настроить наши входные данные командной строки и передать их в функцию + word_freq () +. + word_freq () + должен взять слово и имя файла из командной строки и сохранить каждое уникальное слово, найденное в текстовом файле.

Далее мы возьмем эти данные и организуем их для использования в нашем графике.

Шаг 4 - Хранение и сортировка данных

Прежде чем мы сделаем график, мы должны убедиться, что слово действительно находится в файле, который мы открыли. Мы можем сделать это с помощью + if + conditional оператор.

word_freq.py

...
def word_freq(word, filename):
   ...
     else:
         doc[entry] = 1




if __name__ == "__main__":
 main()

Теперь, когда мы знаем, что слово находится в файле, мы можем приступить к настройке данных для нашего графика.

Сначала мы должны начать с сортировки словарного типа данных по возрастанию по наименьшему количеству вхождения и инициализации переменных для последующего использования. Мы должны отсортировать наш словарь так, чтобы он соответствующим образом отображался на графике.

word_freq.py

...
def word_freq(word, filename):
   ...
   if (not word in doc):
       sys.stderr.write("Error: " + word + " does not appear in " + filename)
       sys.exit(1)







if __name__ == "__main__":
 main()

Следует обратить внимание на две переменные: + just_the_occur + - данные, которые будут содержать количество появлений слова. Другая переменная это + just_the_rank +, которая будет содержать данные, относящиеся к рангу слова.

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

word_freq.py

...
def word_freq( word, filename ):
   ...

 sortedDoc = (sorted(doc.items(), key = operator.itemgetter(1)))[::-1]
 just_the_occur = []
 just_the_rank = []
 word_rank = 0
 word_frequency = 0











if __name__ == "__main__":
 main()

Здесь мы должны убедиться, что обе переменные + just_the_occur + и + just_the_rank + имеют одинаковую длину, иначе + matplotlib + не позволит нам создать граф.

Мы также добавили оператор + if + в цикл, чтобы найти наше слово (о котором мы уже знаем, что оно есть) и вывести его рейтинг и частоту.

Теперь у нас есть все необходимое для создания вашего графика. Наш следующий шаг - наконец создать его.

Шаг 5 - Создание графика

На этом этапе мы можем подключить переменную + plt +, которую мы создали в начале. Чтобы создать наш график, нам нужны заголовок, метка оси y, метка оси x, масштаб и тип графика.

В нашем случае, мы будем создавать график базы 10 для организации наших данных. Метки заголовков и осей могут быть такими, какими вы хотите, чтобы они были, но чем более информативны, тем лучше для людей, которые смотрят на ваш график.

word_freq.py

...
def word_freq( word, filename ):
   ...
 just_the_rank.append(entry_num)
 entry_num += 1
 just_the_occur.append(entry[1])



















if __name__ == "__main__":
 main()

Функции title, + plt.ylabel () + и + plt.xlabel () + являются метками для каждой оси.

Функция + plt.loglog () + принимает + just_the_rank + и + just_the_occur + для оси x и y соответственно.

Мы меняем базу журнала и устанавливаем ее на 10.

Затем мы устанавливаем график, чтобы рассеять и выделить нашу точку. Мы сделали оранжевую звезду размером 100, чтобы она была ярко выраженной. Наконец, мы пометили это своим словом.

После того, как все для нашего графика выполнено, мы сообщаем, что оно должно быть отображено с помощью + plt.show () +.

Теперь, когда наш код, наконец, завершен, мы можем выполнить его тестирование.

Шаг 6 - Запуск программы

Для нашего образца текста нам понадобится текстовый файл для чтения, поэтому давайте загрузим его из Project Gutenberg, волонтерского проекта, который предоставляет бесплатные электронные книги (в основном в открытом доступе) для читателей.

Давайте сохраним текст романа Чарльза Диккенса _http: //www.gutenberg.org/ebooks/98 [Повесть о двух городах] _ в файл с именем + towns.txt + с + curl + в наш текущий каталог который содержит наш скрипт Python:

curl http://www.gutenberg.org/files/98/98-0.txt --output cities.txt

Далее, давайте запустим наш код, передав параметры выбранного слова (мы будем использовать «fish») и имя текстового файла:

python word_freq.py fish cities.txt

Если все работает правильно, вы должны увидеть это:

изображение: https: //assets.digitalocean.com/articles/eng_python/WordFrequency/word-frequency-matplotlib.png [График разброса частоты слов в matplotlib]

Мы видим рейтинг слова «рыба» 5309, а также визуализацию происшествий.

Теперь вы можете продолжать экспериментировать с разными словами и разными текстовыми файлами. Вы можете узнать больше о работе с текстовыми файлами, прочитав наш How для работы с простыми текстовыми файлами в Python 3 учебник.

Законченный код и улучшения кода

На этом этапе у вас должна быть полностью работающая программа, которая будет определять частоту слов данного слова в файле + .txt +.

Ниже приведен законченный код для этого проекта.

word_freq.py

import matplotlib.pyplot as plt
import sys
import operator
import argparse


def main():
   parser = argparse.ArgumentParser()
   parser.add_argument(
       "word",
       help="the word to be searched for in the text file."
   )
   parser.add_argument(
       "filename",
       help="the path to the text file to be searched through"
   )

   args = parser.parse_args()

   try:
       open(args.filename)
   except FileNotFoundError:

       # Custom error print
       sys.stderr.write("Error: " + args.filename + " does not exist!")
       sys.exit(1)

   word_freq(args.word, args.filename)


def word_freq(word, filename):
   doc = {}

   for line in open(filename):

       # Assume each word is separated by a space
       split = line.split(' ')
       for entry in split:
           if (doc.__contains__(entry)):
               doc[entry] = int(doc.get(entry)) + 1
           else:
               doc[entry] = 1

   if (word not in doc):
       sys.stderr.write("Error: " + word + " does not appear in " + filename)
       sys.exit(1)

   sorted_doc = (sorted(doc.items(), key=operator.itemgetter(1)))[::-1]
   just_the_occur = []
   just_the_rank = []
   word_rank = 0
   word_frequency = 0

   entry_num = 1
   for entry in sorted_doc:

       if (entry[0] == word):
           word_rank = entry_num
           word_frequency = entry[1]

       just_the_rank.append(entry_num)
       entry_num += 1
       just_the_occur.append(entry[1])

   plt.title("Word Frequencies in " + filename)
   plt.ylabel("Total Number of Occurrences")
   plt.xlabel("Rank of word(\"" + word + "\" is rank " + str(word_rank) + ")")
   plt.loglog(just_the_rank, just_the_occur, basex=10)
   plt.scatter(
       [word_rank],
       [word_frequency],
       color="orange",
       marker="*",
       s=100,
       label=word
   )
   plt.show()

if __name__ == "__main__":
   main()

Теперь, когда все сделано, есть некоторые потенциальные улучшения и модификации, которые мы можем сделать в этом коде.

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

Мы также можем изменить программу так, чтобы она сравнивала длину каждого слова с другим. Для этого мы сравниваем слова по длине и сохраняем каждую уникальную длину в словаре.

Заключение

Мы только что создали программу для чтения текстового файла и упорядочения данных, чтобы увидеть частоту конкретного слова по сравнению с другими в тексте.

Если вы заинтересованы в визуализации данных, вы также можете посмотреть наши https://www.digitalocean.com/community/tutorials/how-to-make-a-bar-chart-with-javascript-and-the-d3- библиотека [Как сделать гистограмму с помощью JavaScript и библиотеки D3].

Related