文本匹配和语义匹配

1、什么是文本匹配?

文本匹配是自然语言处理中一个重要的基础问题,可以应用于大量的NLP任务中,如信息检索、问答系统、复述问题、对话系统、机器翻译等,这些NLP任务在很大程度上可以抽象为文本匹配问题。

例如网页搜索可抽象为网页同用户搜索Query的一个相关性匹配问题,自动问答可抽象为候选答案与问题的满足度匹配问题,文本去重可以抽象为文本与文本的相似度匹配问题。

2、文本匹配方法概述

2-1 传统文本匹配方法

传统的文本匹配技术有BoW、VSM、TF-IDF、 BM25、Jaccord、SimHash等算法,如BM25算法通过网络字段对查询字段的覆盖程度来计算两者间的匹配得分,得分越高的网页与查询的匹配度更好。主要解决词汇层面的匹配问题,或者说词汇层面的相似度问题。而实际上,基于词汇重合度的匹配算法有很大的局限性,原因包括:

  • 词义局限:“的士”和“出租车”虽然字面上不相似,但实际为同一种交通工具;“苹果”在不同的语境下表示不同的东西,或为水果或为公司
  • 结构局限:“机器学习”和“学习机器”虽然词汇完全重合,但表达的意思不同。
  • 知识局限:“秦始皇打Dota”,这句话虽从词法和句法上看均没问题,但结合知识看这句话是不对的。

这表明,**对于文本匹配任务,不能只停留在字面匹配层面,更需要语义层面的匹配。**而语义层面的匹配,首先面临语义如何表示,如何计算的问题。

2-2 主题模型

属于无监督技术

上世纪90年代逐渐流行起来语义分析技术(Latent Sementic Analysis, LSA),开辟了一个新思路。将语句映射到等长的低维连续空间,可在此隐式的潜在语义空间上进行相似度计算。

此后,又有PLSA(Probabilistic Latent Semantic Analysis)、LDA(Latent Dirichlet Allocation)等更高级的概率模型被设计出来,逐渐形成非常火热的 主题模型 技术方向。

这些技术对文本的语义表示形式简洁、运算方便,较好地弥补了传统词汇匹配方法的不足。不过从效果上来看,这些技术都无法替代字面匹配技术,只能作为字面匹配的有效补充。

2-3 深度语义匹配模型

随着深度学习在计算机视觉、语音识别和推荐系统领域中的成功运用,近年来有很多研究致力于将深度神经网络模型应用于自然语言处理任务,以降低特征工程的成本。

基于神经网络训练出的Word Embedding来进行文本匹配计算,训练方式简洁,所得的词语向量表示的语义可计算性进一步加强。但是只利用无标注数据训练得到的Word Embedding在匹配度计算的实用效果上和主题模型技术相差不大。他们本质都是基于共现信息的训练。另外,Word Embedding本身没有解决短语、句子的语义表示问题,也没有解决匹配的非对称性问题。

一般来说,深度文本匹配模型分为两种类型: 表示型和交互型

表示型

表示型模型更侧重对表示层的构建,会在表示层将文本转换成唯一的一个整体表示向量。

  • representation-based类模型,思路是基于 Siamese 网络,提取文本整体语义再进行匹配
  • 典型的Siamese结构,双塔共享参数,将两文本映射到统一空间,才具有匹配意义
  • 表整层进行编码,使用MLP, CNN, RNN, Self-attention, Transformer encoder, BERT均可
  • 匹配层进行交互计算,采用点积、余弦、高斯距离、MLP、相似度矩阵均可
  • 经典模型有:DSSM, CDSSM, MV-LSTM, ARC-I, CNTN, CA-RNN, MultiGranCNN等

优点:可以对文本预处理,构建索引,大幅度降低在线计算耗时
缺点:失去语义焦点,易语义漂移,难以衡量词的上下文重要性。

相关算法

  • DSSM: 2013年由微软Redmond研究院发表,全称DSSM(Deep Structured Semantic Models)
  • CDSSM:2014年由微软提出,弥补了DSSM会丢失上下文的问题,全称Convolutional latent semantic
    model(又称CLSM)
    - 主要将DNN替换成了CNN
  • MV-DSSM:2016年由微软发表,MV为Multi-View,一般可以理解为多视角的DSSM
  • ARC-I:2014年由华为若亚方舟实验室提出

交互型

交互性模型摒弃后匹配的思路,假设全局的匹配度依赖于局部的匹配度,在输入层就进行词语间的先匹配,并将匹配的结果作为灰度图进行后续的建模。

  • interaction-based类模型,思路是捕捉直接的匹配信号(模式),将词间的匹配信号作为灰度图,再进行后续建模抽象
  • 交互层,由两文本词与词构成交互矩阵,交互运算类似于 attention,加性乘性都可以
  • 表征层,负责对交互矩阵进行抽象表征,CNN、S-RNN均可
  • 经典模型有:ARC-II、MatchPyramid、Match-SRNN、K-NRM、DRMM、DeepRank、DUET、IR-Transformer、
    DeepMatch、ESIM、ABCNN、BIMPM等
    优点:更好地把握了语义焦点,能对上下文重要性进行更好的建模
    缺点:忽视了句法、句间对照等全局性信息,无法由局部匹配信息刻画全局匹配信息

