簡體   English   中英

如何使用 tfidf vectorizer 比較兩個文本文檔?

[英]how to compare two text document with tfidf vectorizer?

我有兩個不同的文本,我想使用 tfidf 矢量化來比較它們。 我正在做的是:

  1. 標記每個文檔
  2. 使用 TFIDFVectorizer.fit_transform(tokens_list) 進行矢量化

現在我在第 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? ```













暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM