词语相似度计算

在商品搜索的过程中,可以计算用户输入的关键字与数据库中商品名间的相似度,在商品数据库中找出相似度最大的商品,推荐给用户。比如“凳子”跟“椅子”的语意更相近,跟“香蕉”或“冰箱”的语意相对较远,这种相近的程度就是词语的相似度。在实际的工程开发中可以通过word2vec实现词语相似度的计算。

from sklearn.datasets import fetch_20newsgroupsnews = fetch_20newsgroups(subset='all')
X, y = news.data, news.targetfrom bs4 import BeautifulSoup
import nltk, re# 把段落分解成由句子组成的list(每个句子又被分解成词语)
def news_to_sentences(news):news_text = BeautifulSoup(news, 'lxml').get_text()tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')raw_sentences = tokenizer.tokenize(news_text)# 对每个句子进行处理,分解成词语sentences = []for sent in raw_sentences:sentences.append(re.sub('[^a-zA-Z]', ' ', sent.lower().strip()).split())return sentencessentences = []for x in X:sentences += news_to_sentences(x)# import numpy
# # 将预处理过的"词库"保存到文件中,便于调试
# numpy_array = numpy.array(sentences)
# numpy.save('sentences.npy', numpy_array)
#
# # 将预处理后的"词库"从文件中读出,便于调试
# numpy_array = numpy.load('sentences.npy')
# sentences = numpy_array.tolist()from gensim.models import word2vecmodel = word2vec.Word2Vec(sentences, workers=2, size=300, min_count=20, window=5,sample=1e-3)model.init_sims(replace=True)# 保存word2vec训练参数便于调试
# model.wv.save_word2vec_format('word2vec_model.bin', binary=True)
# model.wv.load_word2vec_format('word2vec_model.bin', binary=True)print('词语相似度计算:')
print('morning vs morning:{0}').format(model.n_similarity('morning', 'morning'))
print('morning vs afternoon:{0}').format(model.n_similarity('morning', 'afternoon'))
print('morning vs hello:{0}').format(model.n_similarity('morning', 'hello'))
print('morning vs shell:{0}').format(model.n_similarity('morning', 'shell'))# 运行结果
morning vs morning:1.0
morning vs afternoon:0.871482
morning vs hello:0.731609
morning vs shell:0.709714

调试技巧

在开发调试的过程中,会出现错误,需要重新运行程序。如果每次修改后,都从头开始执行,肯定会消耗很多无用的时间。比如,预处理后的文本结果和word2vec的训练参数,这些中间结果可以保持下来,当遇到问题时,就可以从文件中读取结果,而不需要每次都从头开始。

gensim库word2vec的使用详解

from gensim.models import Word2Vec
model = Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)# 训练后的模型保存与加载
model.save(fname)
model = Word2Vec.load(fname)# 模型使用(词语相似度计算等)
model.most_similar(positive=['woman', 'king'], negative=['man'])
#输出[('queen', 0.50882536), ...] model.doesnt_match("breakfast cereal dinner lunch".split())  # 找出不匹配的词语
#输出'cereal' model.similarity('woman', 'man')  # 两个词的相似性距离
#输出0.73723527 model['computer']     # 输出单词向量
#输出array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)

参数解释:

1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。

2.size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。

3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。

4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。

5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。

6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。

7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。

详细参数说明可查看word2vec源代码。

