word2vec的应用:gensim相似度检测(附代码)

上篇写的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')#保留模型.方便重用


结果如下:

 

 

猜你喜欢

转载自blog.csdn.net/weixin_37567451/article/details/81131608