相关算法

  • ARC-II:2014年由华为诺亚方舟实验室提出
  • MatchPyramid:2016年由中科院提出
  • ABCNN:2016年由IBM提出
  • ESIM:2017年由朱晓丹提出

3、语义匹配应用介绍

工业界的很多应用都有在语义上衡量文本相似度的需求,我们将这类需求统称为“语义匹配”。
根据文本长度的不同,语义匹配可以细分为三类

  • 短文本-短文本语义匹配
  • 短文本-长文本语义匹配
  • 长文本-长文本语义匹配

基于主题模型的语义匹配通常作为经典文本匹配技术的补充,而不是取代传统的文本匹配技术(上文有提到)。

3-1 短文本-短文本语义匹配

该类型在工业界的应用场景很广泛。如,
在网页搜索中,需要度量用户查询(Query)和网页标题(web page title)的语义相关性;
在Query查询中,需要度量 Query和其他 Query之间的相似度。

由于主题模型在短文本上的效果不太理想,在短文本-短文本匹配任务中 词向量的应用 比主题模型更为普遍。简单的任务可以使用Word2Vec这种浅层的神经网络模型训练出来的词向量。

如,计算两个Query的相似度, q1 = "推荐好看的电影"与 q2 = “2016年好看的电影”。

  1. 通过词向量按位累加的方式,计算这两个Query的向量表示
  2. 利用余弦相似度(Cosine Similarity)计算两个向量的相似度。

对于较难的短文本-短文本匹配任务,考虑引入有监督信号并利用“DSSM”或“CLSM”这些更复杂的神经网络进行语义相关性的计算。

总结

  • 使用词向量按位累加方式获取句向量,使用距离度量获取相似度
  • 利用DSSM等方法进行匹配度计算

3-2 短文本-长文本语义匹配

短文本-长文本语义匹配的应用场景在工业界非常普遍。例如,
在搜索引擎中,需要计算用户 Query 和一个网页正文(content)的语义相关度。由于 Query 通常较短,因此 Query 与 content 的匹配与上文提到的短文本-短文本不同,通常需要使用短文本-长文本语义匹配,以得到更好的匹配效果。

在计算相似度的时候,我们规避对短文本直接进行主题映射,而是根据长文本的 主题分布,计算该分布生成短文本的概率,作为他们之间的相似度。

其中,q表示Query,c表示content, w表示q中的表示第k个主题。

案例1-用户查询-广告页面相似度

在线广告场景中,需要计算用户查询和广告页面的语义相似度。这时可应用sentence LDA,将广告页面中各个域的文本视为句子,如下图所示,红框内为句子。

  • 通过主题模型学习得到广告的主题分布
  • 使用上面的公式计算查询和广告页面的语义相似度

该相似度可作为一维特征,应用在更复杂的排序模型中。

在下图图4中,对 query=“婚庆拍摄”,我们对比了不同特征组合的结果。其中作图为 Baseline, 右图则是引入Sentence LDA相似度(基于Sentence LDA计算query与广告页面的相似度)后得到的结果。可以看出,相比于Baseline,引入新特征后召回的结果更符合 query语义,能更好的满足用户需求。

案例2:文档关键词抽取

在分析文档时,往往会抽取一些文档的关键词做标签(tag),这些tag在用户画像和推荐任务中扮演着重要角色。从文档中抽取关键词,常用方法是TF和IDF信息。此外,还可利用主题模型,估计一个文档产生单词的概率作为该单词的重要度指标:



下面一段文字是我们随机从网上取的一个新闻片段,对其进行分词处理以及应用主题模型LDA 或 TWE后,然后分别选取公式(2)或公式(3)计算每个词的重要度。在表5中,我们列出了 LDA 和 TWE模型计算得到的 Top-10 关键词集合 (已去除停用词)。从表中可以看出,采用 TWE 得到的 Top-10 关键词 能更好地体现出新闻的重要信息。

台湾《自由时报》4 月 13 日综合外媒报道称,全美发起拒搭联航运动,并在社群网站上 发酵。居住在美国纽约的网友许柏祥表示,本身是联合航空会员,在得知联航将乘客拖下飞 机后,就向航空公司取消下个月的预订班机,并称“我不想被人打!”许柏祥说,他完全不能 接受航空公司的处理方式,而且是对待一名 69 岁的老人。报道称,联航会员“剪卡”风潮也 席卷社群网路,许多网友将自己的联航会员卡剪掉抵制。网友萨赫哈(Aninda Sadhukhan)表 示,身为联航多年的乘客,在看到影片后,让他决定不再搭联航,并将会员卡放入碎卡机内。 另一名会员布朗(Phyllis Brown)表示,呼吁民众剪掉联航会员卡,并改搭其他航空公司班机,以此抗议联航暴力对待乘客。

总结

  • 利用主题模型或者其他方法如TF-IDF方法获取长本文的主题分布/提取关键词
  • 计算Querry与文档主题/提取关键词之间的相似度

