📅  最后修改于: 2020-10-16 02:22:34             🧑  作者: Mango
在这里,我们将学习Gensim的核心概念,主要关注向量和模型。
如果我们想推断语料库中的潜在结构怎么办?为此,我们需要以一种可以在数学上操纵它们的方式来表示文档。一种流行的表示形式是将语料库的每个文档表示为特征的向量。这就是为什么我们可以说向量是文档的数学方便表示的原因。
举一个例子,让我们将上面使用过的语料库的一个功能表示为QA对-
问–您好单词在文档中出现了几次?
A-零(0)。
问-文件中有几段?
A-两(2)
问题通常由其整数id表示,因此此文档的表示形式是一系列对,如(1,0.0),(2,2.0)。这种矢量表示被称为密集矢量。为什么要密集,因为它包含对以上所有问题的明确答案。
如果我们事先知道所有问题,则表示可以像(0,2)这样简单。这样的答案顺序(当然,如果事先知道问题的话)是我们文档的载体。
另一种流行的表示形式是词袋(BoW)模型。在这种方法中,每个文档基本上都由一个向量表示,该向量包含字典中每个单词的频率计数。
举一个例子,假设我们有一个包含单词[‘Hello’,’How’,’are’,’you’]的字典。然后,由字符串“ 0”,“ 2”,“ 1”,“ 1”组成的文档将由字符串“ How you how”组成。在此,向量的条目按“ 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转换整个语料库并将其编入索引,并针对语料库中的每个文档查询查询文档的相似性(我们为查询文档提供“树系统”)-
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