Узнайте, как анализировать текст с помощью NLTK. Анализ настроений людей и классификация обзоров фильмов

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

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

Текстовая аналитика имеет множество применений в современном онлайн-мире. анализируя твиты в Твиттере, мы можем найти актуальные новости, реакцию людей на определенное событие. Amazon может понимать отзывы пользователей или обзоры определенного продукта. BookMyShow может узнать мнение людей о фильме. Youtube также может анализировать и понимать точки зрения людей на видео.

Чтобы увидеть больше таких руководств и курсов, посетите DataCamp:

В этом уроке вы затронете следующие темы:

  • Текстовая аналитика и НЛП
  • Сравните Text Analytics, NLP и Text Mining
  • Операции анализа текста с использованием NLTK
  • Токенизация
  • Стоп-слова
  • Нормализация лексикона, такая как стемминг и лемматизация
  • Маркировка POS
  • Анализ настроений
  • Текстовая классификация
  • Выполнение анализа тональности с помощью классификации текста

Текстовая аналитика и НЛП

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

НЛП позволяет компьютеру естественным образом взаимодействовать с людьми. Это помогает компьютеру понимать человеческий язык и извлекать из него смысл. НЛП применимо в нескольких проблемах, от распознавания речи, языкового перевода, классификации документов до извлечения информации. Анализ рецензий на фильмы — один из классических примеров, демонстрирующих простую модель NLP Bag-of-words. в обзорах фильмов.

Сравните Text Analytics, NLP и Text Mining

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

Первоначально опубликовано на https://www.datacamp.com/community/tutorials/text-analytics-beginners-nltk

Операции анализа текста с использованием NLTK

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

!pip install nltk
Output:
Requirement already satisfied: nltk in /home/northout/anaconda2/lib/python2.7/site-packages
Requirement already satisfied: six in /home/northout/anaconda2/lib/python2.7/site-packages (from nltk)
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
#Loading NLTK
import nltk

Токенизация

Токенизация — это первый шаг в текстовой аналитике. Процесс разбиения текстовых абзацев на более мелкие фрагменты, такие как слова или предложения, называется токенизацией. Токен — это единый объект, который является строительным блоком для предложений или абзацев.

Токенизация предложения

Токенизатор предложений разбивает текстовый абзац на предложения.

from nltk.tokenize import sent_tokenize
text="""Hello Mr. Smith, how are you doing today? The weather is great, and city is awesome.The sky is pinkish-blue. You shouldn't eat cardboard"""

tokenized_text=sent_tokenize(text)
print(tokenized_text)
Output:
['Hello Mr. Smith, how are you doing today?', 'The weather is great, and city is awesome.', 'The sky is pinkish-blue.', "You shouldn't eat cardboard"]

Здесь данный текст разбивается на предложения.

Токенизация слов

Токенизатор Word разбивает текстовый абзац на слова.

from nltk.tokenize import word_tokenize
tokenized_word=word_tokenize(text)
print(tokenized_word)

Output:
['Hello', 'Mr.', 'Smith', ',', 'how', 'are', 'you', 'doing', 'today', '?', 'The', 'weather', 'is', 'great', ',', 'and', 'city', 'is', 'awesome', '.', 'The', 'sky', 'is', 'pinkish-blue', '.', 'You', 'should', "n't", 'eat', 'cardboard']

Распределение частоты

from nltk.probability import FreqDist
fdist = FreqDist(tokenized_word)
print(fdist)

Output:
<FreqDist with 25 samples and 30 outcomes>
fdist.most_common(2)
Output:
[('is', 3), (',', 2)]
# Frequency Distribution Plot
import matplotlib.pyplot as plt
fdist.plot(30,cumulative=False)
plt.show()

Стоп-слова

Стоп-слова считаются шумом в тексте. Текст может содержать стоп-слова, такие как is, am, are, this, a, an, the и т. д.

В NLTK для удаления стоп-слов вам нужно создать список стоп-слов и отфильтровать свой список токенов из этих слов.

from nltk.corpus import stopwords
stop_words=set(stopwords.words("english"))
print(stop_words)