3-3 长文本-长文本语义匹配

通过使用主题模型,我们可以得到两个长文本的主题分布,再通过计算两个多项式分布的距离来衡量它们之间的相似度。衡量多项式的距离 可以利用Hellinger Distance和Jensen-Shannon Divergence(JSD)。

案例3:新闻个性化推荐

长文本-长文本的语义匹配可用于个性化推荐的任务中。在互联网应用中,当我们积累了用户大量的行为信息后,这些行为信息对应的文本内容可以组合成一篇抽象的“文档”,对该“文档”进行主题映射 后获得的 主题分布 作为用户画像。

例如,在新闻个性化推荐中,我们可以将用户近期阅读的新闻(或新闻标题)合并成一篇长“文档”,并将该“文档”的主题分布作为表达用户阅读兴趣的用户画像。如图5所示,通过计算每篇实时新闻的主题分布与用户画像之间的Hellinger Distance,可作为向用户推送新闻的选择依据,达到新闻个性化推荐的效果。

总结

  • 分别计算长文本的主题分布
  • 计算两个多项式分布之间的距离作为相似度度量

NLP--文本丶语义匹配方法概述详解相关推荐

  1. php获取访问量文本形式,php利用用文本统计访问量的方法图文详解

    这篇文章主要介绍了php使用文本统计访问量的方法,涉及php文本文件读写与数值运算的相关技巧,需要的朋友可以参考下 方法1: $fp = fopen("counter.txt", ...

  2. 自然语言处理NLP星空智能对话机器人系列:第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解

    自然语言处理NLP星空智能对话机器人系列: 第21章:基于Bayesian Theory的MRC文本理解基础经典模型算法详解 1,Bayesian prior在模型训练时候对Weight控制.训练速度 ...

  3. 最新ChatGPT GPT-4 相似匹配Embedding技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(一)

    目录 前言 最新ChatGPT GPT-4 相似匹配Embedding技术详解 1. 何为Embedding 2. 相关API 2.1 LMAS Embedding API 2.2 ChatGPT S ...

  4. jquery方法属性详解

    jquery方法属性详解! 1.jquery简介 jquery是什么,作用是什么? jquery用来简化js操作DOM元素 jquery不能用DOM的方法,DOM不能用jquery的方法 各种选择器的 ...

  5. Linux文本处理必杀技之awk应用详解

    AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母 ...

  6. mvc ajax提交html标签,Mvc提交表单的四种方法全程详解

    Mvc提交表单的四种方法全程详解 2019-01-05 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了Mvc提交表单的四种方法全程详解,编程之家小编觉得挺不错的 ...

  7. Java的JVM运行时栈结构和方法调用详解

    详细介绍了Java 的JVM的运行时栈结构,以及和方法调用详解,包括解析调用和分派调用. JVM对于方法的执行是基于栈的,方法调用--入栈,方法调用完毕--出栈,了解JVM的运行时栈结构,有助于我们更 ...

  8. java 获取用户的MAC地址多种方法实例详解

    java 获取用户的MAC地址多种方法实例详解 这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下 java实现获取用户的MAC地址方法: 方法一:将本机地址与局域 ...

  9. go语言字符串换行_Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...

最新文章

  1. 关于vmware虚拟机linux的扩容问题
  2. 在centos6中安装2.4版本的HTTPd
  3. 情人节来了!没有50W彩礼,女朋友被强行拖走。。。
  4. 【Pytorch神经网络实战案例】07 预测泰坦尼克号上生存的乘客
  5. 排序算法(4)----快速排序
  6. 苹果手机没充满电就拔下,会对电池造成伤害吗?
  7. 用汉堡包的方式评价一下自己的合作伙伴
  8. ubuntu日常使用指南
  9. 【HBZ】生产环境下如何解决CPU飙高 与排查CPU飙高问题 与如何解决内存泄漏
  10. 小蝌蚪找妈妈(召唤神龙)源码
  11. 2DPCA的原理推导与实现
  12. 成绩不好的穷孩子,该做出选择了
  13. Android之Fragment回退栈详解
  14. VS2015使用WTL库的ribbon风格界面的注意事项
  15. php 中cookie的简介,setcookile() 的用法,如何理解cookie
  16. 程序员的高薪还能持续吗?
  17. HDU 5250 三阶魔方(模拟、置换)
  18. 混合策略改进的蝴蝶优化算法-附代码
  19. 关于配置好虚拟主机后localhost不能访问的问题
  20. Android 国家化的坑 - 小数点变成逗号

热门文章

  1. Android Q 存储新特性适配脑壳疼?指南来了!
  2. C语言extren关键字详解
  3. kettle mysql连接超时_kettle 数据库连接中断重置
  4. C++ 内存中堆栈讲解
  5. java图片旋转代码
  6. 原生js实现歌词滚动以及卡拉OK效果
  7. Android中自动拦截电话
  8. android 拦截国外电话号码,Android拦截外拨电话程序示例
  9. 【物联网硬件安全】二、固件分析-固件提取
  10. hdu-2814-Interesting Fibonacci-斐波那契循环节