Узнайте, как анализировать текст с помощью 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/