Python基于word2vec的词语相似度计算相关推荐

  1. 词语相似度计算:6、实验报告

    词汇相似度计算报告 摘要 1 一.简介 2 二.工具和资源说明 5 三.实验方法 5 3.1.方法1 5 3.2.方法2 6 3.3.方法3 6 3.4.方法4 7 3.5.方法5 7 3.6.方法6 ...

  2. 同义词词林 java_基于同义词词林扩展版的词语相似度计算

    词语相似度计算 词义相似度计算在很多领域中都有广泛的应用,例如信息检索.信息抽取.文本分类.词义排歧.基于实例的机器翻译等等.国内目前主要是使用知网和同义词词林来进行词语的相似度计算. 本文主要是根据 ...

  3. 基于多重继承与信息内容的知网词语相似度计算 - 论文及代码讲解

    文章目录 概念 example.py HybridSim.py howNet.py 论文:<基于多重继承与信息内容的知网词语相似度计算>-2017-张波,陈宏朝等 查看 代码:https: ...

  4. 基于信息内容的词林词语相似度计算 - 论文及代码讲解

    文章目录 论文 同义词林简介 特点 代码 获取词的编码 求IC值 求相似度 选取相似度最大值 论文:<基于信息内容的词林词语相似度计算 >-2018-彭琦,朱新华等 查看 代码:https ...

  5. Google开源word2vec,文本相似度计算工具

    Google开源word2vec,文本相似度计算工具 谷歌已经使用Deep Learning技术开发了许多新方法来解析语言,目前,谷歌开源了一款基于Deep Learning的学习工具--word2v ...

  6. Python简单实现基于VSM的余弦相似度计算

    在知识图谱构建阶段的实体对齐和属性值决策.判断一篇文章是否是你喜欢的文章.比较两篇文章的相似性等实例中,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知 ...

  7. 机器学习算法Python实现:word2vec 求词语相似度

    #!/usr/bin/env Python3 # coding=utf-8 import jieba jieba.load_userdict("C:\\Users\\Desktop\\s_p ...

  8. 【NLP实战】基于ALBERT的文本相似度计算

    实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式.因此,NLP专栏推出了实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试. ALBERT是一个比BERT要轻量,效果更好的模型,本篇 ...

  9. 基于Java的文本相似度计算

    目录 1. 前言 1.1 开发环境: 1.2 初步设想 1.3 参考资料 2. HanLP 2.1 在Java中使用HanLP库 2.2 分词函数 3. 双文本对比 3.1 步骤分解 3.2 完整代码 ...

最新文章

  1. python官网下载步骤64位-Python 3.7 64位下载
  2. 啦啦啦 啦啦 啦 啦 啦 啦啦 啦 啦 啦
  3. Fiddler建好代理后,能连到手机,但手机不能上网了,求破有果
  4. Verilg 2001相对于Verilog 1995的改进(Z) (内含 乘方 运算符** )
  5. mppt多峰追踪MATLAB仿真,基于光伏功率等效面积法的多峰最大功率追踪控制方法...
  6. java canvas类_java中的canvas类有什么作用?
  7. sqlserver中系统库的作用
  8. Palindrome Number之Java实现
  9. 如何学习渗透测试:初学者教程
  10. 计算机管理里面和打印机相关的,打印机设备
  11. ABAP报表添加点击跳转事务的方法
  12. 晶体管介绍工作原理与历史
  13. python零基础电子书免费下载-零基础入门学习Python PDF 扫描版
  14. c语言错误c2198,这段哪里错了。。。
  15. ipad发布会ipad_如何在iPad上调试网站
  16. cesium 指南针、图例插件
  17. RISC-V 架构指令集手册 第一册 无特权指令集 中文翻译
  18. 视频会议时听不到声音该如何处理?
  19. 什么是防火墙,为什么你需要防火墙?
  20. 用计算机做科学实验课本,科学小实验课后总结

热门文章

  1. VR制作中必须踩的坑365之045(oculus2、UE4、UE5、VR记录一年的踩坑之旅)iclone8来来来告诉你剁手坑
  2. 传奇一条龙php源码,GOM引擎传奇一条龙版本十步一杀、冰霜群雨、死亡之眼新技能脚本...
  3. Zero date value prohibited解决办法
  4. 透明表盘 指南针 app_指南:在Web设计中使用透明度(不透明度)
  5. 数控计算机软件的确认表怎么做,[计算机软件及应用]单元3 数控编程基础.doc
  6. 学习游戏3D美术设计一般会用到什么软件?
  7. GitLab中的备份
  8. JavaScript基础知识总结 17:JavaScript表单脚本
  9. 基于Netty开发水利通信软件
  10. [附源码]java毕业设计汽车销售网站论文