- 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 - 向量與模型
在這裡,我們將學習 Gensim 的核心概念,主要關注向量和模型。
什麼是向量?
如果我們想推斷語料庫中的潛在結構怎麼辦?為此,我們需要以一種可以進行數學操作的方式來表示文件。一種流行的表示方式是將語料庫中的每個文件表示為特徵向量。這就是為什麼我們可以說向量是文件的一種數學上的便捷表示。
舉個例子,讓我們將上面使用的語料庫中的單個特徵表示為一個問答對 -
問 - 單詞 Hello 在文件中出現了多少次?
答 - 零 (0)。
問 - 文件中有多少個段落?
答 - 兩個 (2)
問題通常由其整數 ID 表示,因此此文件的表示是一系列類似 (1, 0.0)、(2, 2.0) 的對。這種向量表示稱為稠密向量。為什麼是稠密,因為它包含了對上面所有問題的明確答案。
如果我們事先知道所有問題,則表示可以簡單地表示為 (0, 2)。這種答案序列(當然,如果問題事先已知)就是我們文件的向量。
另一種流行的表示方式是詞袋 (BoW) 模型。在這種方法中,每個文件基本上都由一個向量表示,該向量包含詞典中每個單詞的頻率計數。
舉個例子,假設我們有一個包含單詞 [‘Hello’, ‘How’, ‘are’, ‘you’] 的詞典。包含字串“How are you how”的文件將由向量 [0, 2, 1, 1] 表示。這裡,向量的條目按“Hello”、“How”、“are”和“you”出現的順序排列。
向量與文件
從上面對向量的解釋中,文件和向量之間的區別幾乎已經清楚了。但是,為了更清楚起見,文件是文字,向量是該文字的數學上方便的表示。不幸的是,有時很多人會混用這兩個術語。
例如,假設我們有一些任意文件 A,那麼他們通常會說“與文件 A 相對應的向量”,而不是說“文件 A 的向量”或“文件 A”。這會導致很大的歧義。這裡需要注意的另一件重要的事情是,兩個不同的文件可能具有相同的向量表示。
將語料庫轉換為向量列表
在進行將語料庫轉換為向量列表的實現示例之前,我們需要將語料庫中的每個單詞與唯一的整數 ID 關聯起來。為此,我們將擴充套件上一章中使用的示例。
示例
from gensim import corpora dictionary = corpora.Dictionary(processed_corpus) print(dictionary)
輸出
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
它表明在我們的語料庫中,這個gensim.corpora.Dictionary中有 25 個不同的標記。
實現示例
我們可以使用詞典將標記化的文件轉換為這些 5 維向量,如下所示 -
pprint.pprint(dictionary.token2id)
輸出
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
同樣,我們可以為文件建立詞袋錶示,如下所示 -
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus] pprint.pprint(BoW_corpus)
輸出
[ [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)], [(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], [(14, 1), (16, 1), (17, 1), (18, 1)], [(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)] ]
什麼是模型?
一旦我們對語料庫進行了向量化,接下來是什麼?現在,我們可以使用模型對其進行轉換。模型可以指用於將一種文件表示轉換為另一種文件表示的演算法。
正如我們所討論的,在 Gensim 中,文件表示為向量,因此我們可以透過模型作為兩個向量空間之間的轉換。總有一個訓練階段,模型在該階段學習這種轉換的細節。模型在訓練階段讀取訓練語料庫。
初始化模型
讓我們初始化tf-idf模型。該模型將向量從 BoW(詞袋)表示轉換為另一個向量空間,其中頻率計數根據每個單詞在語料庫中的相對稀有度進行加權。
實現示例
在下面的示例中,我們將初始化tf-idf模型。我們將使用我們的語料庫對其進行訓練,然後轉換字串“trees graph”。
示例
from gensim import models tfidf = models.TfidfModel(BoW_corpus) words = "trees graph".lower().split() print(tfidf[dictionary.doc2bow(words)])
輸出
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
現在,一旦我們建立了模型,我們就可以透過 tfidf 轉換整個語料庫並對其進行索引,以及查詢我們的查詢文件(我們提供查詢文件“trees system”)與語料庫中每個文件的相似度 -
示例
from gensim import similarities index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5) query_document = 'trees system'.split() query_bow = dictionary.doc2bow(query_document) simils = index[tfidf[query_bow]] print(list(enumerate(simils)))
輸出
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
從上面的輸出可以看出,文件 4 和文件 5 的相似度得分約為 49%。
此外,我們還可以對該輸出進行排序以提高可讀性,如下所示 -
示例
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True): print(doc_number, score)
輸出
2 1.0 3 0.4869355 4 0.4869355 0 0.0 1 0.0