Gensim实现Word2Vec的Skip-Gram模型

简介: gensim是一个开源的Python库,用于便捷高效地提取文档中的语义话题。它用于处理原始的、非结构化的电子文本(“纯文本”),gensim中的一些算法,如 Latent Semantic Analysis(潜在语义分析)、 Latent Dirichlet Allocation(潜在Dirichlet分布)、Random Projections(随机预测)通过检查训练文档中的共现实体来挖掘语义结构。

简介


gensim是一个开源的Python库,用于便捷高效地提取文档中的语义话题。它用于处理原始的、非结构化的电子文本(“纯文本”),gensim中的一些算法,如 Latent Semantic Analysis(潜在语义分析)、 Latent Dirichlet Allocation(潜在Dirichlet分布)、Random Projections(随机预测)通过检查训练文档中的共现实体来挖掘语义结构。


快速上手


import logging
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)

#创建一个小的语料库
from gensim import corpora,models,similarities
corpus=[[(0,1.0),(1,1.0),(2,1.0)],
        [(2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0), (6, 1.0), (8, 1.0)],
        [(1, 1.0), (3, 1.0), (4, 1.0), (7, 1.0)],
        [(0, 1.0), (4, 2.0), (7, 1.0)],
        [(3, 1.0), (5, 1.0), (6, 1.0)],
        [(9, 1.0)],
        [(9, 1.0), (10, 1.0)],
        [(9, 1.0), (10, 1.0), (11, 1.0)],
        [(8, 1.0), (10, 1.0), (11, 1.0)]]

#对向量进行加权
tfidf=models.TfidfModel(corpus)

vec=[(0,1),(4,1)]
print(tfidf[vec])

[(0, 0.8075244024440723), (4, 0.5898341626740045)]

index= similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=12)
sims=index[tfidf[vec]]
print(list(enumerate(sims)))

[(0, 0.4662244), (1, 0.19139354), (2, 0.24600551), (3, 0.82094586), (4, 0.0), (5, 0.0), (6, 0.0), (7, 0.0), (8, 0.0)]


How to read this output? Document number zero (the first document) has a similarity score of 0.466=46.6%, the second document has a similarity score of 19.1% etc.


对语料进行分词


import os
import jieba
sentences_file=open("files/data/python32-sentence.txt",encoding='utf8')
word_file=open("files/data/python32-word.txt","a",encoding="utf8")
lines=sentences_file.readlines()
for line in lines:
    line.replace('\t','').replace('\n','').replace(' ','')
    segment_words=jieba.cut(line,cut_all=False)
    word_file.write(" ".join(segment_words))
sentences_file.close()
word_file.close()


使用gensim的word2vec训练模型



参考:python初步实现word2vec

# 导入包
from gensim.models import word2vec
import logging
#初始化
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)
sentences=word2vec.Text8Corpus("files/data/python32-word.txt")#加载分词语料
model=word2vec.Word2Vec(sentences,size=200)#训练skip-gram模型,默认window=5
print("输出模型",model)
#计算两个单词的相似度
try:
    y1=model.similarity("企业","公司")
except KeyError:
    y1=0
print("【企业】和【公司】的相似度为:{}\n".format(y1))
#/计算某个词的相关词列表
y2=model.most_similar("科技",topn=20)#20个最相关的
print("与【科技】最相关的词有:\n")
for word in y2:
    print(word[0],word[1])
print("*********\n")
#寻找对应关系
print("公司-产品","生产")
y3=model.most_similar(["公司","产品"],["生产"],topn=3)
for word in y3:
    print(word[0],word[1])
print("*********\n")
#寻找不合群的词
y4 =model.doesnt_match(u"企业 公司 是 合作伙伴".split())  
print("不合群的词:{}".format(y4))  
print("***********\n"  )
#保存模型
model.save("企业关系.model")

WARNING:gensim.models.word2vec:under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay
输出模型 Word2Vec(vocab=579, size=200, alpha=0.025)
【企业】和【公司】的相似度为:0.9999545757451112
与【科技】最相关的词有:
, 0.9999620318412781
有限公司 0.9999616146087646
产品 0.9999591708183289
是 0.9999580383300781
和 0.9999551773071289
: 0.9999542832374573
成为 0.9999539256095886
软件 0.9999529719352722
经销商 0.9999511241912842
的 0.9999507069587708
年 0.999950110912323
等 0.999950110912323
技术 0.9999500513076782
美国 0.9999497532844543
月 0.9999494552612305
及 0.999949038028717
企业 0.9999480843544006
核心 0.9999477863311768
公司 0.999947726726532
指定 0.9999475479125977
*********
公司-产品 生产
。 0.9998433589935303
等 0.9998431205749512
的 0.9998403787612915
*********
不合群的词:公司
***********


相关文章
|
机器学习/深度学习 自然语言处理 数据可视化
深入理解 Word Embedding
深入理解 Word Embedding
463 0
|
机器学习/深度学习 自然语言处理 算法
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
|
机器学习/深度学习 自然语言处理 运维
Word2Vec:一种基于预测的方法
Word2Vec:一种基于预测的方法
226 0
|
机器学习/深度学习 存储 人工智能
文本深度表示模型——word2vec&doc2vec词向量模型
NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
文本深度表示模型——word2vec&doc2vec词向量模型
|
自然语言处理 数据可视化 数据处理
基于gensim实现word2vec模型(附案例实战)
基于gensim实现word2vec模型(附案例实战)
694 0
基于gensim实现word2vec模型(附案例实战)
|
机器学习/深度学习 自然语言处理 算法
Word2Vec教程-Skip-Gram模型
这篇教程主要讲述了Word2Vec中的skip gram模型,主要目的是避免普遍的浅层介绍和抽象观点,而是更加详细地探索Word2Vec。现在我们开始研究skip gram模型吧
450 0
Word2Vec教程-Skip-Gram模型
|
机器学习/深度学习 资源调度 自然语言处理
Word Embedding
Word Embedding
125 0
Word Embedding
|
机器学习/深度学习 自然语言处理 算法
词向量Word Embedding原理及生成方法
如何更深入地理解以及快速上手生成Word Embedding呢?本文对Word Embedding原理和生成方法进行了讲解。
959 0
词向量Word Embedding原理及生成方法
|
机器学习/深度学习 自然语言处理 数据建模
一文详解 Word2vec 之 Skip-Gram 模型(结构篇)
这可能是关于 Skip-Gram 模型最详细的讲解。
414 0
|
机器学习/深度学习 自然语言处理 测试技术
基于jieba、gensim.word2vec、LogisticRegression的文档分类
学习资源来源:容大教育,致以诚挚的谢意。 重新编辑:潇洒坤 jieba中文叫做结巴,是一款中文分词工具,官方文档链接:https://github.com/fxsjy/jieba gensim.word2vec中文叫做词向量模型,是是用来文章内容向量化的工具,官方文档链接:https://radimrehurek.com/gensim/models/word2vec.html LogisticRegression中文叫做逻辑回归模型,是一种基础、常用的分类方法。
1543 0