Как управлять данными при помощи Python 3 и Natural Language Toolkit (NLTK)

Общение посредством обмена текстовыми сообщениями плотно вошло в нашу повседневную жизнь. Мы отправляем текстовые сообщения, твиты и обновляем свой статус почти каждый час. В результате чего, неструктурированные текстовые данные стали чрезвычайно распространенными и владея такой интересным и важным инструментом как анализ больших данных, позволит понять нам о чем думают некоторые люди или даже целое общество.
Tweets в Twitter помогают найти нам самые популярные и обсуждаемые темы в мире. Отзывы на Amazon помогают пользователям приобрести лучшие продукты по рейтингу. Эти примеры организации и структурирования знаний представлены в задачах, решенных при помощи обработки естественного языка Natural Language Processing (NLP).
NLP – это область компьютерной науки, которая фокусируется на на взаимодействии между компьютерами и людьми. Техники NLP используются для анализа текста, предоставляя компьютерам возможность понять человеческий язык. Некоторые примеры использования NLP демонстрируют автоматическое суммирование, тему сегментации и анализ настроений.
Этот учебник можно считать введением, которого вполне хватит для использования набора инструментальных средств Natural Language (NLTK): инструмент NLP для Python.

Что необходимо

Чтобы продолжить дальше на вашем компьютере должен быть установлен Python 3 и  локальная среда программирования.

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

Шаг первый – импортируем NLTK

Перед тем, как приступить к работе, давайте удостоверимся, что модуль NLTK установлен. В командной строке,  выполните следующую команду:

$ python -c “import nltk”

Если NLTK установлен, то эта команда будет завершена без ошибок. Теперь, давайте удостоверимся, что у вас установлена последняя версия NLTK :

$ python -c “import nltk; print(nltk.__version__)”

У вас должна быть установлена версия 3.2.1, так как мы будем использовать Twitter пакет NLTK, а он требует именно эту версию.

Если NLTK не установлен, то вы получите сообщение об ошибке:

$ Traceback (most recent call last): File “”, line 1, in ImportError: No module named ‘nltk’

Сообщение об ошибке указывает на то, что NLTK не установлен, так что нужно  скачать библиотеку используя pip:

$ pip install nltk

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

Шаг второй – загружаем данные и определяем части речи

Помимо того, что nltk – это великолепная библиотека для обработки текстов на естественных языках, к ней прилагаются готовые загружаемые наборы исходных данных, т.н. «корпуса», а также программные интерфейсы для удобного доступа к этим данным.

Нам нужны будут «корпуса» twitter , которые мы и будем загружать.

В частности, мы будем работать с «корпусом» twitter_samples. Давайте загрузим корпус через командную строку, делается это так:

$ python -m nltk.downloader twitter_samples

Если все пройдет успешно, то вы должны получить следующий результат:

[nltk_data] Downloading package twitter_samples to
[nltk_data] /Users/sammy/nltk_data…
[nltk_data] Unzipping corpora/twitter_samples.zip.

Дальше нужно скачать POS(part-of-speech). Pos tagging – это процесс автоматической маркировки слов в тексте, в зависимости от того, к какой части речи они относятся: к существительным, глаголам, прилагательным, наречиям и т.д. В этом уроке мы будем использовать конкретно averaged_perceptron_tagger.  Другими словами,  персептрон Tagger использует алгоритм персептрона, чтобы предсказать, какой POS тег “отдать” тому или иному слову.

Давайте будем качать Tagger:

$ python -m nltk.downloader averaged_perceptron_tagger

Если команда выполнена успешно, то вы получите примерно такой результат:

