中文短文本相似度:WMD
开篇
句子相似是目前我做问句匹配的基础。
这是我尝试使用词向量,以一种无监督方法去计算两个句子相似度的第二种方法。第一种方法,我尝试使用词向量的加权平均生成句向量来计算句子间的相似度,效果很一般,之后我会尝试使用不同的加权方法再次计算。有机会我会连着代码一起放出来。
当然我还使用了三种不同的深度学习方法来计算相似度,之后都会以代码讲解的方式呈现。本博客没有使用任何公司的数据,也未集成到公司的任何系统中,属于学术型文章开源。
WMD
word mover’s distance 是一种计算句子之间距离的方法,距离越小,相似度越高。看了网上几篇博客,基本是这边抄一下,那边抄一下,内容非常得凌乱。这边也放一篇博客,等我读过原始论文,再来这篇博客来补充相关的理论知识,现在这篇博客希望通过代码让你更快的构建自己的wmd计算函数。迅速实战。
词向量
首先我们还是需要借助词向量,你可以自己下载别人训练好的词向量,或者自己使用gensim训练词向量
关于词向量的训练,我这边不再重复,使用gensim只要几行代码,如果没有相关的经验,可以参考我之前的博客。
WMDdistance
先放出相关的代码,博客的最后我会放出完整的代码,如果有什么疑问欢迎留言。数据是公司的,不会公开,但是有其他数据可以替换。不影响代码的运行。
def wmd(sent1, sent2):
sent1 = word_cut(sent1)
sent2 = word_cut(sent2)
model = KeyedVectors.load_word2vec_format(os.path.join(data_dir, "Word2VecModel_small.vector"))
model.init_sims(replace=True)
#这边是归一化词向量,不加这行的话,计算的距离数据可能会非常大
distance = model.wmdistance(sent1,sent2)
return distance
词向量是一定要加载的。
中文当然是要分词的,这里我使用的是哈工大的分词工具,下面我放出我的代码,这是需要加载的一下模型和词典。
data_dir = "C:\\Users\\d84105613\\PycharmProjects\\Ai_qa\\data"
LTP_DATA_DIR = 'C:\\Users\\d84105613\\ltp_data'
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
segmentor = Segmentor() # 初始化实例
segmentor.load_with_lexicon(cws_model_path, os.path.join(data_dir,'wordDictupper.txt')) # 加载模型
#停用词载入
stopwords = []
stopword = open(os.path.join(data_dir,'stopwords_zh.txt'),'rt',encoding='utf-8')
for line in stopword:
stopwords.append(line.strip())
分词的时候记得把停用词也给去了
def word_cut(sentence):
words = segmentor.segment(sentence)
# segmentor.release()
words = list(words)
# print(len(set(words)))
key = [",", "?", "[", "]"]
words = [c for c in words if c not in punctuation]
words = [c for c in words if c not in key]
words = [c for c in words if c not in stopwords]
return words
搜索相似句子
这边就是问答系统一个简单的功能组件了,给出一个你要查询的句子,在语料库里搜索出最相似的几个句子。感谢gensim提供的库函数。
def get_top_n(document,query,num_best):
corpus = [word_cut(i) for i in document]
model = KeyedVectors.load_word2vec_format(os.path.join(data_dir, "Word2VecModel_small.vector"))
instance = WmdSimilarity(corpus, model, num_best)
query = word_cut(query)
sims = instance[query]
for i in range(num_best):
print(sims[i][1])
print(document[sims[i][0]])
完整代码
import os
from pyltp import Segmentor
from zhon.hanzi import punctuation
from gensim.models import KeyedVectors
from gensim.similarities import WmdSimilarity
data_dir = "C:\\Users\\d84105613\\PycharmProjects\\Ai_qa\\data"
LTP_DATA_DIR = 'C:\\Users\\d84105613\\ltp_data'
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
segmentor = Segmentor() # 初始化实例
segmentor.load_with_lexicon(cws_model_path, os.path.join(data_dir,'wordDictupper.txt')) # 加载模型
#停用词载入
stopwords = []
stopword = open(os.path.join(data_dir,'stopwords_zh.txt'),'rt',encoding='utf-8')
for line in stopword:
stopwords.append(line.strip())
def read_data_sets(train_dir):
s1 = []
s2 = []
for line in open(train_dir, encoding='utf-8'):
l = line.strip().split("¥")
if len(l) < 2:
continue
s1.append(l[0])
s2.append(l[1])
return s1, s2
def word_cut(sentence):
words = segmentor.segment(sentence)
# segmentor.release()
words = list(words)
# print(len(set(words)))
key = [",", "?", "[", "]"]
words = [c for c in words if c not in punctuation]
words = [c for c in words if c not in key]
words = [c for c in words if c not in stopwords]
return words
def wmd(sent1, sent2):
sent1 = word_cut(sent1)
sent2 = word_cut(sent2)
model = KeyedVectors.load_word2vec_format(os.path.join(data_dir, "Word2VecModel_small.vector"))
model.init_sims(replace=True)
distance = model.wmdistance(sent1,sent2)
return distance
def get_top_n(document,query,num_best):
corpus = [word_cut(i) for i in document]
model = KeyedVectors.load_word2vec_format(os.path.join(data_dir, "Word2VecModel_small.vector"))
instance = WmdSimilarity(corpus, model, num_best)
query = word_cut(query)
sims = instance[query]
for i in range(num_best):
print(sims[i][1])
print(document[sims[i][0]])
输出
0.8867670409833355
修改采购计划当前处理人
0.856070758049195
修改BPA当前处理人
0.8339566600760685
缺陷修改当前处理人
0.8040727679959436
修改变更单当前处理人
0.7797357960999256
修改单据当前处理人
Process finished with exit code 0
相关博客代码
补充
之前的代码跑一个批次的数据,大概是6万条要40秒,后续做了一些优化,大概跑6万11秒左右
def overlap(list1,list2):
temp = [i for i in list1 if i in list2]
return len(temp)/len(list1)
def fast_top_n(document, query, num_best):
doc = [word_cut(i) for i in document]
query = word_cut(query)
corpus=[]
document1 = []
for i,j in enumerate(doc):
if overlap(query,j) > 0.25:
corpus.append(doc[i])
document1.append(document[i])
model = KeyedVectors.load_word2vec_format(os.path.join(data_dir, "Word2VecModel_small.vector"))
instance = WmdSimilarity(corpus, model, num_best)
sims = instance[query]
for i in range(num_best):
print(sims[i][1])
print(document1[sims[i][0]])
---------------------
作者:Ding_xiaofei
来源:CSDN
原文:https://blog.csdn.net/Ding_xiaofei/article/details/81034058
版权声明:本文为博主原创文章,转载请附上博文链接!
中文短文本相似度:WMD相关推荐
- [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算
从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例.本篇文章将分享 ...
- gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算 | CSDN博文精选
作者 | Eastmount 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多精彩文章) 本篇文章将分享gensim词向量Word2Vec安装.基础用法,并实现<庆余年>中文短文 ...
- 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处
新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...
- 【TF-IDF】传统方法TF-IDF解决短文本相似度问题
机器学习算法与自然语言处理出品 @公众号原创专栏作者 刘聪NLP 学校 | 中国药科大学 药学信息学硕士 知乎专栏 | 自然语言处理相关论文 前几天写了一篇短文本相似度算法研究的文章,不过里面介绍的方 ...
- 小布助手在面向中文短文本的实体链指比赛中的实践应用
背景介绍 实体链指是指对于给定的一个文本(如搜索Query.微博.对话内容.文章.视频.图片的标题等),将其中的实体与给定知识库中对应的实体进行关联.实体链指一般有两种任务设计方式:Pipeline式 ...
- ccks2020中文短文本实体链接任务测评论文--小米团队--第一名
测评论文名:面向中文短文本的多因子融合实体链指研究 官网文档链接:http://sigkg.cn/ccks2020/?page_id=700 本笔记主要将测评论文中的主要内容提炼,方便后续借鉴,读者可 ...
- 【论文翻译】2020.8 清华大学AI课题组——大型中文短文本对话数据集(A Large-Scale Chinese Short-Text Conversation Dataset)
大型中文短文本对话数据集 写在前面: 研究用,原创翻译,转载请标明出处:第一次译文,之后会跟进完善.侵删. 今年暑假末,清华大学公开了大型对话数据集及预训练模型.该数据集融合各大社交媒体对话数据库 ...
- 基于深度学习的短文本相似度学习与行业测评
文本相似度计算作为NLP的热点研究方向之一,在搜索推荐.智能客服.闲聊等领域得到的广泛的应用.在不同的应用领域,也存在着一定的差异,例如在搜索领域大多是计算query与document的相似度:而在智 ...
- 短文本相似度算法研究
短文本相似度,即求解两个短文本之间的相似程度:它是文本匹配任务或文本蕴含任务的一种特殊形式,返回文本之间相似程度的具体数值.然而在工业界中,短文本相似度计算占有举足轻重的地位. 例如:在问答系统任务( ...
最新文章
- linux下安装ftp服务器
- $HOME/$user/.权限导致用户无法登陆图形界面
- PERL模拟飞鸽传书文件传输总结
- 是时候了解React Native了
- 基于XML的AOP配置
- MYSQL–my.cnf配置中文详解
- 大数据技术发展需注意那些问题
- 381.O(1)时间插入、删除和获取随机元素-允许重复
- 动物识别系统 c语言代码_C++程序员避不开虚函数的,就像C语言程序员避不开指针一样...
- IDEAIU-version2019.2百度网盘下载
- 输入两个正整数m和n,求其最大公约数和最小公倍数。
- Qt之调用笔记本摄像头录像功能
- AcWing 658. 一元二次方程公式
- 八月流火,谁是京东数科最燃的研发人?
- win7电脑蓝屏怎么办
- Python爬虫入门(一)(适合初学者)
- 读书笔记之——《谷歌和亚马逊如何做产品》
- STM32F103C8T6移植uCOS基于HAL库
- APICloud App开发上手经验分享之模块调用
- 如何控制UPS不间断电源的温度
热门文章
- llist对象两个属性相乘在相加_Java8使用stream实现list中对象属性的合并(去重并求和)...
- 斯坦福马超:随机梯度下降,也爱躺「平」……why?
- 《AI系统周刊》第1期:社群招新,打通智能计算软硬件“任督二脉”
- 智源论坛报名 | 智能体系架构与芯片
- 蚂蚁集团研究员王益:Go+ 可有效补全 Python 的不足
- 《Decoupling Representation and Classifier》笔记
- starGAN原理代码分析
- 谷歌新发布的分布式数据库服务,是要打破CAP定理了吗?
- 轮椅上的博士矣晓沅:9 年求学路,我从清华毕业了
- 独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出