Gensim介绍以及实践

简介: Gensim介绍以及实践

前言


是一款开源的第三方python工具包, 主要用来以无监督的方式从原始的非结构化文本中学习到文本隐藏层的主题向量表达,支持包括TF-IDF、LSA、LDA和word2vec在内的多种模型算法。


一、相关概念介绍以及拓展


1-0、安装


pip install gensim



1-1、文档


文档:文档指的是文本序列类型的对象,即str对象,可以是一段话,也可以是一本书,都可以称之为文档。

doc= '稻城县位于中国四川省西南边缘,甘孜州南部。地处青藏高原东南部,横断山脉东侧。属康巴藏区的甘孜藏族自治州。稻城县跨北纬27°58'~29°30'、东经99°56'~100°36',南北长174公里,东西宽63公里,东与九龙县相接,西与乡城县相邻,北接理塘县,南与木里藏族自治县接壤,西南与云南迪庆藏族自治州相邻。辖区面积7323平方公里。'

1-2、语料库、数据预处理、词典的定义


语料库:一组原始文本的集合,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。


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模型所能理解的稀疏向量的过程),比如说分词(中文用jieba,英文用nltk)、去除停用词,去除掉一些只出现过一次的单词,大小写转换等等方法。

经过基础的预处理之后,数据如下所示:

texts = [['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,这时我们会调用到gensim.corpora.Dictionary类,可以定义一个词表,这个词表中包含所有的单词。

from gensim import corpora
dictionary = corpora.Dictionary(texts)
print(dictionary)


输出:Dictionary(12 unique tokens: [‘computer’, ‘human’, ‘interface’, ‘response’, ‘survey’]…)

# 输出词典
dictionary.token2id


输出

{‘computer’: 0,
‘human’: 1,
‘interface’: 2,
‘response’: 3,
‘survey’: 4,

‘system’: 5,
‘time’: 6,
‘user’: 7,
‘eps’: 8,
‘trees’: 9,
‘graph’: 10,
‘minors’: 11}


字典保存

dictionary.save('/tmp/deerwester.dict')


1-3、向量

向量(Vector):由一组文本特征构成的列表。是一段文本在Gensim中的内部表达。

# doc2bow: 将文本转换为稀疏向量的方法(除了这个方法以外还有其他的转换方法),在输出的元组中,第一个数字表示这个token在字典中的ID,第二个数字代表出现的次数。即词袋向量。
# 词集模型:单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个。
# 词袋模型:在词集的基础上如果一个单词在文档中出现不止一次,统计其出现的次数(频数)
# 即词集只关注有和没有,而词袋还要关注有几个。
# 注意:只是在词典中出现的才会被转换。
corpus = [dictionary.doc2bow(text) for text in texts]
print(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)]]


1-4、模型(以TF-idf为例)的初始化以及保存


模型:将一种文档表示转换成另一种表示,即一个向量空间被转换为另一个向量空间。

这里以TF-IDF为例:返回的是一个由元组组成的列表,第一个数组是token的ID,第二个数字是这个单词的Tf-idf值。Tf-idf的详细介绍以及实践请下拉看第三点。


# TF-IDF模型初始化
from gensim import models
tfidf = models.TfidfModel(corpus)
# 将bow向量的迭代器,转化为TF-IDF向量的迭代器
for i in tfidf[corpus]:
    print(i)

输出


[(0, 0.5773502691896257), (1, 0.5773502691896257), (2, 0.5773502691896257)]

[(0, 0.44424552527467476), (3, 0.44424552527467476), (4, 0.44424552527467476), (5, 0.3244870206138555), (6, 0.44424552527467476), (7, 0.3244870206138555)]

[(2, 0.5710059809418182), (5, 0.4170757362022777), (7, 0.4170757362022777), (8, 0.5710059809418182)]

[(1, 0.49182558987264147), (5, 0.7184811607083769), (8, 0.49182558987264147)]

[(3, 0.6282580468670046), (6, 0.6282580468670046), (7, 0.45889394536615247)]

[(9, 1.0)]

[(9, 0.7071067811865475), (10, 0.7071067811865475)]

[(9, 0.5080429008916749), (10, 0.5080429008916749), (11, 0.695546419520037)]

[(4, 0.6282580468670046), (10, 0.45889394536615247), (11, 0.6282580468670046)]


模型的保存

tfidf.save("./model.tfidf")
tfidf = models.TfidfModel.load("./model.tfidf")


二、文档相似度的计算

