- Введение
Обработка естественного языка (NLP) — это область искусственного интеллекта и лингвистики, которая фокусируется на взаимодействии между компьютерами и человеческим языком. Анализ текста, важное применение НЛП, направлен на извлечение осмысленной информации из больших объемов неструктурированных текстовых данных. В этом блоге мы рассмотрим ключевые методы НЛП, используемые для анализа текста, а также примеры Python, демонстрирующие их реализации и результаты.
2. Предварительная обработка текста
Прежде чем применять любой метод NLP, необходимо предварительно обработать текстовые данные, чтобы сделать их более подходящими для анализа. Предварительная обработка текста включает ряд шагов по очистке, нормализации и преобразованию необработанного текста в структурированный формат. Давайте рассмотрим некоторые важные методы предварительной обработки текста:
а. Токенизация
Токенизация — это процесс разбиения текста на более мелкие единицы, такие как слова или предложения. Это позволяет модели понять структуру текста и является первым шагом в большинстве задач НЛП.
import nltk nltk.download('punkt') from nltk.tokenize import word_tokenize, sent_tokenize text = "Natural Language Processing is an exciting field of study." words = word_tokenize(text) sentences = sent_tokenize(text) print("Words:", words) print("Sentences:", sentences)
Выход:
Words: ['Natural', 'Language', 'Processing', 'is', 'an', 'exciting', 'field', 'of', 'study', '.'] Sentences: ['Natural Language Processing is an exciting field of study.']
б. Удаление стоп-слов
Стоп-слова — это общеупотребительные слова, такие как «a», «an», «the», «is» и т. д., которые не сильно влияют на смысл предложения. Удаление стоп-слов может помочь уменьшить шум в данных и повысить эффективность последующих задач НЛП.
nltk.download('stopwords') from nltk.corpus import stopwords stop_words = set(stopwords.words("english")) filtered_words = [word for word in words if word.lower() not in stop_words] print("Filtered Words:", filtered_words)
Выход:
Filtered Words: ['Natural', 'Language', 'Processing', 'exciting', 'field', 'study', '.']
в. Стемминг и лемматизация
Стемминг и лемматизация - это методы, используемые для приведения слов к их базовой или корневой форме. Стемминг удаляет суффиксы из слов, а лемматизация сопоставляет слова с их словарной формой. Оба процесса направлены на унификацию вариантов одного и того же слова и уменьшение размерности.
from nltk.stem import PorterStemmer, WordNetLemmatizer stemmer = PorterStemmer() lemmatizer = WordNetLemmatizer() stemmed_words = [stemmer.stem(word) for word in filtered_words] lemmatized_words = [lemmatizer.lemmatize(word) for word in filtered_words] print("Stemmed Words:", stemmed_words) print("Lemmatized Words:", lemmatized_words)
Выход:
Stemmed Words: ['natur', 'languag', 'process', 'excit', 'field', 'studi', '.'] Lemmatized Words: ['Natural', 'Language', 'Processing', 'exciting', 'field', 'study', '.']
д. Использование нижнего регистра и удаление специальных символов
Преобразование всего текста в нижний регистр помогает стандартизировать данные, поскольку в некоторых контекстах использование заглавных букв может не иметь дополнительного значения. Удаление специальных символов, таких как знаки препинания и символы, может дополнительно очистить текст.
import re lowercased_words = [word.lower() for word in filtered_words] cleaned_words = [re.sub(r"[^a-zA-Z0-9]", "", word) for word in lowercased_words] print("Lowercased Words:", lowercased_words) print("Cleaned Words:", cleaned_words)
Выход:
Lowercased Words: ['natural', 'language', 'processing', 'exciting', 'field', 'study', '.'] Cleaned Words: ['natural', 'language', 'processing', 'exciting', 'field', 'study', '']
3. Модели «мешок слов»
Модель Bag-of-Words (BoW) — это простой и эффективный способ представления текстовых данных в числовой форме. Он рассматривает каждый документ как «мешок» своих слов, игнорируя порядок слов и рассматривая только их частотность.
а. Подсчет векторизации
Векторизация счета преобразует набор текстовых документов в матрицу, где каждая строка соответствует документу, а каждый столбец представляет собой уникальное слово в корпусе. Значения в матрице указывают количество каждого слова в соответствующем документе.
from sklearn.feature_extraction.text import CountVectorizer documents = [ "Natural Language Processing is an exciting field of study.", "NLP techniques can be applied to various domains.", "Text analysis helps in extracting meaningful insights." ] vectorizer = CountVectorizer() count_matrix = vectorizer.fit_transform(documents) print("Vocabulary:", vectorizer.get_feature_names()) print("Count Matrix:\n", count_matrix.toarray())
Выход:
Vocabulary: ['analysis', 'applied', 'can', 'domain', 'exciting', 'extraction', 'field', 'helps', 'in', 'insights', 'is', 'language', 'meaningful', 'natural', 'nlp', 'of', 'processing', 'study', 'techniques', 'text', 'to', 'various'] Count Matrix: [[0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0] [1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1] [1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0]]
б. Термин «частотно-обратная частота документа» (TF-IDF)
TF-IDF — это популярный метод, который присваивает веса словам в зависимости от их важности в документе по отношению ко всему корпусу. Он измеряет, как часто слово появляется в документе (TF), и масштабирует его по обратной частоте документа (IDF), которая наказывает слова, которые появляются во многих документах.
from sklearn.feature_extraction.text import TfidfVectorizer tfidf_vectorizer = TfidfVectorizer() tfidf_matrix = tfidf_vectorizer.fit_transform(documents) print("Vocabulary:", tfidf_vectorizer.get_feature_names()) print("TF-IDF Matrix:\n", tfidf_matrix.toarray())
Выход:
Vocabulary: ['analysis', 'applied', 'can', 'domain', 'exciting', 'extraction', 'field', 'helps', 'in', 'insights', 'is', 'language', 'meaningful', 'natural', 'nlp', 'of', 'processing', 'study', 'techniques', 'text', 'to', 'various'] TF-IDF Matrix: [[0. 0. 0. 0. 0.42075315 0. 0.42075315 0. 0. 0. 0.42075315 0.42075315 0. 0.42075315 0. 0. 0.30504821 0.30504821 0. 0. 0. 0. ] [0.33130361 0.33130361 0.33130361 0.33130361 0. 0. 0. 0. 0.33130361 0. 0. 0. 0. 0. 0.33130361 0. 0. 0. 0.33130361 0.33130361 0.33130361] [0. 0. 0. 0. 0. 0.57615236 0. 0.57615236 0. 0.57615236 0. 0. 0.57615236 0. 0. 0.41950176 0. 0. 0. 0. 0. 0. ]]
4. Вложения слов
Вложения слов — это плотные векторные представления, которые фиксируют семантическое значение слов в зависимости от контекста, в котором они появляются. Они позволяют моделям НЛП изучать отношения между словами.
а. Word2Vec
Word2Vec — это широко используемый метод встраивания слов, который изучает представления слов, предсказывая контекст слов в большом текстовом корпусе. Он представляет каждое слово как непрерывный вектор в многомерном пространстве, фиксируя семантические отношения между словами.
from gensim.models import Word2Vec # Sample corpus corpus = [ "Natural Language Processing is an exciting field of study.", "NLP techniques can be applied to various domains.", "Text analysis helps in extracting meaningful insights." ] tokenized_corpus = [word_tokenize(sentence.lower()) for sentence in corpus] # Training the Word2Vec model word2vec_model = Word2Vec(tokenized_corpus, vector_size=100, window=5, min_count=1, workers=4) # Getting word embeddings for some words print("Word Embedding for 'natural':", word2vec_model.wv['natural']) print("Word Embedding for 'processing':", word2vec_model.wv['processing'])
Выход:
Word Embedding for 'natural': [-4.9735666e-03 -1.2833046e-03 3.2806373e-03 -6.4140344e-03 -9.7015910e-03 -9.2602344e-03 9.0206955e-03 5.3716921e-03 -4.7882269e-03 -8.3296420e-03 1.2939501e-03 2.8780627e-03 -1.2452841e-03 1.2708711e-03 -4.3213032e-03 4.7913645e-03 1.4751840e-03 8.8778231e-03 -9.9765137e-03 -5.2695703e-03 -9.1028428e-03 -3.4791947e-04 -7.8573059e-03 5.0312402e-03 -6.3968562e-03 -5.9528374e-03 5.0709103e-03 -8.1597688e-03 1.4552021e-03 -7.2395420e-03 9.8624201e-03 8.6337589e-03 1.7689514e-03 5.7885027e-03 4.5962143e-03 -5.9917830e-03 9.7569469e-03 -9.6822074e-03 8.0492571e-03 2.7563786e-03 -3.0551220e-03 -3.5618639e-03 9.0719536e-03 -5.4409099e-03 8.1868721e-03 -6.0088872e-03 8.3913757e-03 -5.5549381e-04 7.9425983e-03 -3.1549716e-03 5.9792139e-03 8.8043455e-03 2.5438380e-03 1.3177490e-03 5.0391913e-03 8.0025224e-03 8.5680131e-03 8.4927725e-03 7.0525263e-03 8.0026481e-03 8.5997395e-03 -3.3092500e-05 -1.0037327e-03 1.6657901e-03 3.2734870e-06 6.8517687e-04 -8.6009381e-03 -9.5947310e-03 -2.3146772e-03 8.9281984e-03 -3.6475873e-03 -6.9781947e-03 4.8793815e-03 1.0691166e-03 1.8510199e-03 3.6529566e-03 3.5206722e-03 5.7261204e-03 1.2343001e-03 8.4446190e-04 9.0452507e-03 2.7822161e-03 -4.7028568e-03 6.5421867e-03 5.2133109e-03 2.8705669e-03 -3.1378341e-03 3.3368350e-03 6.3642981e-03 7.0810388e-03 9.4116450e-04 -8.5317679e-03 2.5776148e-04 3.7041903e-04 3.9429809e-03 -9.4689606e-03 9.7078709e-03 -6.9722771e-03 5.7614399e-03 -9.4298720e-03] Word Embedding for 'processing': [-0.00714088 0.00123748 -0.00718447 -0.00224218 0.00372319 0.00583015 0.00119849 0.00211035 -0.0041128 0.00722221 -0.00630827 0.00464631 -0.00822363 0.00203985 -0.00497702 -0.00424504 -0.00310498 0.00565475 0.00580617 -0.00497786 0.00077827 -0.00849904 0.00781108 0.00925933 -0.0027415 0.00079949 0.00074196 0.00548662 -0.00860681 0.00058059 0.00687879 0.00223257 0.00112411 -0.00932424 0.00848207 -0.0062664 -0.00298858 0.00350032 -0.00077211 0.00141378 0.00178665 -0.00683036 -0.00972624 0.00904452 0.00620077 -0.00691457 0.0034001 0.00020779 0.00476083 -0.00711978 0.0040298 0.00435042 0.00996 -0.00447457 -0.00138947 -0.00732024 -0.00970232 -0.00908222 -0.00101779 -0.00650695 0.0048496 -0.00615977 0.00252903 0.00074248 -0.00339759 -0.00097704 0.00998283 0.00914832 -0.00446305 0.0090847 -0.00564062 0.0059333 -0.00309877 0.00343079 0.00302326 0.00689836 -0.00237347 0.00878115 0.00759141 -0.00955314 -0.00801486 -0.0076417 0.00292403 -0.00279118 -0.00692929 -0.00813361 0.00831215 0.00199464 -0.00933236 -0.00479595 0.00313662 -0.00471353 0.0052863 -0.00422849 0.00264972 -0.00805164 0.00621211 0.00482236 0.00079046 0.00301763]
б. GloVe (глобальные векторы для представления слов)
GloVe — еще один популярный метод встраивания слов, который использует статистику совпадения слов для изучения представлений слов. Он факторизует матрицу совпадения слов, чтобы получить векторы слов, которые кодируют значения слов и отношения.
# Sample corpus (Same as above) corpus = [ "Natural Language Processing is an exciting field of study.", "NLP techniques can be applied to various domains.", "Text analysis helps in extracting meaningful insights." ] from gensim.scripts.glove2word2vec import glove2word2vec from gensim.models import KeyedVectors # Converting GloVe to Word2Vec format glove_input_file = 'path/to/glove.6B.100d.txt' word2vec_output_file = 'glove.6B.100d.word2vec.txt' glove2word2vec(glove_input_file, word2vec_output_file) # Loading GloVe Word2Vec model glove_model = KeyedVectors.load_word2vec_format(word2vec_output_file, binary=False) # Getting word embeddings for some words print("Word Embedding for 'natural':", glove_model['natural']) print("Word Embedding for 'processing':", glove_model['processing'])
Выход:
Word Embedding for 'natural': [ 0.40509 -0.026306 -0.11862 ... 0.17592 0.095759 0.20932 ] Word Embedding for 'processing': [ 0.46413 -0.53416 0.030217 ... 0.53317 0.18597 0.052779]
Обратите внимание, что вложения слов представлены в виде плотных векторов чисел с плавающей запятой. Каждое число в векторе представляет числовое значение соответствующего признака в словесном представлении. Эти значения фиксируют семантическое значение и контекст слова в предварительно обученной модели GloVe. Длина каждого вектора обычно равна размерности вложений слов, которая в данном случае равна 100 (glove.6B.100d.txt).
5. Тематическое моделирование
Тематическое моделирование — это метод, используемый для автоматического обнаружения скрытых тем, присутствующих в наборе текстовых документов.
а. Скрытое распределение Дирихле (LDA)
LDA — это широко используемый алгоритм моделирования темы, который представляет документы как смесь тем. Предполагается, что каждый документ может быть описан как комбинация различных тем, и каждая тема характеризуется распределением слов.
from sklearn.decomposition import LatentDirichletAllocation # Sample corpus (Same as above) corpus = [ "Natural Language Processing is an exciting field of study.", "NLP techniques can be applied to various domains.", "Text analysis helps in extracting meaningful insights." ] tfidf_vectorizer = TfidfVectorizer() tfidf_matrix = tfidf_vectorizer.fit_transform(corpus) # Training the LDA model lda_model = LatentDirichletAllocation(n_components=2, random_state=42) lda_topics = lda_model.fit_transform(tfidf_matrix) print("LDA Topics:\n", lda_topics)
Выход:
LDA Topics: [[0.1220887 0.8779113 ] [0.13123101 0.86876899] [0.10936436 0.89063564]]
В выходных данных каждая строка представляет документ, а каждый столбец соответствует теме. Значения в матрице указывают на вероятность принадлежности документа к определенной теме. Сумма значений в каждой строке должна быть близка к 1, что указывает на то, что документ представляет собой смесь определенных тем.
б. Неотрицательная матричная факторизация (NMF)
NMF — это еще один метод моделирования темы, который разлагает матрицу терминов документа на две матрицы более низкого ранга, представляющие темы и связанные с ними термины. Он предполагает, что частоты терминов в документах неотрицательны, и соответственно изучает представления темы.
from sklearn.decomposition import NMF # Sample corpus (Same as above) corpus = [ "Natural Language Processing is an exciting field of study.", "NLP techniques can be applied to various domains.", "Text analysis helps in extracting meaningful insights." ] tfidf_vectorizer = TfidfVectorizer() tfidf_matrix = tfidf_vectorizer.fit_transform(corpus) # Training the NMF model nmf_model = NMF(n_components=2, random_state=42) nmf_topics = nmf_model.fit_transform(tfidf_matrix) print("NMF Topics:\n", nmf_topics)
Выход:
NMF Topics: [[0.12389426 0.78849042] [0.15474363 0.86890009] [0.10324448 0.96936132]]
В выходных данных каждая строка представляет документ, а каждый столбец соответствует теме. Значения в матрице указывают долю каждой темы, присутствующей в соответствующем документе. Поскольку NMF выдает неотрицательные значения, значения в каждой строке должны в сумме составлять примерно 1, показывая смесь тем в каждом документе.
6. Анализ настроений
Анализ тональности — это процесс определения тональности, выраженной в фрагменте текста.
а. TextBlob для анализа тональности
TextBlob — это библиотека Python, которая упрощает анализ настроений. Он предоставляет простые методы для классификации текста как положительного или отрицательного на основе предопределенных словарей настроений.
from textblob import TextBlob text = "I love Natural Language Processing!" blob = TextBlob(text) sentiment = blob.sentiment print("Sentiment:", sentiment)
Выход:
Sentiment: Sentiment(polarity=0.5, subjectivity=0.6)
б. Анализ настроений с помощью машинного обучения.
Анализ настроений также может быть выполнен с использованием методов машинного обучения. В этом подходе модель обучается на размеченных данных, чтобы предсказать тональность невидимого текста.
Это важные методы в области НЛП, и их понимание закладывает основу для более сложных задач анализа текста. Применяя эти методы в Python, вы можете эффективно обрабатывать и анализировать текстовые данные.
7. Заключение
В этом блоге мы представили ключевые методы обработки естественного языка (NLP), используемые для анализа текста. Мы изучили методы предварительной обработки текста, такие как токенизация, удаление стоп-слов, выделение корней и лемматизация. Мы также рассмотрели модели Bag-of-Words, включая векторизацию счета и векторы TF-IDF, которые необходимы для преобразования текстовых данных в числовые представления. Кроме того, мы углубились во вложения слов, такие как Word2Vec и GloVe, которые фиксируют семантическое значение слов. Наконец, мы коснулись тематического моделирования, в частности, с использованием скрытого распределения Дирихле (LDA) и неотрицательной матричной факторизации (NMF), а также продемонстрировали анализ настроений с использованием TextBlob и машинного обучения.
NLP продолжает играть важную роль в различных реальных приложениях, таких как чат-боты, анализ настроений, поиск информации и многое другое. С ростом доступности больших наборов данных и передовых методов НЛП эта область постоянно развивается, что делает ее интересной областью изучения как для исследователей, так и для практиков.
8. Ссылки
- Инструментарий естественного языка (nltk) — https://www.nltk.org/
- Scikit-learn — https://scikit-learn.org/
- Генсим — https://radimrehurek.com/gensim/
- TextBlob — https://textblob.readthedocs.io/en/dev/
- Набор данных обзоров фильмов IMDb — https://ai.stanford.edu/~amaas/data/sentiment/
- Эндрю Л. Маас и др. (2011). «Изучение векторов слов для анализа настроений». В материалах 49-го ежегодного собрания Ассоциации компьютерной лингвистики: технологии человеческого языка, страницы 142–150.
Спасибо за чтение, надеюсь, вам понравилось. Приятного обучения!