计算句子相似度的方法

方法1:无监督,不使用额外的标注数据

  • average word vectors:简单的对句子中的所有词向量取平均,是一种简单有效的方法,

    缺点:没有考虑到单词的顺序,只对15个字以内的短句子比较有效,丢掉了词与词间的相关意思,无法更精细的表达句子与句子之间的关系。

  • tfidf-weighting word vectors:指对句子中的所有词向量根据tfidf权重加权求和,是常用的一种计算sentence embedding的方法,在某些问题上表现很好,相比于简单的对所有词向量求平均,考虑到了tfidf权重,因此句子中更重要的词占得比重就更大。

    缺点:没有考虑到单词的顺序

  • bag of words:这种方法对于短文本效果很差,对于长文本效果一般,通常在科研中用来做baseline。缺点:1.没有考虑到单词的顺序,2.忽略了单词的语义信息
  • LDA:计算出一片文档或者句子的主题分布。也常常用于文本分类任务
  • smooth inverse frequency[1](简称SIF)为权重,对所有词的word vector加权平均,最后从中减掉principal component,得到sentence embedding

    [1] Sanjeev Arora, et al. 2017. A Simple but Tough-to-Beat Baseline for Sentence Embeddings

  • 通过Word Mover’s Distance[2](简称WMD),直接度量句子之间的相似度

    [2] Matt J. Kusner, et al. 2015. From Word Embeddings To Document Distances

  • LSI或LSA:LSI是处理相似度的,基于SVD分解,用于特征降维,LSI求解出来的相似度跟topic相关性很强,而句子结构等信息较少。顺便说下,句子中词的顺序是不会影响LSI相似度结果的。

方法2:有监督,需要额外的标注数据

  • 分类任务,例如训练一个CNN的文本分类器[3],取最后一个hidden layer的输出作为sentence embedding,其实就是取分类器的前几层作为预训练的encoder

    [3] Yoon Kim. 2014. Convolutional Neural Networks for Sentence Classification

  • sentence pair的等价性/等义性判定[4],这种方法的好处是不仅可以得到sentence embedding,还可以直接学习到距离度量函数里的参数

    [4] Jonas Mueller, et al. 2016. Siamese Recurrent Architectures for Learning Sentence Similarity

方法3:DSSM-LSTM,2016年提出

用DSSM-LSTM计算任意一对短文本的语义相似性,能够捕捉上下文信息。

方法4:doc2vec(paragraph2vec, sentence embeddings),2014年提出

一种非监督式算法,可以获得 sentences/paragraphs/documents 的向量表达,是 word2vec 的拓展。学出来的向量可以通过计算距离来找 sentences/paragraphs/documents 之间的相似性,可以用于文本聚类,对于有标签的数据,还可以用监督学习的方法进行文本分类,例如经典的情感分析问题。

训练过程中新增了paragraph id,即训练语料中每个句子都有一个唯一的id。paragraph id 和普通的word一样,先是映射成一个向量,即paragraph vector。paragraph vector与word vector的维数虽一样,但是来自于两个不同的向量空间。在之后的计算里,paragraph vector与word vector累加或者连接起来,作为输出层softmax的输入。在一个句子或者文档的训练过程中,paragraph id保持不变,共享同一个paragraph vector,相当于每次在预测单词的概率时,都利用了整个句子的语义。

DM(Distributed Memory,分布式内存):DM试图在给定前面部分的词和paragraph向量来预测后面单独的单词,即使文本中的语境在变化,但paragraph向量不会变换,并且能保存词序信息。

分布式词袋(DBOW):利用paragraph来预测段落中一组随机的词.

sentence2vec相对于word2vec的skip-gram模型,区别点为:在sentence2vec里,输入都是paragraph vector,输出是该paragraph中随机抽样的词。

参考文献:

【1】doc2vec原理及实践

【2】句子和文档的分布式表示

【3】基于gensim的Doc2Vec简析

【4】models.doc2vec – Doc2vec paragraph embeddings

【5】如何用 word2vec 计算两个句子之间的相似度?

原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10857008.html

时间: 2024-10-12 18:25:32

计算句子相似度的方法的相关文章

计算句子相似度

计算编辑距离 # -*- coding: utf-8 -*- def distacal(s1,s2):#计算编辑距离 m = len(s1) n = len(s2) colsize, matrix = m + 1, [] for i in range((m + 1) * (n + 1)): matrix.append(0) for i in range(colsize): matrix[i] = i for i in range(n + 1): matrix[i * colsize] = i f

