- Gensim 教程
- Gensim - 首頁
- Gensim - 簡介
- Gensim - 入門
- Gensim - 文件和語料庫
- Gensim - 向量和模型
- Gensim - 建立詞典
- 建立詞袋 (BoW) 語料庫
- Gensim - 變換
- Gensim - 建立 TF-IDF 矩陣
- Gensim - 主題建模
- Gensim - 建立 LDA 主題模型
- Gensim - 使用 LDA 主題模型
- Gensim - 建立 LDA Mallet 模型
- Gensim - 文件和 LDA 模型
- Gensim - 建立 LSI 和 HDP 主題模型
- Gensim - 開發詞嵌入
- Gensim - Doc2Vec 模型
- Gensim 有用資源
- Gensim - 快速指南
- Gensim - 有用資源
- Gensim - 討論
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”被完全刪除了。