Как сравнить два текстовых документа с векторизатором tfidf?

У меня есть два разных текста, которые я хочу сравнить, используя векторизацию tfidf. Что я делаю, это:

  1. маркировка каждого документа
  2. векторизация с использованием 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, которые идут по этому маршруту.

Другие вопросы по тегам