2) Скачать и установить NLTK
В этой части мы узнаем, как выполнить настройку NLTK через терминал (командная строка в windows).
Инструкция, приведенная ниже, основана на предположении, что у вас не установлен Python. Итак, первый шаг — установить Python.
Установка Python в Windows:
Шаг 1) Перейдите по ссылке https://www.python.org/downloads/ , и выберите последнюю версию для окон.
Примечание . Если вы не хотите загружать последнюю версию, вы можете посетить вкладку загрузки и просмотреть все выпуски.
Шаг 2) Нажмите на загруженный файл
Шаг 3) Выберите «Настроить установку»
Шаг 4) Нажмите ДАЛЕЕ
Шаг 5) На следующем экране
- Выберите дополнительные параметры
- Дайте выборочную установку. В моем случае папка на диске C выбрана для удобства работы
- Нажмите Установить
Шаг 6) Нажмите кнопку «Закрыть» после завершения установки.
Шаг 7) Скопируйте путь к вашей папке Scripts.
Шаг 8) В командной строке Windows
- Перейдите к местоположению папки pip
- Введите команду для установки NLTK
pip3 install nltk
ПРИМЕЧАНИЕ : для Python2 используйте команду pip2 install nltk
Шаг 9) В меню «Пуск» Windows найдите и откройте PythonShell
Шаг 10) Вы можете проверить правильность установки, введя приведенную ниже команду
import nltk
Если вы не видите ошибки, установка завершена.
Установка NLTK в Mac / Linux
Установка NLTK в Mac / Unix требует pip менеджера пакетов python для установки nltk. Если пункт не установлен, пожалуйста, следуйте инструкциям ниже, чтобы завершить процесс
Шаг 1) Обновите индекс пакета, введя следующую команду
sudo apt update
Шаг 2) Установка pip для Python 3:
sudo apt install python3-pip
Вы также можете установить pip с помощью easy_install.
sudo apt-get install python-setuptools python-dev build-essential
Теперь easy_install установлен. Запустите приведенную ниже команду для установки pip
sudo easy_install pip
Шаг 3) Используйте следующую команду для установки NLTK
sudo pip install -U nltk sudo pip3 install -U nltk
Установка НЛТК через Анаконду
Шаг 1) Пожалуйста, установите anaconda (которая также может использоваться для установки различных пакетов), посетив https://www.anaconda.com/download/ и выберите, какую версию python вам нужно установить для anaconda.
Примечание. Обратитесь к этому руководству за подробными инструкциями по установке Anaconda.
Шаг 2) В приглашении Anaconda
conda install -c anaconda nltk
Набор данных NLTK
Модуль NLTK имеет множество доступных наборов данных, которые необходимо загрузить для использования. Более технически это называется корпус . Некоторые из примеров игнорируемых слов , Гутенберг , framenet_v15 , large_grammars и так далее.
Как скачать все пакеты НЛТК
Шаг 1) Запустите интерпретатор Python в Windows или Linux
Шаг 2)
import nltk nltk.download ()
- Открывается загруженное окно NLTK. Нажмите кнопку «Загрузить», чтобы загрузить набор данных. Этот процесс займет время, в зависимости от вашего интернет-соединения
ПРИМЕЧАНИЕ. Вы можете изменить местоположение загрузки, нажав «Файл»> «Изменить каталог загрузки».
Шаг 3) Для проверки установленных данных используйте следующий код
>>> from nltk.corpus import brown >>>brown.words()
[‘The’, ‘Fulton’, ‘County’, ‘Grand’, ‘Jury’, ‘сказали’, …]
Запуск сценария НЛП
Мы собираемся обсудить, как скрипт NLP будет выполняться на нашем локальном ПК. На рынке представлено множество библиотек для обработки естественного языка. Поэтому выбор библиотеки зависит от ваших требований. Вот список библиотек НЛП .
Как запустить скрипт NLTK
Шаг 1) В вашем любимом редакторе кода скопируйте код и сохраните файл как « NLTKsample.py »
from nltk.tokenize import RegexpTokenizer tokenizer = RegexpTokenizer(r'\w+') filterdText=tokenizer.tokenize('Hello Guru99, You have build a very good site and I love visiting your site.') print(filterdText)
Объяснение кода:
- В этой программе целью было удалить все типы знаков препинания из данного текста. Мы импортировали «RegexpTokenizer», который является модулем NLTK. Он удаляет все выражения, символы, символы, цифры или все, что вы хотите.
- Вы только что передали регулярное выражение в модуль «RegexpTokenizer».
- Далее мы токенизировали слово с помощью модуля «токенизировать». Вывод сохраняется в переменной filterdText.
- И распечатал их, используя «print ()».
Шаг 2) В командной строке
- Перейдите к месту, где вы сохранили файл
- Запустите команду Python NLTKsample.py
Это покажет вывод как:
[‘Hello’, ‘Guru99’, ‘You’, ‘have’, ‘build’, ‘a’, ‘very’, ‘good’, ‘site’, ‘and’, ‘I’, ‘love’, ‘ посещая ‘,’ ваш ‘,’ сайт ‘]
Руководство по NLTK с использованием Python
Библиотека NLTK в Python – одна из лучших библиотек Python для любой задачи обработки естественного языка. Она предоставляет множество полезных функций для обработки текстов, включая токенизацию, выделение корней, теги, синтаксический анализ и многие другие вещи, необходимые для создания моделей машинного обучения для любого приложения обработки естественного языка. В этой статье я познакомлю вас с NLTK и ее использованием с помощью Python.
Что такое NLTK в Python?
NLTK – это библиотека Python, которую можно использовать в любом приложении для обработки естественного языка. От преобразования текстовых данных до создания приложения на основе NLP, такого как анализатор настроений, распознавание именованных сущностей и т. д. Все это можно сделать с помощью библиотеки NLTK в Python. Поскольку это ведущий фреймворк в Python для создания приложений NLP, библиотеку NLTK используют в своих приложениях известные компании, например:
- Shelf
- Quezx
- Autonom8
- Botanalytics
- Bunch
- Tech Stacks и многие другое.
Чтобы создать приложение NLP с помощью библиотеки NLTK в Python, у вас должен быть Python версии 3.5 или выше. Вы можете легко установить эту библиотеку с помощью команды pip; pip install nltk. Теперь в разделе ниже я покажу вам руководство по NLTK с использованием Python.
NLTK в Python (Руководство)
Перед созданием любого приложения, основанного на обработке естественного языка, нам необходимо обработать данные, которые мы используем. Ниже приведены некоторые шаги, которые всегда необходимы при создании приложения NLP:
- Токенизация: разделение фрагмента текста на токены или слова называется токенизацией.
- Удаление стоп-слов: стоп-слова – это самые распространенные слова в любом языке. Нет правильного определения игнорируемых слов, вы можете думать об этих словах как о словах, которые используются для создания значимого предложения. Например, такие слова, как «the», «is», «a», «as», представляют собой определенный тип стоп-слов, которые необходимо удалить из текстовых данных, которые вы используете, иначе это может повлиять на производительность вашей модели.
Ниже показано, как можно выполнить задачу токенизации и удаления стоп-слов с помощью библиотеки NLTK в Python:
import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize nltk.download('stopwords') nltk.download('punkt') text = "Hi, My name is Aman Kharwal, I am here to guide you to your journey in Machine Learning for free." tokens = word_tokenize(text) tokenization = [word for word in tokens if not word in stopwords.words('english')] print(tokens) print(tokenization)
Помимо токенизации и удаления стоп-слов, вам еще предстоит выполнить множество задач по подготовке текстовых данных для создания приложения на основе обработки естественного языка. Но эти задачи зависят от типа приложения, над которым вы работаете, а токенизация и удаление стоп-слов необходимы при работе с текстовыми данными всегда.
Резюме
Я надеюсь, что эта статья о библиотеке NLTK в Python помогла вам понять, почему эта библиотека в Python так популярна. Короче говоря, если вы хотите создать приложение любого типа на основе обработки естественного языка, вы можете использовать ее в любой задаче от базовой обработки текста до создания модели машинного обучения. Надеюсь, вам понравилась эта статья о библиотеке NLTK в Python.
Обработка языковых данных в Python 3 с помощью NLTK
Сегодня текст является одной из наиболее распространенных форм общения. Люди ежедневно общаются по электронной почте или в социальных сетях, пишут текстовые сообщения и обновляют статусы. В результате такого взаимодействия неструктурированных текстовых данных становится чрезвычайно много; сегодня основным способом понять, что и о чём думают люди, является анализ больших объемов текстовых данных.
Твиты в 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 «», line 1, in 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 с помощью терминала.
Теперь импортируйте корпус 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 файлов:
Эта команда вернёт объемный вывод, вот его фрагмент:
[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’)
Читайте также:
- Использование переменных в Python 3
- Работа со списками в Python 3
При первой загрузке списка твитов каждый твит представлен в виде одной строки. Прежде чем сценарий сможет отличить прилагательные и существительные, нужно разметить твиты.
Токенизация – это процесс разбиения последовательности строк на части: на слова, ключевые слова, фразы, символы и другие элементы, которые называются токенами. Создайте новую переменную, 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):
[(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. Для простоты работы сценарий будет считать только имена существительные в единственном числе.
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 и запустите сценарий.
Подсчёт займет некоторое время. В результате на экране появится:
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-теги. Созданный в руководстве сценарий можно использовать в качестве шаблона для написания более сложных сценариев.
Анализ текстовых данных с помощью NLTK и Python
NLTK предлагает удобные инструменты для множества задач NLP: токенизация, стемминг, лемматизация, морфологический и синтаксический анализ, а также анализ настроений. Библиотека идеально подходит как для начинающих, так и для опытных разработчиков, предоставляя интуитивно понятный интерфейс и обширную документацию.
В NLTK включены корпуса текстов и словарные ресурсы, такие как WordNet, позволяющие работать с огромным объемом текстовых данных. Это делает NLTK мощным инструментом для анализа и обработки текста на разных языках.
NLTK — это свободно распространяемая библиотека Python, разработанная для работы с человеческим языком. Это комплексный набор инструментов, предназначенный для символьной и статистической обработки естественного языка. Она предоставляет легкий доступ к более чем 50 корпусам текстов и лексическим ресурсам, таким как WordNet, а также набор библиотек для классификации, токенизации, стемминга, метки частей речи, синтаксического анализа и семантического рассуждения.
Быстренько установим. (подразумевается, что у вас уже есть питон)
Откройте командную строку или терминал и выполните следующую команду:
pip install nltk
NLTK предоставляет доступ к множеству текстовых корпусов и предварительно обученных моделей, которые могут быть полезны в различных задачах NLP. Эти данные не устанавливаются автоматически с библиотекой, поэтому их нужно загрузить отдельно. Для этого используйте следующий код:
import nltk nltk.download('popular')
Команда nltk.download(‘popular’) загружает наиболее часто используемые корпуса и модели. Если вам требуются конкретные ресурсы, вы можете загрузить их, заменив ‘popular’ на соответствующее название. Например, для загрузки WordNet используйте nltk.download(‘wordnet’) .
Если вы видите список английских стоп-слов, значит, библиотека NLTK установлена правильно.
Техники предварительной обработки текста в NLP с использованием NLTK
Токенизация
Токенизация — это процесс разбиения текста на более мелкие части, такие как слова или предложения. Это первый шаг в анализе текста, который позволяет преобразовать непрерывный текст в дискретные элементы, с которыми можно работать отдельно. Этот процесс помогает в выявлении ключевых слов и фраз, а также в упрощении последующего анализа текста.
-
В NLTK можно применять так:
Разбиение на слова:
import nltk nltk.download('punkt')
Этот код загрузит необходимые данные punkt , которые используются для токенизации текста.
from nltk.tokenize import word_tokenize text = "NLTK упрощает обработку текста." word_tokens = word_tokenize(text) print(word_tokens)
from nltk.tokenize import sent_tokenize text = "OTUS. Наш сайт https://otus.ru/." sentence_tokens = sent_tokenize(text) print(sentence_tokens)
Токенизация полезна в задачах, где необходимо анализировать отдельные слова или фразы, например, при определении ключевых слов в тексте, анализе частотности слов или при обучении моделей машинного обучения для классификации текста.
Удаление стоп-слов
Стоп-слова — это общеупотребительные слова в языке, которые обычно несут мало смысловой нагрузки (например, «и», «в», «на»). Их удаление позволяет сократить объем данных для анализа и сосредоточиться на более значимых словах, что повышает точность и эффективность обработки текста.
-
Примеры кода:
Фильтрация стоп-слов на русском языке: Нужно загрузить данные stopwords с помощью NLTK Downloader. Это делается так:
import nltk nltk.download('stopwords')
from nltk.corpus import stopwords from nltk.tokenize import word_tokenize text = "NLTK помогает в удалении стоп-слов из текста." tokens = word_tokenize(text) stop_words = set(stopwords.words('russian')) filtered_tokens = [word for word in tokens if word not in stop_words] print(filtered_tokens)
text = "NLTK helps in removing stopwords from the text." tokens = word_tokenize(text) filtered_tokens = [word for word in tokens if not word in stopwords.words('english')] print(filtered_tokens)
Удаление стоп-слов часто юзается в задачах обработки текста, таких как анализ настроений, классификация текстов, создание облаков слов и в информационном поиске, где важно выделить ключевую информацию из текста.
Стемминг
Стемминг — это процесс сведения слов к их основной (корневой) форме, удаляя окончания и суффиксы. Это помогает уменьшить сложность текста и улучшить производительность алгоритмов анализа.
-
Примеры кода:
Стемминг на английском языке:
from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize stemmer = PorterStemmer() text = "The stemmed form of leaves is leaf" tokens = word_tokenize(text) stemmed_words = [stemmer.stem(word) for word in tokens] print(stemmed_words)
from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("russian") text = "Листовые листочки лист листва листве почему так" tokens = word_tokenize(text) stemmed_words = [stemmer.stem(word) for word in tokens] print(stemmed_words)
Стемминг наиболее полезен в задачах, где важно уменьшить разнообразие словоформ, например, при индексации текста для поисковых систем, в аналитике текстов большого объема и при обучении моделей машинного обучения для классификации или кластеризации текстов.
Лемматизация
В отличие от стемминга, лемматизация сводит слова к их лемме — это более сложный процесс, который учитывает морфологический анализ слов. Лемматизация более точно обрабатывает слова, приводя их к словарной форме.
-
Примеры кода:
Лемматизация на английском языке: Нужно загрузить данные omw-1.4 с помощью NLTK Downloader:
import nltk nltk.download('omw-1.4')
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize lemmatizer = WordNetLemmatizer() text = "The lemmatized form of leaves is leaf" tokens = word_tokenize(text) lemmatized_words = [lemmatizer.lemmatize(word) for word in tokens] print(lemmatized_words)
stemmer = SnowballStemmer("russian") text = "Лемматизированная форма слова листья это лист" tokens = word_tokenize(text) lemmatized_words = [stemmer.stem(word) for word in tokens] print(lemmatized_words)
Лемматизация важна в задачах, где требуется высокая точность обработки текста, таких как машинный перевод, семантический анализ текста и создание систем вопросов-ответов, где важно точно понимать значение слов в контексте.
Анализ настроений
Анализ настроений, иногда называемый «определением тональности», включает использование NLP, статистических или машинно-обученных алгоритмов для изучения, идентификации и извлечения информации о настроениях из текстов. Он может быть столь же простым, как определение положительной или отрицательной окраски отзыва, или настолько сложным, как определение более тонких эмоциональных состояний, таких как ирония или разочарование.
Анализ настроений не без проблем. Одна из основных сложностей заключается в интерпретации сарказма, иронии и фигуративного языка. Например, фраза «Ну да, конечно, мне очень понравилось, когда мой телефон перестал работать» на самом деле выражает разочарование, хотя на первый взгляд может показаться положительной. Распознавание таких тонкостей требует продвинутых алгоритмов и, часто, контекстуального анализа.
Анализ настроений (или сентимент-анализ) в NLTK часто сводится к классификации текста на позитивный или негативный. Чтобы реализовать анализ настроений, можно использовать разные подходы.
Простая классификация с использованием предварительно обученных данных
import nltk from nltk.sentiment import SentimentIntensityAnalyzer nltk.download('vader_lexicon') sia = SentimentIntensityAnalyzer() text = "NLTK is amazing for natural language processing!" print(sia.polarity_scores(text))
Классификация с использованием настраиваемых тренировочных данных
import nltk from nltk.classify import NaiveBayesClassifier from nltk.corpus import subjectivity from nltk.sentiment import SentimentAnalyzer from nltk.sentiment.util import * nltk.download('subjectivity') n_instances = 100 subj_docs = [(sent, 'subj') for sent in subjectivity.sents(categories='subj')[:n_instances]] obj_docs = [(sent, 'obj') for sent in subjectivity.sents(categories='obj')[:n_instances]] train_subj_docs = subj_docs[:80] test_subj_docs = subj_docs[80:100] train_obj_docs = obj_docs[:80] test_obj_docs = obj_docs[80:100] training_docs = train_subj_docs+train_obj_docs testing_docs = test_subj_docs+test_obj_docs sentim_analyzer = SentimentAnalyzer() all_words_neg = neg_tagged_word_feats(sentim_analyzer.all_words(training_docs), mark_negation=True) unigram_feats = sentim_analyzer.unigram_word_feats(all_words_neg, min_freq=4) sentim_analyzer.add_feat_extractor(extract_unigram_feats, unigrams=unigram_feats) training_set = sentim_analyzer.apply_features(training_docs) test_set = sentim_analyzer.apply_features(testing_docs) trainer = NaiveBayesClassifier.train classifier = sentim_analyzer.train(trainer, training_set) for key,value in sorted(sentim_analyzer.evaluate(test_set).items()): print(': '.format(key, value))
Использование TextBlob для анализа настроений
from textblob import TextBlob import nltk nltk.download('movie_reviews') nltk.download('punkt') text = "I love NLTK. It's incredibly helpful!" blob = TextBlob(text) print(blob.sentiment)
Анализ настроений с использованием токенизатора и списка стоп-слов
from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.sentiment import SentimentIntensityAnalyzer import nltk nltk.download('stopwords') nltk.download('vader_lexicon') stop_words = set(stopwords.words('english')) text = "NLTK is not bad for learning NLP." filtered_text = ' '.join([word for word in word_tokenize(text) if not word in stop_words]) sia = SentimentIntensityAnalyzer() print(sia.polarity_scores(filtered_text))
Комбинирование лемматизации и анализа настроений
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk.sentiment import SentimentIntensityAnalyzer import nltk nltk.download('wordnet') nltk.download('vader_lexicon') lemmatizer = WordNetLemmatizer() text = "The movie was not good. The plot was terrible!" lemmatized_text = ' '.join([lemmatizer.lemmatize(word) for word in word_tokenize(text)]) sia = SentimentIntensityAnalyzer() print(sia.polarity_scores(lemmatized_text))
Важно отметить, что для корректной работы некоторых примеров может потребоваться установка дополнительных библиотек, таких как textblob .
Модель «Мешок слов» (Bag of Words, BoW) является основным методом представления текстовых данных в обработке естественного языка (Natural Language Processing, NLP). Она преобразует текст в числовой вектор, где каждое слово в тексте представляется количеством его появлений.
Модель BoW
В модели BoW текст (например, предложение или документ) представляется в виде «мешка» его слов, не учитывая грамматику и порядок слов, но сохраняя мультиплицивность. Это преобразование текста в набор чисел позволяет использовать стандартные методы машинного обучения, которые работают на числовых данных.
Каждое уникальное слово в тексте соответствует определенному индексу (или «слоту») в векторе. Если слово встречается в тексте, то в соответствующем слоте вектора записывается количество его появлений. Например, текст «яблоко банан яблоко» превратится в вектор [2, 1], если индекс 0 соответствует слову «яблоко», а индекс 1 — слову «банан».
В анализе настроений модель BoW используется для преобразования текстовых данных в формат, пригодный для алгоритмов машинного обучения. Так, текстовые данные (например, отзывы пользователей) преобразуются в числовые векторы, на которых можно обучать классификаторы для определения, например, позитивного или негативного отношения.
Создание BoW с NLTK и использование его для классификации
import nltk from nltk.tokenize import word_tokenize from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score nltk.download('punkt') # Пример данных texts = ["I love this product", "This is a bad product", "I dislike this", "This is the best!"] labels = [1, 0, 0, 1] # 1 - позитивный, 0 - негативный # Токенизация tokens = [word_tokenize(text) for text in texts] # Создание BoW модели vectorizer = CountVectorizer() bow = vectorizer.fit_transform([' '.join(token) for token in tokens]) # Разделение данных на обучающую и тестовую выборку X_train, X_test, y_train, y_test = train_test_split(bow, labels, test_size=0.3) # Обучение классификатора classifier = MultinomialNB() classifier.fit(X_train, y_train) # Оценка классификатора predictions = classifier.predict(X_test) print("Accuracy:", accuracy_score(y_test, predictions))
Пример 2: Простой анализ настроений с BoW и NLTK
import nltk from nltk.corpus import movie_reviews from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score nltk.download('movie_reviews') # Загрузка данных documents = [(list(movie_reviews.words(fileid)), category) for category in movie_reviews.categories() for fileid in movie_reviews.fileids(category)] random.shuffle(documents) # Подготовка данных texts = [' '.join(doc) for doc, _ in documents] labels = [1 if category == 'pos' else 0 for _, category in documents] # Создание BoW модели vectorizer = CountVectorizer() bow = vectorizer.fit_transform(texts) # Разделение данных на обучающую и тестовую выборку X_train, X_test, y_train, y_test = train_test_split(bow, labels, test_size=0.3) # Обучение классификатора classifier = MultinomialNB() classifier.fit(X_train, y_train) # Оценка классификатора predictions = classifier.predict(X_test) print("Accuracy:", accuracy_score(y_test, predictions))
BoW служит мостом между текстовыми данными и числовыми методами.
NLTK с его легкостью использования делают его идеальным выбором для широкого спектра задач обработки текстовых данных.
Более подробно с NLTK можно ознакомиться здесь.
А практические навыки по аналитике вы можете получить от экспертов отрасли в рамках онлайн-курсов от моих коллег из OTUS. Подробнее в каталоге.