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/
Приятного обучения!
Прощай, мне нравится!! 🤗🤗