使用 TF-IDF 加权的空间向量模型实现句子相似度计算

使用 TF-IDF 加权的空间向量模型实现句子相似度计算 字符匹配层次计算句子相似度 计算两个句子相似度的算法有很多种,但是对于从未了解过这方面算法的人来说,可能最容易想到的就是使用字符串匹配相关的算法,来检查两个句子所对应的字符串的字符相似程度.比如单纯的进行子串匹配,搜索 A 串中能与 B 串匹配的最大子串作为得分,亦或者用比较常见的最长公共子序列算法来衡量两个串的相似程度,使用编辑距离算法来衡量等. 上述基于字符匹配层次的算法一定程度上都可以计算出两个句子的相似度,不过他们只是单纯的从字符

nlp自然语言处理中句子相似度计算

在做自然语言处理的过程中,现在智能对话比较火,例如智能客服,智能家电,智能音箱等,我们需要获取用户说话的意图,方便做出正确的回答,这里面就涉及到句子相似度计算的问题,那么本节就来了解一下怎么样来用 Python 实现句子相似度的计算. 句子相似度常用的几种方法: 1.编辑距离 2.杰卡德系数计算 3.Word2Vec 计算 编辑距离,英文叫做 Edit Distance,又称 Levenshtein 距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数, 如果它们的距离越大,说明它们越

图像相似度计算之哈希值方法OpenCV实现

http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 2959人阅读 评论(0) 收藏 举报  分类: OpenCV(72)  Image Processing(18)  版权声明:本文为博主原创文章,未经博主允许不得转载. 感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字

中文句子相似度之計算與應用

原文:http://www.aclweb.org/anthology/O05-1008 中文句子相似度之计算与应用 郑守益 梁婷国立交通大学信息科学系 摘要 近年來受惠于国内外各项语料库资源的建置及网际网路上的大量中文语料,使计算机语文辅助教材的涵盖层面日趋广泛.因此如何产生大量且具高质量之辅助教材日益受到许多自然语言处理研究者的重视.有鉴于此,本論文提出以中文句子相似度为基础的研究与应用.相似度的计算乃考虑句子的组合及聚合性.我们实作此一应用,并提出解决未知词的语意计算问题的方法.实验结果显示

汉语语义消歧之 -- 句子相似度

这里隆重推出介绍一种词义消歧的(简单)方法:句子相似度 虽然第一反应一定是介个,但是总不能说他们的相似度就是单词出现的重复次数吧= =||,怎么看都觉得不科学233 于是,我们想到了最简单却又好用的相似度判断方式,就是"余弦相似性"(cosine similiarity)了啦: 我们现在有两句话s1和s2,那么他们的余弦相似度怎么求呢? 现在令s1.s2词频向量为v1.v2(注意,是向量!),则我们"想象一下": 如果v1和v2方向相同,大致等价于s1.s2句子构成

LSTM 句子相似度分析

使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确.如下面两个句子: "北京的首都是中国"与"中国的首都是北京"的相似度为1. "学习容易"和"学习困难"的相似度很容易也非常高. 为解决这类问题,需要用其他方法对句子进行表示,LSTM是常用的一种方式,本文简单使用单层LSTM对句子重新表示,并通过若干全连接层对句子相似度进行衡量. 数据准备 训练和测试数据包

递归算法复杂度分析方法

递归算法的复杂度分析方法. a.分析出复杂度公式(关于n的规模) b.求解这个公式 1.齐次 例如求fabonaci的第n项,f(n) = f(n-1)+f(n-2) => f(n)-f(n-1)-f(n-2)=0 =>特征方程:x^2-x-1=0 => x1,x2 => f(n)=a*x1n + b*x2n 2.master method T(n) = aT(n/b) + f(n) 3.采用分析树的方式 举个例子 f(n) = 2*f(n-1) + 1 1 1 ---------

PHP计算两个时间差的方法

<?php //PHP计算两个时间差的方法 $startdate="2010-12-11 11:40:00"; $enddate="2012-12-12 11:45:09"; $date=floor((strtotime($enddate)-strtotime($startdate))/86400); $hour=floor((strtotime($enddate)-strtotime($startdate))/86400/3600); $minute=flo