浅析文本相似度

浅析文本相似度在自然语言处理 NaturalLangu NLP 中 经常会涉及到如何度量两个文本的相似度问题 在诸如对话系统 Dialogsystem 和信息检索 Informationr 等的问题中 如何度量句子或者短语之间的相似度尤为重要 为方便对知识的梳理 写下这篇博客对部分传统方法 词向量 深度学习方法进行总结 遗漏之处还请大家补充 度量文

1 基于关键词匹配

1.1 N-gram 相似度
Similarity=|GN(S)|+|GN(T)|2|GN(S)GN(T)| S i m i l a r i t y = | G N ( S ) | + | G N ( T ) | − 2 ∗ | G N ( S ) ∩ G N ( T ) |



  其中, GN(S) G N ( S ) GN(T) G N ( T ) 分别表示字符串S和T中N-Gram的集合,N一般取2或3。字符串距离越近,它们就越相似,当两个字符串完全相等时,距离为0。

1.2 Jaccard 相似度
J(A,B)=|AB||AB| J ( A , B ) = | A ∩ B | | A ∪ B |


  其中 0J(A,B)1 0 ≤ J ( A , B ) ≤ 1

2 基于向量空间

  关于如何表达词意目前有三种方法,第一种的代表就是WordNet,它提供了一种词的分类资源但是缺少了词之间的细微区别,同时它也很难计算词之间的相似度;第二种就是Discrete representation,如One-hot representation,它的向量维度和词典的长度相同,因此向量维度可能十分高,同时由于向量之间本身正交,无法计算词之间的相似度;第三种就是Distributed representation,基本想法就是将每个词映射为一个固定长度的短向量(相对于one-hot representation而言),所有这些词构成一个词向量空间,每一个向量视为空间中的一个点,在这个空间引入“距离”,就可以根据词之间的距离来判断它们之间的相似性,代表方法如word2vec, LDA等。

2.1 Word2vec
2.2 TF-IDF

  TF-IDF的核心思想是:在一篇文章中,某个词语的重要性与该词语在这篇文章中出现的次数成正相关,同时与整个语料库中出现该词语的文章数成负相关.
  TF(term frequency):词频,某一个给定的词语在该文件中出现的频率,表示一个词语与该文章的相关性。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。
  IDF(inverse document frequency):逆向文件词频,表示一个词语出现的普遍程度。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
  一篇文章中某个词语的重要程度,可以标记为词频和逆向文件词频的乘积,


tfidf=tfidf t f i d f = t f ∗ i d f


  通过计算出文档中每个词的TF-IDF值,然后结合相似度计算方法(一般采用余弦相似度)就可以计算两个文档的相似度。采用TF-IDF的前提是“文章的词语重要性与词语在文章中出现的位置不相关”。

2.3 LSA

//TODO

2.4 相似度计算
2.4.1 欧式距离
d=i=1n(xiyi)2 d = ∑ i = 1 n ( x i − y i ) 2

2.4.2 曼哈顿距离
d=i=1n|xiyi| d = ∑ i = 1 n | x i − y i |

2.4.3 余弦相似度
cosθ=ni=1xiyini=1x2ini=1y2i c o s θ = ∑ i = 1 n x i ∗ y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2

2.4.4 其他

  其他的相似度计算方法包括皮尔森相关系数、一般化的闵可夫斯基距离(当p=1时为曼哈顿距离,当p=2时为欧式距离)、汉明距离等。

3 基于深度学习