[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data] /Users/sammy/nltk_data…
[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.

Давайте проверим, что “корпус” правильно загружен. В терминале, откройте интерактивную среду Python:

$ python

В интерактивной среде python, импортируйте корпус twitter_samples:

>>> from nltk.corpus import twitter_samples

Корпус twitter в NLTK  в настоящее время содержит примеры 20000 твитов, извлеченных из API Twitter Streaming. Полные твиты хранятся формате JSON. Мы можем видеть, сколько JSON файлов в корпусе с помощью метода twitter_samples.fileids ():

>>> twitter_samples.fileids()

Выглядеть это будет примерно так:

[u’negative_tweets.json’, u’positive_tweets.json’, u’tweets.20150430-223406.json’]

Используя эти файловые идентификаторы мы можем получить всю строку твита:

>>> twitter_samples.strings(‘tweets.20150430-223406.json’)

В общем виде это будет выглядеть примерно так:

[u’RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP’…]

Теперь мы знаем, что наш корпус был загружен успешно. Так что давайте выйдем из интерактивной среды Python при помощи Ctrl + D.

Теперь, когда мы имеем доступ к корпусу twitter_samples, мы можем приступить к написанию сценария для обработки твитов.

Цель написания скрипта – подсчитать сколько раз появляются прилагательные или существительные в определенном подмножестве “корпуса”.

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

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

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

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

Шаг третий – токенизация предложений

Во-первых, в текстовом редакторе,  на ваш выбор, создайте сценарий и  назовите его nlp.py.

Первой строчкой импортируем “корпус”. Затем, создадим переменную и дадим ей значение – список строк твитов из файла positive_tweets.json.

from nltk.corpus import twitter_samples
tweets = twitter_samples.strings(‘positive_tweets.json’)

После загрузки наших твитов, каждый твит представлен в виде одной, отдельной строки. Прежде чем начинать определять какие слова в наших твитах прилагательные, а какие существительные, сначала нужно “разметить”(tokenize ) наши твиты. Токенизация (Tokenization ) это разбиение строк на куски: слова, ключевые слова, фразы, символы и другие элементов, которые называются лексемы. Давайте создадим новую переменную с именем tweets_tokens и придадим ей значение  токенизированный список твитов:

from nltk.corpus import twitter_samples
tweets = twitter_samples.strings(‘positive_tweets.json’)
tweets_tokens = twitter_samples.tokenized(‘positive_tweets.json’)

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

Шаг четвертый – помечаем предложения

Чтобы получить доступ к таким инструментам в NLTK как  POS Tagger , мы должны сначала импортировать его. Все импорты должны быть в самом начале сценария. Давайте сделаем новый импорт вначале нашего скрипта.

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents
tweets = twitter_samples.strings(‘positive_tweets.json’)
tweets_tokens = twitter_samples.tokenized(‘positive_tweets.json’)

Теперь мы можем пометить каждый из наших токенов. NLTK позволяет нам делать при помощи все одного инструмента –  pos_tag_sents (). Мы собираемся создать новую переменную tweets_tagged, которую мы будем использовать для хранения наших маркированных списков. Эту новую строчку можно добавить и в конце нашего сценария:

tweets_tagged = pos_tag_sents(tweets_tokens)

Первый элемент в нашем списке tweets_tagged выглядит следующим образом:

[(u’#FollowFriday’, ‘JJ’), (u’@France_Inte’, ‘NNP’), (u’@PKuchly57′, ‘NNP’), (u’@Milipol_Paris’, ‘NNP’), (u’for’, ‘IN’), (u’being’, ‘VBG’), (u’top’, ‘JJ’), (u’engaged’, ‘VBN’), (u’members’, ‘NNS’), (u’in’, ‘IN’), (u’my’, ‘PRP$’), (u’community’, ‘NN’), (u’this’, ‘DT’), (u’week’, ‘NN’), (u’:)’, ‘NN’)]

Можно увидеть, что наш твит представлен в виде списка и для каждого маркера мы имеем информацию о его POS-теге. Каждая пара  токен/тег сохраняется в виде кортежа.

В NLTK, аббревиатура прилагательного JJ. Существительные же  отслеживаются тегом NN.

Шаг пятый – подсчет тегов

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

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents
tweets = twitter_samples.strings(‘positive_tweets.json‘)
tweets_tokens = twitter_samples.tokenized(‘positive_tweets.json’)
JJ_count = 0
NN_count = 0

После того, как мы создаем переменные, мы создадим два цикла for. Первый цикл будет перебирать все твиты в списке. Второй цикл будет перебирать все пары токен/тег в каждом твите.

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents
tweets = twitter_samples.strings(‘positive_tweets.json’)
tweets_tokens = twitter_samples.tokenized(‘positive_tweets.json’)
JJ_count = 0
NN_count = 0
for tweet in tweets_tagged:
for pair in tweet:
tag = pair[1]
if tag == ‘JJ‘:
JJ_count += 1
elif tag == ‘NN‘:
NN_count += 1

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


for pair in tweet:
tag = pair[1]
if tag == ‘JJ‘:
JJ_count += 1
elif tag == ‘NN‘:
NN_count += 1

print(‘Total number of adjectives = ‘, JJ_count)
print(‘Total number of nouns = ‘, NN_count)

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

Шаг шестой – Запуск NLP скрипта

Сохраните файл nlp.py и запустите его, чтобы увидеть, сколько прилагательных и существительных находится в наших данных :

$ python nlp.py

Если вы все сделали правильно,  то мы должны получить следующий вывод:

Total number of adjectives = 6094
Total number of nouns = 13180

Исходный код

Здесь представлен весь код скрипта и некоторые строки прокомментированы, чтобы было легче понимать что к чему )

# Import data and tagger
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents
# Load tokenized tweets
tweets_tokens = twitter_samples.tokenized(‘positive_tweets.json’)
# Tag tagged tweets
tweets_tagged = pos_tag_sents(tweets_tokens)
# Set accumulators
JJ_count = 0
NN_count = 0
# Loop through list of tweets
for tweet in tweets_tagged:
for pair in tweet:
tag = pair[1]
if tag == ‘JJ’:
JJ_count += 1
elif tag == ‘NN’:
NN_count += 1
# Print total numbers for each adjectives and nouns
print(‘Total number of adjectives = ‘, JJ_count)
print(‘Total number of nouns = ‘, NN_count)

В этом мануле был использован “корпус” NLTK, но вы можете работать и со своими данными. Если вы хотите понять как  правильно читать файлы в Python,  то просмотрите наше руководство по “Как управлять обычными текстовыми файлами в Python 3“.

Вас также может заинтересовать работа с реальными данными в Twitter. И тут  вам в помощь статья, которая покажет вам как работать с API Twitter: Как создать Twitter App.

Затем вы можете прочитать руководство “Как создать Twitterbot с Python 3 и Tweepy Library“, которое покажет как использовать библиотеку Tweepy, чтобы собирать твиты, которые включают определенный хэш-тег.

В этом учебнике вы узнали некоторые методы обработки естественного языка для анализа текста с использованием библиотеки NLTK в Python. Теперь вы можете скачивать “корпусы”, размечать предложения и рассчитывать POS-теги в Python. Вы можете использовать этот учебник, чтобы облегчить процесс работы с собственными данными.