Output:
{'their', 'then', 'not', 'ma', 'here', 'other', 'won', 'up', 'weren', 'being', 'we', 'those', 'an', 'them', 'which', 'him', 'so', 'yourselves', 'what', 'own', 'has', 'should', 'above', 'in', 'myself', 'against', 'that', 'before', 't', 'just', 'into', 'about', 'most', 'd', 'where', 'our', 'or', 'such', 'ours', 'of', 'doesn', 'further', 'needn', 'now', 'some', 'too', 'hasn', 'more', 'the', 'yours', 'her', 'below', 'same', 'how', 'very', 'is', 'did', 'you', 'his', 'when', 'few', 'does', 'down', 'yourself', 'i', 'do', 'both', 'shan', 'have', 'itself', 'shouldn', 'through', 'themselves', 'o', 'didn', 've', 'm', 'off', 'out', 'but', 'and', 'doing', 'any', 'nor', 'over', 'had', 'because', 'himself', 'theirs', 'me', 'by', 'she', 'whom', 'hers', 're', 'hadn', 'who', 'he', 'my', 'if', 'will', 'are', 'why', 'from', 'am', 'with', 'been', 'its', 'ourselves', 'ain', 'couldn', 'a', 'aren', 'under', 'll', 'on', 'y', 'can', 'they', 'than', 'after', 'wouldn', 'each', 'once', 'mightn', 'for', 'this', 'these', 's', 'only', 'haven', 'having', 'all', 'don', 'it', 'there', 'until', 'again', 'to', 'while', 'be', 'no', 'during', 'herself', 'as', 'mustn', 'between', 'was', 'at', 'your', 'were', 'isn', 'wasn'}

Удаление стоп-слов

filtered_sent=[]
for w in tokenized_sent:
    if w not in stop_words:
         filtered_sent.append(w)
print("Tokenized Sentence:",tokenized_sent)
print("Filterd Sentence:",filtered_sent)

Output:
Tokenized Sentence: ['Hello', 'Mr.', 'Smith', ',', 'how', 'are', 'you', 'doing', 'today', '?']
Filterd Sentence: ['Hello', 'Mr.', 'Smith', ',', 'today', '?']

Нормализация лексики

Нормализация лексики рассматривается как еще один вид шума в тексте. например, соединение, соединение, соединительное слово свести к общему слову «соединять». Он сводит деривационные формы слова к общему корневому слову.

Стемминг

Стемминг — это процесс лингвистической нормализации, при котором слова сокращаются до корня слова или отсекаются производные аффиксы. например, соединение, соединение, соединительное слово свести к общему слову «соединять».

# Stemming
from nltk.stem import PorterStemmer
from nltk.tokenize import sent_tokenize, word_tokenize

ps = PorterStemmer()
stemmed_words=[]
for w in filtered_sent:
     stemmed_words.append(ps.stem(w))
print("Filtered Sentence:",filtered_sent)
print("Stemmed Sentence:",stemmed_words)

Output:
Filtered Sentence: ['Hello', 'Mr.', 'Smith', ',', 'today', '?']
Stemmed Sentence: ['hello', 'mr.', 'smith', ',', 'today', '?']

лемматизация

Лемматизация сводит слова к их основному слову, что является лингвистически правильными леммами. Он преобразует корневое слово с использованием лексики и морфологического анализа. лемматизация обычно более сложная, чем стемминг. Стеммер работает с отдельным словом без знания контекста. Например, слово «лучше» имеет в качестве своей леммы «хорошо». Эта вещь будет пропущена по корню, потому что она требует поиска в словаре.

#Lexicon Normalization
#performing stemming and Lemmatization
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.stem.porter import PorterStemmer
lem = WordNetLemmatizer()
stem = PorterStemmer()
word = "flying"
print("Lemmatized Word:",lem.lemmatize(word,"v"))
print("Stemmed Word:",stem.stem(word))

Output:
Lemmatized Word: fly
Stemmed Word: fli

Маркировка POS

Основная цель маркировки части речи (POS) состоит в том, чтобы определить грамматическую группу данного слова. Будь то СУЩЕСТВИТЕЛЬНОЕ, МЕСТОИМЕНИЕ, ПРИЛАГАТЕЛЬНОЕ, ГЛАГОЛ, НАРЕЧИЕ и т. д. в зависимости от контекста. Тегирование POS ищет отношения в предложении и присваивает слову соответствующий тег.