3.1 深度学习
3.2 DSSM
R(D,Q)=cosine(yQ,yD)=yTQyD||yQ||||yD|| R ( D , Q ) = c o s i n e ( y Q , y D ) = y Q T y D | | y Q | | | | y D | |


  其中 yQ y Q yD y D 表示DNN输出层问句和文档的低维语义向量,然后通过softmax得到条件概率分布。
  
   Word hashing
  原始的问句或者文档是一个高维的向量,如向量的维度可能是词表的大小,当输入这些高维度的向量时神经网络可能无法训练。为了使得神经网络更好的训练,论文提出了减少DNN输入层向量维度的 Word hashing方法,也即上图中的word hashing层。
  word hashing是一种基于字符的n-gram方法。如对good一词,首先添加开始和结尾的标记得到#good#,然后将该词分解为字符n-grams(如采用trigram: #go,goo,oog,od#),最后这个词就会被这些n-grams向量表示。
  一种可能存在的问题是认为不同词的词向量冲突(collision)。但是经过作者的统计,如在500k维的one-hot编码基础上,采用字符级trigram时,向量维度可以降到30k维,且冲突率仅为0.0044%。

  DSSM的训练中,神经网络层的参数 w w b ” role=”presentation” style=”position: relative;”> b 都是通过最大化点击数据的条件概率得到,公式如下:
  

P(D|Q)=exp(γR(D,Q))DDexp(γR(Q,D)) P ( D | Q ) = e x p ( γ R ( D , Q ) ) ∑ D ′ ∈ D e x p ( γ R ( Q , D ′ ) )


  其中, γ γ 是softmax函数的平滑因子,是训练中的一个经验值。在实际训练中,对于每一个问句共有5个文档对应,其中一个是点击文档,其余4个是随机选择的非点击文档。
  文档的相关性采用人工标注,共分为5个分数(0-4),其中4分表示最相关,0分表示最不相关。
  
  DSSM的优点在于1.直接利用了用户的点击数据;2. 得到的结果可以直接排序;但是缺点在于没有利用上下文信息。
  
  DSSM的扩展还包括CDSSM、DSSM-LSTM等,其中CDSSM在一定程度上弥补了上下文缺失的问题,结构上将DNN替换成CNN。
  DSSM-LSTM中使用LSTM记录上下文。

3.3 ConvNet
3.4 Skip-thoughts Vectors
3.5 Tree-LSTM

  论文中提到基于Tree-LSTM结构的两种模型,一种是Tree-LSTM Classification,另一种是Semantic Relatedness of Sentence Pairs
  (1)Tree-LSTM Classification
  对树中结点 j ” role=”presentation” style=”position: relative;”> j 分类时,结合该结点的子树使用softamx分类器进行预测,分类器采用结点的隐状态 hk h k 作为输入:
  这里写图片描述
  损失函数采用负的对数似然损失函数,并且利用L2正则化。其中 m m 是训练集的样本数量,上标 k ” role=”presentation” style=”position: relative;”> k 表示第k个标签结点, λ λ 是L2正则化参数。
  这里写图片描述
  (2)Semantic Relatedness of Sentence Pairs
  在语义相似度计算中,首先把经过Tree-LSTM模型后的句子对表示为 hL h L hR h R ,接着结合句子对 (hL,hR) ( h L , h R ) 的距离和角度,利用神经网络来预测相似度得分。
  这里写图片描述
  其中, rT=[12...K] r T = [ 1 2 . . . K ] 和绝对值函数都是基于单个值运算,其中,距离度量方法 hX h X h+ h + 都是基于实际经验,两者结合时会比单个度量方式更好。
  在进行预测时,为了归一化输出值,定义如下分布p,满足 y=rTp y = r T p
  这里写图片描述
  其中, 1iK 1 ≤ i ≤ K 。损失函数采用带正则化项的KL散度,优化目标是让标签值 p p 和预测值 p ^ θ ” role=”presentation” style=”position: relative;”> p ^ θ 更接近, m m 表示训练句子对的数量,上标 k ” role=”presentation” style=”position: relative;”> k 表示第k个句子对。
  这里写图片描述
  
  对于Dependency Tree-LSTM模型,最大的问题在于训练数据的收集十分困难并且句法分析结果也不是在所有语言中都有。














3.6 Siamese LSTM/Manhattan LSTM/MaLSTM
3.7 Others

//TODO

