Как работать с языковыми данными в Python 3 с использованием набора естественных языков (NLTK)

Вступление

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

Твиты в Твиттере помогают нам находить актуальные темы новостей в мире. Отзывы на Amazon помогают пользователям приобретать товары с самым высоким рейтингом. Эти примеры организации и структурирования знаний представляют задачи обработки естественного языка (NLP).

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

Это руководство предоставит введение в использованиеNatural Language Toolkit (NLTK): инструмента НЛП для Python.

Предпосылки

Для этого урока у вас должен быть установлен Python 3, а также локальная среда программирования, настроенная на вашем компьютере. Если это не так, вы можете выполнить настройку, следуяappropriate installation and set up guide for your operating system.

Чтобы максимально использовать это руководство, вы должны иметь некоторое представление оPython programming language.

[[step-1 -—- importing-nltk]] == Шаг 1. Импорт NLTK

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

python -c "import nltk"

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

python -c "import nltk; print(nltk.__version__)"

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

If NLTK is not installed, вы получите сообщение об ошибке:

OutputTraceback (most recent call last): File "", line 1, in  ImportError: No module named 'nltk'

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

pip install nltk

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

[[step-2 -—- Download-nltk-39-s-data-and-tagger]] == Шаг 2. Загрузка данных и тегов NLTK.

В этом уроке мы будем использовать корпус Twitter, который мы можем скачать через NLTK. В частности, мы будем работать с корпусомtwitter_samples НЛТК. Давайте загрузим корпус через командную строку, вот так:

python -m nltk.downloader twitter_samples

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

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

Затем загрузите метку части речи (POS). POS tagging - это процесс обозначения слова в тексте как соответствующего определенному тегу POS: существительные, глаголы, прилагательные, наречия и т. д. В этом руководстве мы будем специально использоватьaveraged_perceptron_tagger NLTK. Средний тэгер персептрона использует алгоритм персептрона, чтобы предсказать, какой тэг POS, скорее всего, получит данное слово. Давайте скачаем тэггер, вот так:

python -m nltk.downloader averaged_perceptron_tagger

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

Output[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

В твиттерном корпусе NLTK в настоящее время содержится образец из 20 000 твитов, полученных из API потоковой передачи Twitter. Полные твиты хранятся какJSON, разделенные строками. Мы можем увидеть, сколько файлов JSON существует в корпусе, используя методtwitter_samples.fileids():

twitter_samples.fileids()

Наш вывод будет выглядеть так:

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

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

twitter_samples.strings('tweets.20150430-223406.json')

Выполнение этого вернет большой результат. Как правило, это будет выглядеть так:

Output[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, мы можем начать писать сценарий для обработки твитов.

Цель нашего скрипта - подсчитать, сколько прилагательных и существительных появляется в положительном подмножестве корпусаtwitter_samples:

  • Anoun в самом базовом определении обычно определяется как человек, место или вещь. Например, amovie, abook и aburger - все существительные. Подсчет существительных может помочь определить, сколько разных тем обсуждается.

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

Позже вы можете расширить этот скрипт для подсчета положительных прилагательных (great,awesome,happy и т. Д.) По сравнению с отрицательными прилагательными (boring,lame,sad и т. д.), которые можно использовать, например, для анализа настроения твитов или отзывов о продукте или фильме. Этот сценарий предоставляет данные, которые в свою очередь могут информировать решения, связанные с этим продуктом или фильмом.

Мы начнем наш сценарий на следующем шаге.

[[step-3 -—- tokenizing-предложения]] == Шаг 3 - Токенизация предложений

Сначала в текстовом редакторе по вашему выбору создайте сценарий, с которым мы будем работать, и назовите егоnlp.py.

В нашем файле давайте сначала импортируем корпус. Затем давайте создадимtweetsvariable и назначим емуlist строк твитов из файлаpositive_tweets.json.

nlp.py

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')

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

Tokenization - это процесс разбиения последовательности строк на части, такие как слова, ключевые слова, фразы, символы и другие элементы, которые называютсяtokens. Давайте создадим новую переменную с именемtweets_tokens, которой мы назначим токенизированный список твитов:

nlp.py

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

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

[[step-4 -—- tagging-предложения]] == Шаг 4 - Добавление тегов к предложениям

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

nlp.py

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-теге. Каждая пара токен / тег сохраняется какtuple.

В NLTK сокращение дляadjective -JJ.

Теггер NLTK отмечаетsingular nouns (NN) тегами, отличными от теговplural nouns (NNS). Для упрощения мы будем считать только существительные в единственном числе, отслеживая тегNN.

На следующем шаге мы посчитаем, сколько разJJ иNN появляются в нашем корпусе.

[[step-5 -—- counting-pos-tags]] == Шаг 5. Подсчет тегов POS

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

nlp.py

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 loops. first loop будет перебирать каждый твит в списке. second loop будет перебирать каждую пару токен / тег в каждом твите. Для каждой пары мы будем искать тег, используя соответствующий индекс кортежа.

Затем мы проверим, соответствует ли тег строке'JJ' или'NN', используяconditional statements. Если тег совпадает, мы добавим (+= 1) в соответствующий аккумулятор.

nlp.py

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

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

nlp.py

...

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 number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

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

[[step-6 -—- running-the-nlp-script]] == Шаг 6. Запуск сценария NLP

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

python nlp.py

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

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

Если ваш вывод выглядит одинаково, это означает, что вы успешно завершили этот урок. Поздравляем!

Готовый код

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

nlp.py

# 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)

В этом руководстве мы использовали корпус Twitter, загруженный через NLTK, но вы можете прочитать свои собственные данные. Чтобы ознакомиться с чтением файлов на Python, ознакомьтесь с нашим руководством по“How To Handle Plain Text Files in Python 3".

Вы также можете быть заинтересованы в работе с реальными данными Twitter. Вы можете узнать больше о доступе к Twitter API, прочитав «https://www.digitalocean.com/community/tutorials/how-to-create-a-twitter-app[Как создать приложение Twitter]». Затем вы можете ознакомиться с нашим руководством по“How To Create a Twitterbot with Python 3 and the Tweepy Library”, в котором показано, как использовать библиотеку Tweepy Python для сбора твитов, содержащих определенный хеш-тег. Собранные вами данные могут быть проанализированы с помощью NLTK.

Отсюда вы можете расширить код для подсчета существительных во множественном и единственном числе, провести анализ настроений прилагательных или визуализировать свои данные с помощьюPython and matplotlib.

Заключение

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

Related