Gensim - 建立 TF-IDF 矩陣



在這裡,我們將學習如何藉助 Gensim 建立詞頻-逆文件頻率 (TF-IDF) 矩陣。

什麼是 TF-IDF?

它是詞頻-逆文件頻率模型,也是一種詞袋模型。它與常規語料庫不同,因為它會降低跨文件頻繁出現的標記(即單詞)的權重。在初始化期間,此 tf-idf 模型演算法需要一個具有整數值的訓練語料庫(例如詞袋模型)。

然後,在轉換時,它獲取向量表示並返回另一個向量表示。輸出向量將具有相同的維度,但稀有特徵(在訓練時)的值將被增加。它基本上將整數值向量轉換為實數值向量。

它是如何計算的?

TF-IDF 模型透過以下兩個簡單步驟計算 tfidf:

步驟 1:乘以區域性和全域性成分

在此第一步中,模型將把區域性成分(如 TF(詞頻))與全域性成分(如 IDF(逆文件頻率))相乘。

步驟 2:標準化結果

完成乘法後,在下一步中,TFIDF 模型將結果標準化為單位長度。

由於以上兩個步驟,跨文件頻繁出現的單詞的權重將降低。

如何獲取 TF-IDF 權重?

在這裡,我們將實現一個示例,以瞭解如何獲取 TF-IDF 權重。基本上,為了獲取 TF-IDF 權重,我們首先需要訓練語料庫,然後在 tfidf 模型中應用該語料庫。

訓練語料庫

如上所述,要獲得 TF-IDF,我們首先需要訓練我們的語料庫。首先,我們需要匯入所有必要的包,如下所示:

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

現在提供包含句子的列表。我們的列表中有三個句子:

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

接下來,對句子進行分詞,如下所示:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

建立 **corpora.Dictionary()** 的物件,如下所示:

dictionary = corpora.Dictionary()

現在將這些分詞後的句子傳遞給 **dictionary.doc2bow()** 物件,如下所示:

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

接下來,我們將獲得文件中單詞的 ID 及其頻率。

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

輸出

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

透過這種方式,我們訓練了我們的語料庫(詞袋語料庫)。

接下來,我們需要在 tfidf 模型 **models.TfidfModel()** 中應用此訓練好的語料庫。

首先匯入 numpay 包:

import numpy as np

現在將我們訓練好的語料庫 (BoW_corpus) 應用於 **models.TfidfModel()** 的方括號內

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

接下來,我們將獲得 tfidf 模型語料庫中單詞的 ID 及其頻率:

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

輸出

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

從以上輸出中,我們看到了文件中單詞頻率的差異。

完整的實現示例

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

單詞權重的差異

如上所述,在文件中出現頻率更高的單詞將獲得較小的權重。讓我們從以上兩個輸出中瞭解單詞權重的差異。單詞“are”出現在兩個文件中,並且權重降低了。同樣,出現在所有文件中的單詞“you”被完全刪除了。

廣告

© . All rights reserved.