1. Введение

Обработка естественного языка (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. Ссылки

  1. Инструментарий естественного языка (nltk) — https://www.nltk.org/
  2. Scikit-learn — https://scikit-learn.org/
  3. Генсим — https://radimrehurek.com/gensim/
  4. TextBlob — https://textblob.readthedocs.io/en/dev/
  5. Набор данных обзоров фильмов IMDb — https://ai.stanford.edu/~amaas/data/sentiment/
  6. Эндрю Л. Маас и др. (2011). «Изучение векторов слов для анализа настроений». В материалах 49-го ежегодного собрания Ассоциации компьютерной лингвистики: технологии человеческого языка, страницы 142–150.

Спасибо за чтение, надеюсь, вам понравилось. Приятного обучения!