Как сравнить два текстовых документа с векторизатором tfidf?
У меня есть два разных текста, которые я хочу сравнить, используя векторизацию tfidf. Что я делаю, это:
- маркировка каждого документа
- векторизация с использованием TFIDFVectorizer.fit_transform(tokens_list)
Теперь векторы, которые я получаю после шага 2, имеют другую форму. Поэтому, когда я использую формулы: ((tfidf * tfidf.T).A[0,1], я получаю 1,0 за использование одного и того же пакета слов и одного и того же балла для другого пакета слов.
Что я делаю неправильно? Пожалуйста помоги.
Рассмотрим грубый пример ниже:
text = ['akshit']
text2 = ['human']
from sklearn.feature_extraction.text import TfidfVectorizer
vectoriser=TfidfVectorizer(stop_words='english')
tfidf = vectoriser.fit_transform(text,text2)
print ((tfidf * tfidf.T).A[0,1]
Заранее спасибо.
3 ответа
Как уже отмечал Дж. Андерсон, и чтобы помочь будущим ребятам в этом, когда мы используем функцию соответствия TFIDFVectorizer в документе D1, это означает, что для D1 создается мешок слов.
Функция transform() вычисляет частоту tfidf каждого слова в пакете слов.
Теперь наша цель - сравнить документ D2 с D1. Это означает, что мы хотим увидеть, сколько слов D1 соответствует D2. Вот почему мы выполняем fit_transform() на D1, а затем только функция transform() на D2 применяет пакет слов D1 и подсчитывает обратную частоту токенов в D2. Это дало бы относительное сравнение D1 и D2.
Я один из тех, кто позже :)
Итак, как я понимаю с TF-IDF, IDF вычисляет частоту слова (или Ngram) в обоих документах? Таким образом, сравнение того, что соответствует каждому из них, на самом деле не охватывает, насколько часто это слово встречается в обоих документах для отсеивания общих слов? Есть ли способ сделать это с помощью Ngrams без ошибки индекса?
ValueError: форма переданных значений (26736, 1), индексы подразумевают (60916, 1)
# Applying TFIDF to vectors
#instantiate tfidVectorizers()
ngram_vectorizer1 = TfidfVectorizer(ngram_range = (2,2)) #bigrams 1st vector
ngram_vectorizer2 = TfidfVectorizer(ngram_range = (2,2)) #bigrams 2nd
ngram_vectorizert = TfidfVectorizer(ngram_range = (2,2)) #bigrams total
# fit model
ngram_vector1 = ngram_vectorizer1.fit_transform(text)
ngram_vector2 = ngram_vectorizer2.fit_transform(text2)
ngram_vectort = ngram_vectorizert.fit_transform(total)
ngramfeatures1 = (ngram_vectorizer1.get_feature_names()) #save feature names
ngramfeatures2 = (ngram_vectorizer2.get_feature_names()) #save feature names
ngramfeaturest = (ngram_vectorizert.get_feature_names())
print("\n\nngramfeatures1 : \n", ngramfeatures1)
print("\n\nngramfeatures2 : \n", ngramfeatures2)
print("\n\nngram_vector1 : \n", ngram_vector1.toarray())
print("\n\nngram_vector2 : \n", ngram_vector2.toarray())
#Compute the IDF values
first_tfidf_transformer_ngram=TfidfTransformer(smooth_idf=True,use_idf=True)
second_tfidf_transformer_ngram=TfidfTransformer(smooth_idf=True,use_idf=True)
total_tfidf_transformer_ngram=TfidfTransformer(smooth_idf=True,use_idf=True)
first_tfidf_transformer_ngram.fit(ngram_vector1)
second_tfidf_transformer_ngram.fit(ngram_vector2)
total_tfidf_transformer_ngram.fit(ngram_vectort)
# print 1st idf values
ngram_first_idf = pd.DataFrame(first_tfidf_transformer_ngram.idf_, index=ngram_vectorizer1.get_feature_names(),columns=["idf_weights"])
# sort ascending
ngram_first_idf.sort_values(by=['idf_weights']) #this one should really be looking towards something from the "Total" calculations if I'm understanding it correctly? ```
Stack Overflow не позволил мне добавить комментарий для ответа, так как он слишком новенький. Вы сравниваете его с текстом 1 или с комбинацией текста 1 и текста 2? Здесь: https://aiaspirant.com/bag-of-words/
Когда они сравнивают набор слов, они обучаются на основе корпуса, который представляет собой комбинацию всех изучаемых слов. Я не нашел примера ngram, который это делает, но есть несколько примеров, когда он использует BOW, которые идут по этому маршруту.