sent = "Albert Einstein was born in Ulm, Germany in 1879."
tokens=nltk.word_tokenize(sent)
print(tokens)
Output:
['Albert', 'Einstein', 'was', 'born', 'in', 'Ulm', ',', 'Germany', 'in', '1879', '.']
nltk.pos_tag(tokens)
Output:
[('Albert', 'NNP'),
 ('Einstein', 'NNP'),
 ('was', 'VBD'),
 ('born', 'VBN'),
 ('in', 'IN'),
 ('Ulm', 'NNP'),
 (',', ','),
 ('Germany', 'NNP'),
 ('in', 'IN'),
 ('1879', 'CD'),
 ('.', '.')]

Анализ настроений

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

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

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

В основном существует два подхода к анализу настроений.

  • На основе лексикона: подсчитайте количество положительных и отрицательных слов в заданном тексте, и чем больше количество, тем будет тональность текста.
  • Подход, основанный на машинном обучении. Разработайте модель классификации, которая обучается с использованием набора данных с предварительно размеченными положительными, отрицательными и нейтральными данными.

В этом руководстве вы будете использовать второй подход (подход, основанный на машинном обучении). Вот как вы изучаете тональность и классификацию текста на одном примере.

Текстовая классификация

Классификация текста является одной из важных задач анализа текста. Это контролируемый подход. Идентификация категории или класса данного текста, такого как блог, книга, веб-страница, новостные статьи и твиты. В современном компьютерном мире он имеет различные приложения, такие как обнаружение спама, категоризация задач в службах CRM, категоризация продуктов на веб-сайтах интернет-магазинов, классификация содержимого веб-сайтов для поисковой системы, оценка отзывов клиентов и т. д. В следующем разделе вы узнаете, как вы можете классифицировать текст в python.

Выполнение анализа тональности с помощью классификации текста

Загрузка данных

До сих пор вы изучали предварительную обработку данных с использованием NLTK. Теперь вы изучите классификацию текстов. вы будете выполнять мультиномиальную наивную байесовскую классификацию, используя scikit-learn.

В части построения модели вы можете использовать набор данных «Анализ настроений фильма, обзоры», доступный на Kaggle. Набор данных представляет собой файл, разделенный табуляцией. Набор данных имеет четыре столбца PhraseId, SentenceId, Phrase и Sentiment.

Эти данные имеют 5 меток настроений:

0 — отрицательно 1 — скорее отрицательно 2 — нейтрально 3 — скорее положительно 4 — положительно

Здесь вы можете построить модель для классификации типа сорта. Набор данных доступен на Kaggle, вы можете скачать его по следующей ссылке: https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/data

# Import pands
import pandas as pd
data=pd.read_csv('train.tsv', sep='\t')
data.head()
Output:

data.info()
Output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 156060 entries, 0 to 156059
Data columns (total 4 columns):
PhraseId      156060 non-null int64
SentenceId    156060 non-null int64
Phrase        156060 non-null object
Sentiment     156060 non-null int64
dtypes: int64(3), object(1)
memory usage: 4.8+ MB
data.Sentiment.value_counts()
Output:
2    79582
3    32927
1    27273
4     9206
0     7072
Name: Sentiment, dtype: int64
Sentiment_count=data.groupby('Sentiment').count()
plt.bar(Sentiment_count.index.values, Sentiment_count['Phrase'])
plt.xlabel('Review Sentiments')
plt.ylabel('Number of Review')
plt.show()

Генерация функций с использованием Bag of Words

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

Модель мешка слов (BoW) — это самый простой способ извлечения функций из текста. BoW преобразует текст в матрицу встречаемости слов в документе. Эта модель касается того, встречались ли данные слова в документе или нет.

Пример: Есть три документа:

Документ 1. Я люблю собак.

Документ 2. Я ненавижу собак и вязание.

Документ 3. Вязание — это мое хобби и страсть.

Теперь вы можете создать матрицу документов и слов, подсчитав количество слов в данном документе. Эта матрица известна как матрица терминов документа (DTM).

Эта матрица использует одно слово. Это может быть комбинация двух или более слов, которая называется моделью биграммы или триграммы, а общий подход называется моделью n-граммы.

