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

Вступление

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

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

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

В этом учебном пособии вы познакомитесь с использованием набора инструментов Natural Language Toolkit (NLTK) : инструмента NLP для Python.

Предпосылки

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

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

Шаг 1 — Импорт NLTK

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

  • python -c «import nltk»

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

  • python -c «import nltk; print(nltk.__version__)»

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

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

Output
  • Traceback (most recent call last): File «<string>», line 1, in <module> ImportError: No module named ‘nltk’

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

  • pip install nltk

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

Шаг 2 — Загрузка данных и Tagger 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 — это процесс маркировки слова в тексте, соответствующий определенному тегу POS: существительные, глаголы, прилагательные, наречия и т. Д. В этом уроке мы будем специально использовать NLTK averaged_perceptron_tagger. Средний теггер персептрона использует алгоритм персептрона, чтобы предсказать, какой тег 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 Streaming Stream. Полные твиты хранятся как JSON, разделенные линией . Мы можем видеть, сколько файлов JSON существует в корпусе, используя twitter_samples.fileids()метод:

twitter_samples.fileids()

Наш результат будет выглядеть следующим образом:

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

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

  • 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 с помощью ярлыка ctrlD.

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

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

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

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

Мы начнем наш скрипт на следующем шаге.

Шаг 3 — Назначение токенинга

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

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

nlp.py
from nltk.corpus import twitter_samples

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

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

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

Шаг 4 — Маркировка предложений

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

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

В NLTK аббревиатура прилагательного есть JJ.

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

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

Шаг 5 — Подсчет POS-тегов

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

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

Затем мы проверим, соответствует ли тег строке 'JJ'или 'NN'с помощью условных операторов . Если тег соответствует совпадению, мы добавим ( += 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)

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

Шаг 6 — Запуск сценария NLP

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

  • python nlp.py

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

Output
Total 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, ознакомьтесь с нашим руководством по теме «Как обрабатывать обычные текстовые файлы в Python 3» .

Вы также можете быть заинтересованы в работе с реальными данными Twitter. Вы можете узнать больше о доступе к API Twitter, прочитав « Как создать приложение Twitter ». Затем вы можете ознакомиться с нашим руководством по теме «Как создать Twitterbot с Python 3 и Tweedy Library» , в котором показано, как использовать библиотеку Tweedy Python для сбора твитов, которые включают определенный хэш-тег. Данные, которые вы собираете, затем могут быть проанализированы с помощью NLTK.

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

Заключение

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

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

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