上篇写的word2vec的相关算法,这篇附上代码。其中我们的语料是小说“人民的名义”,百度云盘:https://pan.baidu.com/s/1ggA4QwN
首先是进行分词:
#-*-coding:utf-8 -*-
import jieba.analyse
import jieba
jieba.suggest_freq('沙瑞金',True)
jieba.suggest_freq('田国富',True)
jieba.suggest_freq('高育良',True)
jieba.suggest_freq('侯亮平',True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('京州市', True)
jieba.suggest_freq('副市长', True)
jieba.suggest_freq('赵德汉',True)
with open('in_the_name_of_people.txt','rb') as f:
document=f.read()
document_cut=jieba.cut(document,cut_all=False)
result=' '.join(document_cut)
result=result.encode('utf-8')
with open('分词后的人民的名义.txt','wb+') as f1:
f1.write(result)
f.close()
f1.close()
分词后的txt文件为:
然后用word2vec模型实现相似度检测:
#-*-coding:utf-8 -*-
from gensim.models import word2vec
import logging
#获得日志信息
logging.basicConfig(format='%(asctime)s:%(leveltime)s:%(message)s',level=logging.INFO)
#加载此分类后的文本,使用的是Ttext2Corpus类
sentences=word2vec.Text8Corpus(r'分词后的人民的名义.txt')
#训练模型,部分参数如下
model=word2vec.Word2Vec(sentences,size=100,hs=1,min_count=1,window=3)
print('--------------------分割线----------------------')
#计算两个词向量的相似度
try:
sim1=model.similarity(u'沙瑞金',u'高育良')
sim2=model.similarity(u'李达康',u'易学习')
except KeyError:
sim1=0
sim2=0
print(u'沙瑞金 和 高育良 的相似度为',sim1)
print(u'李达康 和 易学习 的相似度为',sim2)
print('--------------------分割线----------------------')
#与某个词(李达康)最相近的3个字的词
print(u'与李达康最相近的3个字的词')
req_count=5 #求出5个与李达康相近的3个字的词
for key in model.similar_by_word(u'李达康',topn=100):
if len(key[0])==3: #key[0]应该就表示某个词
req_count-=1
print(key[0],key[1]) #某一个词,某一个词出现的概率
if req_count==0:
break;
print('--------------------分割线----------------------')
#上面是规定了只输出5个,这里是10个,就是取决于topn的值
for key in model.similar_by_word(u'李达康',topn=10):
if len(key[0])==3: #key[0]应该就表示某个词
print(key[0],key[1]) #某一个词,某一个词出现的概率
print('--------------------分割线----------------------')
#计算某个词的相关列表
try:
sim3=model.most_similar(u'不是',topn=20)
print(u'和 不是 与相关的词有: \n')
for key in sim3:
print(key[0],key[1])
except:
print( 'error')
print('--------------------分割线----------------------')
#找出不同类的词
sim4=model.doesnt_match(u'我 你 他 难道'.split())
print(u'这类人物中不同类的人名',sim4)
print('--------------------分割线----------------------')
model.save(u'人民的名义.model')#保留模型.方便重用
结果如下: