如何使用 tfidf vectorizer 比较两个文本文档?

how to compare two text document with tfidf vectorizer?

我有两个不同的文本,我想使用 tfidf 向量化进行比较。 我正在做的是:

  1. 标记每个文档
  2. 使用 TFIDFVectorizer.fit_transform(tokens_list)
  3. 向量化

现在我在第 2 步之后得到的矢量形状不同了。 但是根据概念,我们应该对两个向量具有相同的形状。只有这样才能比较向量。

我做错了什么?请帮忙。

提前致谢。

正如 G. Anderson 已经指出的那样,为了帮助未来的人,当我们在文档 D1 上使用 TFIDFVectorizer 的 fit 函数时,这意味着对于 D1,构建词袋。

transform() 函数计算词袋中每个词的 tfidf 频率。

现在我们的目标是比较文档 D2 和 D1。这意味着我们要查看 D1 中有多少单词与 D2 匹配。这就是为什么我们在 D1 上执行 fit_transform() 然后只有 D2 上的 transform() 函数会应用 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? ```