# 检索出主题相似度最高的文档,进而完成文本聚类、信息检索之类的任务
from gensim import similarities
# 初始化查询结构,把总的文档转换为tfidf后输入到SparseMatrixSimilarity中去
index = similarities.SparseMatrixSimilarity(tfidf[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)]

保存相似度矩阵


index.save('/tmp/test.index')
index = similarities.MatrixSimilarity.load('/tmp/test.index')


三、常见的主题模型介绍


3-1、TF-idf(词频-逆向文件频率)


TF-IDF: TF-IDF是一种统计方法,用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性会随着它在文件中出现的次数成正比增加,但是同时会随着它在语料库中出现的频率成反比下降。某一个词对于文章的重要性越高,那么它的tf-idf的值就越大。TF-IDF模型通常和词袋模型配合使用,对词袋模型生成的数组做进一步处理。

TF-IDF公式介绍:

TF:词频,表现词条在文本中出现的频率,被归一化,防止偏向长的文件。

tf = 词条w在文档中出现的总次数/文档的词总数

IDF:逆文件频率

idf = log(文档总数/(包含该词的文档数+1))

某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。

公式: TF*IDF


3-2、TFidfVectorizer实践

from sklearn.feature_extraction.text import TfidfVectorizer
train_document = ["The flowers are beautiful.",
                  "The name of these flowers is rose, they are very beautiful.",
                  "Rose is beautiful",
                  "Are you like these flowers?"]  
test_document = ["The flowers are mine.", 
                 "My flowers are beautiful"]               
#利用函数获取文档的TFIDF值
print("计算TF-IDF权重")       
transformer = TfidfVectorizer()
# fit(): 根据训练集生成词典和逆文档词频
# transform():使用fit学习的词汇和文档频率,将文档转化为文档-词矩阵,即对文本做向量化表示。
X_train = transformer.fit_transform(train_document)
X_test = transformer.transform(test_document)
#观察各个值
#(1)统计词列表
word_list = transformer.get_feature_names()  # 所有统计的词
print("统计词列表")
print(word_list)
#(2)统计词字典形式
print("统计词字典形式")
print(transformer.fit(test_document).vocabulary_)
#(3)TFIDF权重
weight_train = X_train.toarray()
weight_test = X_test.toarray()
print("train TFIDF权重")
print(weight_train)
print("test TFIDF权重")
print(weight_test)    
#(4)查看逆文档率(IDF)
print("train idf")
print(transformer.fit(train_document).idf_) 
# (5)查看生成的词语与列的对应关系,即词汇表,我们在fit的时候建立了一个词汇表。
print('词语与列的对应关系')
print(transformer.vocabulary_)
# (6)参数详解:
token_pattern:用来分词,使用正则表达式,注意,默认参数为r"(?u)\b\w\w+\b",该默认参数决定了其匹配至少长度为2的单词,如果想要匹配长度为1的单词,则只需要修改一下参数token_pattern=r"(?u)\b\w+\b")
stop_words:设置停用词表。
max_df/min_df:设置过滤值,过滤高于或低于该比例的词语。
max_feature: 设置使用多少词语,默认是都使用。


注意:在上边的代码中,第一次使用fit之后,根据训练集生成词典,这个词典里只是包含训练集的所有单词,下一步直接对测试集transform的话,使用的还是这个词典,但是测试集里有训练集没有的单词mine,即mine在用测试集生成的tf-idf权重里没有体现。


3-3、LDA(等待补充)


参考文章:

重要:Gensim 中文文档.

15分钟入门Gensim.

Gensim库的使用——Gensim库的核心概念介绍.

gensim官方api文档.

github公开电子书.


总结

昨天熬夜了,有点疲惫。

相关文章
|
3月前
|
算法框架/工具 机器学习/深度学习 算法
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)(2)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)
81 0
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)(2)
|
3月前
|
机器学习/深度学习 算法框架/工具 TensorFlow
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)(1)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)
56 0
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)(1)
|
3月前
|
算法框架/工具 Python 算法
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)(3)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)
88 0
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)(3)
|
3月前
|
机器学习/深度学习 算法框架/工具 自然语言处理
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)(1)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)
62 0
|
3月前
|
机器学习/深度学习 算法框架/工具 Python
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(五)(2)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(五)
47 0
|
机器学习/深度学习 算法 数据挖掘
|
机器学习/深度学习 算法框架/工具 Python
|
机器学习/深度学习 测试技术 TensorFlow
|
机器学习/深度学习 自然语言处理 算法