TF-IDF и LDA — два популярных метода обработки естественного языка для анализа и понимания текстовых данных. Вот объяснение каждого метода, а также фрагмент кода на Python для каждого из них.

TF-IDF

TF-IDF расшифровывается как частота документа, обратная частоте. Это числовая статистика, используемая для отражения важности слова в документе относительно его частоты в корпусе. Значение TF-IDF увеличивается пропорционально количеству раз, которое слово появляется в документе, но компенсируется частотой этого слова в корпусе. Это помогает учесть тот факт, что некоторые слова, такие как «the» или «and», очень часто встречаются во всех документах и ​​могут быть неинформативными для их различения.

Чтобы вычислить значение TF-IDF термина в корпусе документов, мы используем следующую формулу:

TF-IDF (t, d) = TF (t, d) * IDF (t)

где:

  • TF(t, d) = количество раз, когда термин t появляется в документе d
  • IDF(t) = log(N/df(t))
  • N = общее количество документов в корпусе
  • df(t) = количество документов в корпусе, содержащих термин t

Вот пример фрагмента кода на Python для расчета оценок TF-IDF с использованием класса TfidfVectorizer из sklearn.feature_extraction.text:

from sklearn.feature_extraction.text import TfidfVectorizer

# create a list of documents
documents = ['This is the first document.',
             'This is the second document.',
             'And this is the third one.',
             'Is this the first document?']

# create a TfidfVectorizer object
vectorizer = TfidfVectorizer()

# fit the vectorizer to the documents and transform them into a TF-IDF matrix
tfidf_matrix = vectorizer.fit_transform(documents)

# print the TF-IDF matrix
print(tfidf_matrix.toarray())

В этом примере мы создаем список документов, а затем создаем объект TfidfVectorizer. Мы подгоняем векторизатор к документам, а затем преобразуем их в матрицу TF-IDF, используя метод fit_transform. Полученная матрица TF-IDF выводится на консоль.

ЛДА

LDA означает скрытое распределение Дирихле. Это порождающая статистическая модель, которая позволяет объяснять наборы наблюдений ненаблюдаемыми группами, которые объясняют, почему некоторые части данных похожи. При обработке естественного языка LDA часто используется для обнаружения тем в корпусе текста. Модель предполагает, что каждый документ представляет собой смесь небольшого количества тем и что каждое слово в документе создается одной из этих тем.

Для реализации LDA в Python мы можем использовать библиотеку gensim, которая предоставляет простой в использовании интерфейс для тематического моделирования.

import gensim
from gensim import corpora

# Define corpus of text documents
corpus = [
    'This is the first document about data science.',
    'This document is the second document about data analysis.',
    'And this is the third one about data mining.',
    'Is this the first document about data science?',
]

# Create dictionary of terms
dictionary = corpora.Dictionary([doc.split() for doc in corpus])

# Create bag-of-words representation of corpus
bow_corpus = [dictionary.doc2bow(doc.split()) for doc in corpus]

# Train LDA model on corpus
lda_model = gensim.models.ldamodel.LdaModel(bow_corpus, num_topics=2, id2word=dictionary, passes=10)

# Print topics and associated word distributions
topics = lda_model.print_topics(num_words=4)
for topic in topics:
    print(topic)

В приведенном выше коде мы сначала импортируем библиотеку gensim и определяем корпус текстовых документов. Затем мы создаем словарь терминов и набор слов для представления корпуса. Наконец, мы обучаем модель LDA в корпусе, используя класс LdaModel из gensim.models.ldamodel, и печатаем темы.

В приведенном ниже фрагменте кода мы сначала создаем матрицу терминов документа, используя класс TfidfVectorizer из библиотеки scikit-learn. Затем мы печатаем оценки TF-IDF для каждого термина в первом документе корпуса. Затем мы обучаем модель LDA в корпусе, используя класс LdaModel из gensim.models.ldamodel, и печатаем темы и связанные с ними слова.

# import libraries
from sklearn.feature_extraction.text import TfidfVectorizer
from gensim.models.ldamodel import LdaModel
from gensim.corpora.dictionary import Dictionary

# create corpus
corpus = [
    'The quick brown fox jumps over the lazy dog.',
    'The dog and the fox are good friends.',
    'The red fox is quick and the brown fox is lazy.',
    'The dog is lazy but the cat is active.',
    'The cat and the dog are good friends.'
]

# create document-term matrix using TF-IDF
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

# print TF-IDF scores for first document
terms = vectorizer.get_feature_names()
tf_idf_scores = X[0]
for col in tf_idf_scores.nonzero()[1]:
    print(f"{terms[col]}: {tf_idf_scores[0, col]}")

# train LDA model on corpus
dictionary = Dictionary([doc.split() for doc in corpus])
corpus_gensim = [dictionary.doc2bow(doc.split()) for doc in corpus]
lda_model = LdaModel(corpus_gensim, num_topics=2, id2word=dictionary, passes=10)

# print topics and their associated words
for idx, topic in lda_model.print_topics(-1):
    print(f"Topic {idx + 1}: {topic}")

Вывод кода покажет баллы TF-IDF для каждого термина в первом документе, за которыми следуют две темы и связанные с ними слова, сгенерированные моделью LDA:

brown: 0.43877674285923447
dog: 0.3587287385148149
fox: 0.43877674285923447
jumps: 0.43877674285923447
lazy: 0.43877674285923447
over: 0.43877674285923447
quick: 0.43877674285923447
the: 0.3587287385148149
Topic 1: 0.135*"dog" + 0.130*"friends." + 0.090*"good" + 0.090*"and" + 0.090*"are" + 0.074*"the" + 0.074*"cat" + 0.074*"active." + 0.074*"but" + 0.074*"is"
Topic 2: 0.125*"the" + 0.125*"fox" + 0.085*"brown" + 0.085*"lazy." + 0.085*"quick" + 0.085*"red" + 0

Оставайтесь с нами, чтобы узнать больше!

Я всегда рад общаться со своими подписчиками и читателями в LinkedIn. Если у вас есть какие-либо вопросы или вы просто хотите поздороваться, пожалуйста, не стесняйтесь обращаться к нам.

https://www.linkedin.com/in/sharmasaravanan/

Приятного обучения!

Прощай, мне нравится!! 🤗🤗