开篇

句子相似是目前我做问句匹配的基础。

这是我尝试使用词向量,以一种无监督方法去计算两个句子相似度的第二种方法。第一种方法,我尝试使用词向量的加权平均生成句向量来计算句子间的相似度,效果很一般,之后我会尝试使用不同的加权方法再次计算。有机会我会连着代码一起放出来。
当然我还使用了三种不同的深度学习方法来计算相似度,之后都会以代码讲解的方式呈现。本博客没有使用任何公司的数据,也未集成到公司的任何系统中,属于学术型文章开源。

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相关推荐

  1. [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例.本篇文章将分享 ...

  2. gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算 | CSDN博文精选

    作者 | Eastmount 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多精彩文章) 本篇文章将分享gensim词向量Word2Vec安装.基础用法,并实现<庆余年>中文短文 ...

  3. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处

    新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...

  4. 【TF-IDF】传统方法TF-IDF解决短文本相似度问题

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 刘聪NLP 学校 | 中国药科大学 药学信息学硕士 知乎专栏 | 自然语言处理相关论文 前几天写了一篇短文本相似度算法研究的文章,不过里面介绍的方 ...

  5. 小布助手在面向中文短文本的实体链指比赛中的实践应用

    背景介绍 实体链指是指对于给定的一个文本(如搜索Query.微博.对话内容.文章.视频.图片的标题等),将其中的实体与给定知识库中对应的实体进行关联.实体链指一般有两种任务设计方式:Pipeline式 ...

  6. ccks2020中文短文本实体链接任务测评论文--小米团队--第一名

    测评论文名:面向中文短文本的多因子融合实体链指研究 官网文档链接:http://sigkg.cn/ccks2020/?page_id=700 本笔记主要将测评论文中的主要内容提炼,方便后续借鉴,读者可 ...

  7. 【论文翻译】2020.8 清华大学AI课题组——大型中文短文本对话数据集(A Large-Scale Chinese Short-Text Conversation Dataset)

    大型中文短文本对话数据集 写在前面: 研究用,原创翻译,转载请标明出处:第一次译文,之后会跟进完善.侵删.   今年暑假末,清华大学公开了大型对话数据集及预训练模型.该数据集融合各大社交媒体对话数据库 ...

  8. 基于深度学习的短文本相似度学习与行业测评

    文本相似度计算作为NLP的热点研究方向之一,在搜索推荐.智能客服.闲聊等领域得到的广泛的应用.在不同的应用领域,也存在着一定的差异,例如在搜索领域大多是计算query与document的相似度:而在智 ...

  9. 短文本相似度算法研究

    短文本相似度,即求解两个短文本之间的相似程度:它是文本匹配任务或文本蕴含任务的一种特殊形式,返回文本之间相似程度的具体数值.然而在工业界中,短文本相似度计算占有举足轻重的地位. 例如:在问答系统任务( ...

最新文章

  1. linux下安装ftp服务器
  2. $HOME/$user/.权限导致用户无法登陆图形界面
  3. PERL模拟飞鸽传书文件传输总结
  4. 是时候了解React Native了
  5. 基于XML的AOP配置
  6. MYSQL–my.cnf配置中文详解
  7. 大数据技术发展需注意那些问题
  8. 381.O(1)时间插入、删除和获取随机元素-允许重复
  9. 动物识别系统 c语言代码_C++程序员避不开虚函数的,就像C语言程序员避不开指针一样...
  10. IDEAIU-version2019.2百度网盘下载
  11. 输入两个正整数m和n,求其最大公约数和最小公倍数。
  12. Qt之调用笔记本摄像头录像功能
  13. AcWing 658. 一元二次方程公式
  14. 八月流火,谁是京东数科最燃的研发人?
  15. win7电脑蓝屏怎么办
  16. Python爬虫入门(一)(适合初学者)
  17. 读书笔记之——《谷歌和亚马逊如何做产品》
  18. STM32F103C8T6移植uCOS基于HAL库
  19. APICloud App开发上手经验分享之模块调用
  20. 如何控制UPS不间断电源的温度

热门文章

  1. llist对象两个属性相乘在相加_Java8使用stream实现list中对象属性的合并(去重并求和)...
  2. 斯坦福马超:随机梯度下降,也爱躺「平」……why?
  3. 《AI系统周刊》第1期:社群招新,打通智能计算软硬件“任督二脉”
  4. 智源论坛报名 | 智能体系架构与芯片
  5. 蚂蚁集团研究员王益:Go+ 可有效补全 Python 的不足
  6. 《Decoupling Representation and Classifier》笔记
  7. starGAN原理代码分析
  8. 谷歌新发布的分布式数据库服务,是要打破CAP定理了吗?
  9. 轮椅上的博士矣晓沅:9 年求学路,我从清华毕业了
  10. 独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出