Вы можете создать матрицу терминов документа, используя CountVectorizer от scikit-learn.

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer
#tokenizer to remove unwanted elements from out data like symbols and numbers
token = RegexpTokenizer(r'[a-zA-Z0-9]+')
cv = CountVectorizer(lowercase=True,stop_words='english',ngram_range = (1,1),tokenizer = token.tokenize)
text_counts= cv.fit_transform(data['Phrase'])

Разделить поезд и тестовый набор

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

Давайте разделим набор данных с помощью функции train_test_split(). вам нужно передать в основном 3 параметра: функцию, цель и размер test_set. Кроме того, вы можете использовать random_state для случайного выбора записей.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
text_counts, data['Sentiment'], test_size=0.3, random_state=1)

Построение модели и оценка

Давайте построим модель классификации текста, используя TF-IDF.

Сначала импортируйте модуль MultinomialNB и создайте объект классификатора Multinomial Naive Bayes, используя функцию MultinomialNB().

Затем подгоните вашу модель к набору поездов, используя fit(), и выполните прогнозирование тестового набора, используя предсказать().


from sklearn.naive_bayes import MultinomialNB
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Generation Using Multinomial Naive Bayes
clf = MultinomialNB().fit(X_train, y_train)
predicted= clf.predict(X_test)
print("MultinomialNB Accuracy:",metrics.accuracy_score(y_test, predicted))

Output:
MultinomialNB Accuracy: 0.604916912299

Ну, вы получили скорость классификации 60,49%, используя CountVector (или BoW), что не считается хорошей точностью. Нам нужно улучшить это.

Генерация признаков с использованием TF-IDF

В Term Frequency (TF) вы просто подсчитываете количество слов, встречающихся в каждом документе. Основная проблема с этой частотой терминов заключается в том, что она будет придавать больший вес более длинным документам. Частота терминов — это, по сути, результат модели BoW.

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

TF-IDF (частота терминов — обратная частота документа) нормализует матрицу терминов документа. Это продукт TF и ​​IDF. Слово с высоким tf-idf в документе чаще всего встречается в данных документах и ​​должно отсутствовать в других документах. Таким образом, слова должны быть словом подписи.

from sklearn.feature_extraction.text import TfidfVectorizer
tf=TfidfVectorizer()
text_tf= tf.fit_transform(data['Phrase'])

Разделенный поезд и тестовый набор (TF-IDF)

Давайте разделим набор данных с помощью функции train_test_split(). вам нужно передать в основном 3 параметра: функцию, цель и размер test_set. Кроме того, вы можете использовать random_state для случайного выбора записей.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(text_tf, data['Sentiment'], test_size=0.3, random_state=123)

Построение и оценка модели (TF-IDF)

Давайте построим модель классификации текста, используя TF-IDF.

Сначала импортируйте модуль MultinomialNB и создайте объект классификатора Multinomial Naive Bayes, используя функцию MultinomialNB().

Затем подгоните вашу модель к набору поездов, используя fit(), и выполните прогнозирование тестового набора, используя предсказать().

from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
# Model Generation Using Multinomial Naive Bayes
clf = MultinomialNB().fit(X_train, y_train)
predicted= clf.predict(X_test)
print("MultinomialNB Accuracy:",metrics.accuracy_score(y_test, predicted))

Output:
MultinomialNB Accuracy: 0.586526549618

Ну, вы получили скорость классификации 58,65% с использованием функций TF-IDF, что не считается хорошей точностью. Нам нужно повысить точность, используя какую-то другую предварительную обработку или разработку функций. Давайте предложим в поле для комментариев какой-нибудь подход для повышения точности.

Вывод

Поздравляем, вы добрались до конца этого урока!

В этом руководстве вы узнали, что такое текстовая аналитика, НЛП и интеллектуальный анализ текста? Основы операций текстовой аналитики с использованием NLTK, таких как токенизация, нормализация, стемминг, лемматизация и тегирование POS. Что такое анализ настроений и классификация текстов с использованием scikit-learn.

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

Первоначально опубликовано на https://www.datacamp.com/community/tutorials/text-analytics-beginners-nltk

Хотите изучить науку о данных, загляните на DataCamp.

Больше таких статей вы можете найти в моем блоге Machine Learning Geek.

Свяжитесь со мной в Linkedin: https://www.linkedin.com/in/avinash-navlani/