Обработка языковых данных в Python 3 с помощью NLTK
Python | Комментировать запись
Сегодня текст является одной из наиболее распространенных форм общения. Люди ежедневно общаются по электронной почте или в социальных сетях, пишут текстовые сообщения и обновляют статусы. В результате такого взаимодействия неструктурированных текстовых данных становится чрезвычайно много; сегодня основным способом понять, что и о чём думают люди, является анализ больших объемов текстовых данных.
Твиты в 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, но вы можете добавить свои данные.
Читайте также:
- Работа с текстовыми файлами в Python 3
- Создание приложения Twitter
- Визуализация данных Python 3 с помощью matplotlib
Заключение
В этом руководстве вы познакомились с некоторыми методами обработки естественного языка и научились анализировать текст с помощью библиотеки NLTK в Python. Теперь вы можете загрузить другие корпусы, разметить их, проставить теги и подсчитать POS-теги. Созданный в руководстве сценарий можно использовать в качестве шаблона для написания более сложных сценариев.
Tags: NLTK, Python 3