GENSIM官⽅⽂档(4.0.0beta最新版)-⾯向新⼿的核⼼教程GENSIM官⽅⽂档(4.0.0beta最新版)-⾯向新⼿的核⼼教程
译⽂⽬录
博主全天在线,欢迎评论或私信讨论NLP相关问题
1. 核⼼概念
本模块介绍Documents, Corpora, Vectors and Models:他们是理解和使⽤gensim所需的基本概念和术语。
import pprint
gensim的核⼼概念有:
1. Document:⼀些⽂本;⽂档。
2. Corpus:⽂档的集合。
3. Vector:⽂档的数学表达形式,向量化⽂档。
4. Model:把⽂档由⼀种Vector转化为另⼀种Vector的算法。
Document(⽂档)
Gensim中⽂档是str类型的⽂本序列,⽂档可以是简短的140个字符的推⽂,单个段落(即期刊⽂章摘要),新闻⽂章或书籍中的任何内容。
document ="Human machine interface for lab abc computer applications"
Corpus(语料库)
语料库是⽂档的集合,(集合表达不准确,应该是列表)语料库在Gensim中有两个作⽤:
1. 作为训练集输⼊模型,通过训练语料集来得到常见主题(话题),同时初始化内部模型参数。
Gensim专注于训练⽆监督模型,因此不需要⼈⼯⼲预,如费时费⼒的⽂档注释或⼿⼯标记。
2. ⽂档组织化:再训练后,⼀个主题模型可以被⽤来从新的⽂档中提取主题。
此类语料集可以建⽴索引并通过语义相似性或聚类做作相似性查询。
下⾯是⼀个⽰例语料库。它由9个⽂档组成,其中每个⽂档都是⼀个由单个句⼦组成的字符串。
text_corpus =[
"Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey",
]
注意!上⾯的⽰例将整个语料库加载到内存中。实际上,语料库可能⾮常⼤,因此将它们加载到内存中可能是不可能的。Gensim通过对⽂档的逐次流式处理来智能地处理此类语料库。详见下⽂。
出于说明⽬的,这仅展⽰了⼀个极⼩的语料库。另⼀个⽰例可以是莎⼠⽐亚撰写的所有戏剧的列表,所有⽂章的列表或特定感兴趣的⼈的所有推⽂。
收集完语料库后,通常需要执⾏许多预处理步骤。我们为了简化步骤,只删除⼀些常⽤的英语单词(例如“ the”)和仅在语料库中出现⼀次的单词。在此过程中,我们将解析标记(tokenize)数据。这将⽂档分解为词袋(在这种情况下,使⽤空格作为分隔符)。
有更好的⽅法来执⾏预处理,⽽不仅仅是把⽂档所有字母全换成⼩写字母和按空格分割。有效的预处理超出了本教程的范围:如果您有兴趣,请查看函数。
# 创建停⽤词列表
stoplist =set('for a of the and to in'.split(' '))
# ⼩写化,空格分词,使⽤停⽤词
texts =[[word for word in document.lower().split()if word not in stoplist]
for document in text_corpus]
# 计算词频
from collections import defaultdict
frequency = defaultdict(int)
for text in texts:
for token in text:
frequency[token]+=1
#仅保留出现超过⼀次的单词
processed_corpus =[[token for token in text if frequency[token]>1]for text in texts]
pprint.pprint(processed_corpus)
输出:
[['human','interface','computer'],
['survey','user','computer','system','response','time'],
['eps','user','interface','system'],
['system','human','system','eps'],
['user','response','time'],
['trees'],
['graph','trees'],
['graph','minors','trees'],
['graph','minors','survey']]
再继续处理之前,我们希望将语料库中的每个单词与唯⼀的整数ID相关联,也就是建⽴词典。可以使⽤pora.Dictionary来实现,该词典定义了处理过程中所有单词的词汇表。
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
输出:
Dictionary(12 unique tokens:['computer','human','interface','response','survey']...)
由于我们的语料库很⼩,因此其中只有12个不同的标记 。对于较⼤的语料库,包含成千上万个标记的字典是很常见的。
Vector (向量)
为了推断语料库中的潜在结构,我们需要⼀种可以进⾏数学处理的⽂档表⽰⽅式。⼀种⽅法是将每个⽂档表⽰为特征向量。例如,每个特征可能被认为是⼀个问答对:
1. Splonge这个单词在⽂档中出现了⼏次?零。
2. 该⽂件由⼏段组成?⼆。
3. ⽂档使⽤多少种字体?五。
问题通常只由它的⼀个整数ID表⽰(如所表⽰的1,2和3)。然后,该⽂档的表⽰形式将变成⼀系列类似的实数对:(1, 0.0), (2, 2.0), (3, 5.0)。这被称为稠密向量,因为它包含对上述每个问题的明确答案。
如果我们事先知道全部问题,则可以隐去它们,将⽂档简单的表⽰成:(0,2,5),这就是该⽂档的三维稠密向量化表⽰。出于实际⽬
的,Gensim仅允许答案可以转化成单浮点类型的问题。
实践过程中,通常有⼤量的零向量存在。为了节省内存,Gensim省略了所有零向量。上例因此变成(2,2.0),(3,5.0)。这就是稀疏矩阵或是词袋向量。在这种稀疏表达形式中所有缺失的特征值被明确的解析为零。
假设对于不同⽂档的问题相同,我们可以⽐较两篇不同⽂档的向量,⽐如(0.0, 2.0, 5.0)和(0.1, 1.9, 4.9)。因为这两个向量⾮常相似,所以我们可以说相对应的两篇⽂档相似度也很⾼。当然,结论的正确性取决于我们如何选择问题。
另⼀种向量化表⽰⽂档的⽅法是词袋模型。在词袋模型下,每个⽂档都由⼀个向量表⽰,该向量包含字典中每个单词的频数。⽐如,假设我们有⼀个包含单词[‘coffee’, ‘milk’, ‘sugar’, ‘spoon’]的词典,⼀篇⽂档由字符串“coffee milk coffee”组成的字符串则会被表⽰成[2,1,0,0],向量的长度就是字典中的条⽬数。词袋模型的主要特征之⼀就是它完全忽略了⽂档中单词出现的顺序,这也是“词袋”名称的来源。
我们处理后的语料集包含12个不同的单词,这意味着每个⽂档在词袋模型下将表⽰成⼀个12维的向量。我们可以⽤dictionary
的token2id得到词典中单词和其对应的ID。
pprint.ken2id)
输出:
{'computer':0,
'eps':8,
'graph':10,
'human':1,
'interface':2,
'minors':11,
'response':3,
'survey':4,
'system':5,
'time':6,
'trees':9,
'user':7}
现在假设我们项向量化⼀个新的短语“Human computer interaction” ,可以通过使⽤dictionary的doc2bow⽅法得到该⽂档的稀疏矩阵表达形式(译者注:输⼊参数是词袋列表)。
new_doc ="Human computer interaction"
new_vec = dictionary.doc2bow(new_doc.lower().split())
print(new_vec)
输出:
[(0,1),(1,1)]
元组的第⼀条为字典的单词ID,第⼆条为词频。没出现在词典中的词不显⽰。
可以将整个原始语料库转化为向量列表:
bow_corpus =[dictionary.doc2bow(text)for text in processed_corpus]
pprint.pprint(bow_corpus)
输出:
[[(0, 1), (1, 1), (2, 1)],
[(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)],
[(2, 1), (5, 1), (7, 1), (8, 1)],
[(1, 1), (5, 2), (8, 1)],
[(3, 1), (6, 1), (7, 1)],
[(9, 1)],
[(9, 1), (10, 1)],
[(9, 1), (10, 1), (11, 1)],
[(4, 1), (10, 1), (11, 1)]]
注意,这整个列表都完整的储存在内存中,在⼤多数应⽤中我们需要⼀个更具拓展性的解决⽅案。幸运的是gensim允许我们使⽤⼀次返回单个⽂档的迭代器。
注意!⽂档和向量的区别是前者是⽂本,后者是数学上更⽅便的⽂本表⽰形式。有时⼈们说的“⽂本”其实就是指“向量表⽰的⽂本”
注意!两个不同的⽂本可能会有相同的向量表⽰(译者注:如词袋模型下“I like apple but don’t like banana”和“I like banana but don’t like apple”向量表⽰相同)
Model(模型)
我们已经向量化表⽰了我们的语料集,现在可以开始使⽤模型对其进⾏变换了。变换(transformation)指的是把⽂档的从⼀种表达形式变成另⼀种表达形式。在gensim中,⽂档由向量组成,所以变换(transformation)可以理解成两个向量空间间的映射函数。可以通过训练语料库进⾏该模型的学习。
tf-idf 是⼀个简单的例⼦,tf-idf模型把词袋化的向量转化为语料集中频数由相对稀有度加权处理的向量空间。
下⾯是⼀个简单的例⼦。我们初始化tf-idf模型,在语料库上对其进⾏训练,并转换字符串“ system minors”:
from gensim import models
# 训练模型,输⼊是⽂档稀疏表达的元祖⼆维列表。
tfidf = models.TfidfModel(bow_corpus)
# 转化 "system minors" 字符串
words ="system minors".lower().split()
print(tfidf[dictionary.doc2bow(words)])
输出:
[(5,0.5898341626740045),(11,0.8075244024440723)]
tfidf模型返回⼀个元祖列表,第⼀条是词典ID,第⼆条是tf-idf权重
gensim提供了多种多样的模型和转换⽅法,详见第三章(主题和变换)。
创建模型后,您可以使⽤它进⾏各种有趣的⼯作。如要通过tfidf转换整个语料并对其进⾏索引,以准备相似性查询:
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[bow_corpus], num_features=12)
输⼊待查询⽂档,查寻其与语料库中每篇⽂档的相似性。
query_document ='system engineering'.split()
query_bow = dictionary.doc2bow(query_document)
sims = index[tfidf[query_bow]]
print(list(enumerate(sims)))
输出
[(0, 0.0), (1, 0.32448703), (2, 0.41707572), (3, 0.7184812), (4, 0.0), (5, 0.0), (6, 0.0), (7, 0.0), (8, 0.0)]
输出结果表⽰⽂档3与其的相似度为71.8%,⽂档2与其相似度为41.2%,等等。我们可以通过排序使结果更具可读性。
总结
gensim的核⼼概念有是:
1. ⽂件:⼀些⽂字。
2. 语料库:⽂件的集合。
3. 向量:⽂档的数学⽅便表⽰。
4. 模型:⼀种将向量从⼀种表⽰转换为另⼀种表⽰的算法。
我们在实践中看到了这些概念。⾸先,我们从⽂档集开始。接下来,我们将这些⽂档转换为向量空间表⽰。之后,我们创建了⼀个模型,将原始向量表⽰形式转换为TfIdf。最后,我们使⽤模型来计算某些查询⽂档和语料库中所有⽂档之间的相似度。
2. 语料库和向量空间
本章节展⽰把⽂本转换成向量空间表⽰,同时介绍各种格式的语料流(corpus streaming)和⼀些存储到磁盘的⽅式。
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
从字符串到向量
⾸先创造⼀个有9个简短⽂档的⼩型语料库。
documents =[
"Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey",
]
这是⼀个由9个⽂档组成的⼩语料库,每个⽂档仅包含⼀个句⼦。
documents安卓版破解版
⾸先,让我们对⽂档进⾏标记化,删除常⽤单词以及仅在语料库中出现⼀次的单词:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。