4 参考文献

  1. NLP点滴——文本相似度
  2. 常用的相似度计算方法原理及实现
  3. 基于Simase_LSTM的计算中文句子相似度经验总结与分享
  4. 原创:Siamese LSTM解决句子相似度以及扩展(理论篇)
  5. 论文《Leaning Deep Structured Semantic Models for Web Search using Clickthrough Data》
  6. 论文《Siamese Recurrent Architecture for learning Sentence Similarity》
  7. CNN在句子相似性建模的应用–模型介绍篇
  8. 论文《Multi-Perspective Sentence Similarity Modeling with Convolutional Neural Networks》
  9. 卷积神经网络(CNN)在句子建模上的应用
  10. 《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》阅读笔记
  11. 论文《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》
  12. 基于TreeLSTM的情感分析
  13. 论文《Skip-Thought Vectors》
  14. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)

















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198488.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午3:06
下一篇 2026年3月26日 下午3:07


相关推荐

  • 学生开发者经验|豆包大模型 + TRAE,让 AI 应用快速落地

    学生开发者经验|豆包大模型 + TRAE,让 AI 应用快速落地

    2026年3月12日
    1
  • android usb调试工具,USB调试怎么打开 各版本安卓手机打开USB调试模式方法[通俗易懂]

    android usb调试工具,USB调试怎么打开 各版本安卓手机打开USB调试模式方法[通俗易懂]手机与电脑通常是通过Adb方式连接,所以需要您在设备上打开USB调试模式,不同版本的安卓系统,打开USB调试模式也有所不同,以下我们根据安卓系统版本而不同,介绍下各版本安卓手机打开USB调试模式的方法,小白朋友值得学习一下哦。USB调试怎么打开各版本安卓手机打开USB调试模式方法一、安卓2.1~2.3.7系统打开USB调试模式方法1、点击手机Menu键(菜单键),在弹出的菜单中选择设置(…

    2025年11月6日
    4
  • Apache Struts2打开重定向/命令执行 CVE-2013-2251「建议收藏」

    Apache Struts2打开重定向/命令执行 CVE-2013-2251「建议收藏」昨日,著名JavaWeb框架Struts官方再发高危安全漏洞补丁升级(最新版本为:2.3.15.1),升级修补了多个安全漏洞,其中包括一个远程任意代码的高危安全漏洞,这些漏洞可以影响到Struts2.0.0-Struts2.3.15的所有版本。攻击者可以利用该漏洞,执行恶意Java代码,最终导致网站数据被窃取、网页被篡改等严重后果。基于Struts2使用广泛,目前很多网站还没有升级,另外

    2022年7月13日
    19
  • springboot整合mybatis(详解)

    springboot整合mybatis(详解)springboot 整合 mybatis1 整体结构 2 需要的依赖 dependencies dependency groupId org springframew boot groupId artifactId spring boot starter jdbc artifactId dependency dependencies

    2026年3月18日
    3
  • Python面试常见问题及解答(Basics )

    Python面试常见问题及解答(Basics )1 Python 的语言类型 Python 是动态类型 强类型 解释型语言区分动态类型 静态类型 编译阶段还是运行阶段检查类型区分强类型 弱类型 运行时是否自动转换类型 鸭子模型 2 Python 中的可变对象和不可变对象不可变对象 该对象所指向的内存中的值不能被改变 当改变某个变量时候 由于其所指的值不能被改变 相当于把原来的值复制一份后再改变 这会开辟一个新的地址 变量再指向这个

    2026年3月26日
    1
  • c++贪吃蛇源代码 完整版

    c++贪吃蛇源代码 完整版c++实现贪吃蛇,完整源码文章结构:数据结构分析程序运行分析难点分析一点思考源代码总结数据结构分析:1.双向队列:这里我才用双向队列的数据结构存储蛇身节点(这里的蛇身节点我才用结构体来存储蛇身信息)(因为贪吃蛇的实现还是比较简单的,所以也只涉及到了这一种数据结构)程序运行分析程序开始用户随机按下w,a,s,d中任意按键开始游戏并且作为蛇运动的初始方向,然后进入循环持…

    2022年5月26日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号