3

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

  1. 标记每个文档
  2. 使用 TFIDFVectorizer.fit_transform(tokens_list) 进行矢量化

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

我究竟做错了什么?请帮忙。

提前致谢。

4

2 回答 2

3

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

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

现在我们的目标是将文档 D2 与 D1 进行比较。这意味着我们想看看有多少 D1 的单词与 D2 匹配。这就是为什么我们在 D1 上执行 fit_transform() ,然后只有 D2 上的 transform() 函数会应用 D1 的词袋并计算 D2 中标记的逆频率。这将给出 D1 与 D2 的相对比较。

于 2019-11-23T21:51:27.097 回答
0

我是后来的人之一:)

所以我对 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? ```













于 2021-09-16T21:34:45.453 回答