- 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