Обработка языковых данных в Python 3 с помощью NLTK

Published by Leave your thoughts

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

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

NLP (Natural Language Processing, обработка естественного языка) – это область вычислительных наук, которая изучает взаимодействие между компьютером и человеком. Техники, разработанные NLP, используются для анализа текста, предоставляя компьютерам возможность понять человеческий язык. NLP используется в автоматическом суммировании и анализе тональности высказываний.

Данное руководство ознакомит вас с инструментом NLP для Python, который называется Natural Language Toolkit (NLTK).

Требования

  • Предварительно установленный Python 3;
  • Базовые навыки работы с языком программирования Python.

Дополнительные инструкции по работе с Python 3 можно найти в этом разделе нашего Информатория.

1: Импортирование NLTK

Для начала нужно установить модуль NLTK.

Чтобы узнать, установлен ли модуль NLTK, запустите команду:

python -c "import nltk"

Если инструмент NLTK установлен, команда будет выполнена без ошибок. После этого нужно обновить модуль до последней версии:

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

Теперь у вас будет версия 3.2.1 (пакет NLTK от Twitter требует именно эту версию).

Если модуль NLTK не установлен, команда выдаст ошибку:

Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'

В таком случае просто загрузите библиотеку с помощью pip:

pip install nltk

2: Загрузка данных и разметчика NLTK

В данном руководстве мы попробуем загрузить с помощью NLTK корпус данных Twitter под названием twitter_samples. Загрузите корпус:

python -m nltk.downloader twitter_samples

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

[nltk_data] Downloading package twitter_samples to
[nltk_data]     /Users/8host/nltk_data...
[nltk_data]   Unzipping corpora/twitter_samples.zip.

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

python -m nltk.downloader averaged_perceptron_tagger

Команда должна вернуть:

[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     /Users/8host/nltk_data...
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.

Убедитесь в том, что корпус загружен правильно. Откройте интерактивную среду Python с помощью терминала.

python

Теперь импортируйте корпус twitter_samples:

from nltk.corpus import twitter_samples

Данный корпус содержит около 20 000 твитов, извлеченных из Twitter Streaming API. Твиты хранятся в виде отдельных строках в JSON.

Читайте также: Основы работы с JSON

Чтобы узнать, сколько JSON-файлов хранится в корпусе, используйте метод twitter_samples.fileids():

twitter_samples.fileids()
[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']

Чтобы запросить строку, используйте ID файлов:

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

Читайте также: Основы работы со строками в Python 3

Эта команда вернёт объемный вывод, вот его фрагмент:

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

Целью сценария будет подсчет имен прилагательных и существительных в корпусе.

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

3: Токенизация

Создайте файл для сценария в текстовом редакторе (файл называется nlp.py).

Импортируйте корпус в файл. Затем создайте переменную tweets и присвойте ей список строк твитов из файла positive_tweets.json

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

Читайте также:

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

Токенизация – это процесс разбиения последовательности строк на части: на слова, ключевые слова, фразы, символы и другие элементы, которые называются токенами. Создайте новую переменную, 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 содержит список токенов. Каждому токену можно присвоить тег.

4: Присвоение тегов

Импортируйте разметчик NLTK. Все выражения импортирования должны находиться в начале сценария.

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-тег. Пары токенов и тегов можно сохранить в виде кортежа.

Читайте также: Типы данных в Python 3

В NLTK имя прилагательное помечается как JJ. NLTK помечает имена существительные в единственном числе как NN, а во множественном – NNS. Для простоты работы сценарий будет считать только имена существительные в единственном числе.

5: Подсчёт тегов

Теперь нужно посчитать POS-теги JJ и NN. Добавьте счётчик в конец сценария и присвойте ему значение 0:

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. Первый будет итерировать каждый твит в списке, а второй – все пары токенов и тегов в твите. При этом нужно использовать индексы кортежа.

После этого нужно проверить, соответствует ли тег строке ‘JJ’ или ‘NN'; это делается с помощью условных операторов. Если тег совпадает, в счетчик выполнит (+= 1).

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

Теперь программа может считать прилагательные и существительные.

6: Запуск сценария 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)

В руководстве был использован корпус Twitter, загруженный с помощью NLTK, но вы можете добавить свои данные.

Читайте также:

Заключение

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

Tags: ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>