文章目录

  • 一、绪论
  • 二、余弦相似度
    • 2.1 余弦相似度定义
    • 2.2 计算相似度步骤
    • 2.3 举例
    • 2.4 改进方式
    • 2.5 代码
  • 三、TF-IDF计算
    • 3.1 TF、IDE、TF-IDF的计算方法
      • 3.1.1 词频TF的计算方法
      • 3.1.2 反文档频率IDF的计算方法
      • 3.1.3 TF-IDF的计算方法
    • 3.2 利用TF-IDF计算文章相似度
    • 3.3 代码
  • 四、基于语义相似度的计算----DSSM
    • 4.1 原理
    • 4.2 输入层
      • 4.2.1 英文
      • 4.2.2 中文
    • 4.3表示层
    • 4.4 匹配层
    • 4.5 优缺点

一、绪论

NLP、数据挖掘领域中,文本分析是一个很重要的领域,这有助于我们去让计算机理解语言的作用和使用。文本分析也是数据挖掘的重要手段,利用文本分析,我们将很快的读取到一本书、一篇文章、一段话中的关键词和核心思想,而文本相似度就是我们用来剔除无用信息或者重复信息的重要手段。要让计算机去找文本中的不同。
我们在比较事物时,往往会用到“不同”,“一样”,“相似”等词语,这些词语背后都涉及到一个动作——双方的比较。只有通过比较才能得出结论,究竟是相同还是不同。但是万物真的有这么极端的区分吗?在我看来不是的,生活中通过“相似度”这词来描述可能会更加准确。比如男人和女人,虽然生理器官和可能思想有些不同,但也有相同的地方,那就是都是人,就是说相似度不为0;比如石头与小草,它们对于虚拟类都是一种实体类,相似度也不为0;两个句子词和词的顺序都一致,相似度就是1。一个概念可以应用到不同于相同的两个方面的定义。可真谓方便至极了。
在生活中,信息检索、文档复制检测等领域都应用到“文本相似度”。可能有人觉得文本是文字,其实不尽然,文本相似度的应用更广,除了文字的匹配,还可以是图片,音频等,因为他们的实质都是在计算机中都是以二进制的方式存在的。
相似度,实质就是计算个体间相程度。什么是个体?对于语句,个体就是语句,对于图片,个体就是图片。
而我们常用的用来分析相似度的方法,通常也可以用来分析其他的数据,而用来计算其他信息相似度的方法,一般也可以用来分析文本的相似度。
那么接下来,我将从最简单最常用的方法,余弦相似度说起,介绍两种我学会的基于距离计算的字面相似度方法,然后再介绍我不太理解的语义相似度计算方法。并附上代码和我个人的理解。

二、余弦相似度

2.1 余弦相似度定义

余弦相似度就是通过一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小。把1设为相同,0设为不同,那么相似度的值就是在01之间,所有的事物的相似度范围都应该是01,如果不是0~1的话,就不是我们应该研究的事了,那是神经学家和生物学家的事了。余弦相似度的特点是余弦值接近1,夹角趋于0,表明两个向量越相似。看下图,

三角形越扁平,证明两个个体间的距离越小,相似度越大;反之,相似度越小。但是,文本的相似度计算只是针对字面量来计算的,也就是说只是针对语句的字符是否相同,而不考虑它的语义,那是另外一个研究方向来着。比如,句子1:你真好看:。句子2:你真难看。这两句话相似度75%,但是它们的语义相差十万八千里,可以说是完全相反。又比如,句子1:真好吃。句子2:很美味。两个句子相似度为0,但是语义在某个场景下是一致的。
所以在实际中,没有很完美的解决方案。每个公司会针对业务要求来调节相似度算法,使其在某些场合能够精确计算。
这种方法类似于编辑距离计算,通过计算将它转换为特定句子最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符,但是当词义的重要性超过了句子结构时,就会出现上面相似的问题。

2.2 计算相似度步骤

通过计算模型公式可以明确的求出余弦相似度的值。那么对于我们写程序实现这个算法,就是把两个个体转换为向量,然后通过这个公式求出最终解。
比如向量a(x1, x2, x3, x4, x5),向量b(y1, y2, y3, y4, y5)。分子为(x1y1) +(x2y2) + (x3y3) +(x4y4)+(x5y5),分母sqrt(x1x1+x2x2+x3x3+x4x4+x5x5)。

那么计算两个句子相似度的步骤如下:
1.通过中文分词,把完整的句子根据分词算法分为独立的词集合
2.求出两个词集合的并集(词包)
3.计算各自词集的词频并把词频向量化
4.带入向量计算模型就可以求出文本相似度

2.3 举例

2.4 改进方式

在计算步骤中有一个关键词——词频TF。词频是一个词语在文章或句子中出现的次数。如果一个词很重要,很明显是应该在一个文章中出现很多次的,但是这也不是绝对的,比如“地”,“的”,“啊”等词,它们出现的次数对一篇文章的中心思想没有一点帮助,只是中文语法结构的一部分而已。这类词也被称为“停用词”。所以,在计算一篇文章的词频时,停用词是应该过滤掉的。
但是仅仅过滤掉停用词就能接近问题?也不一定的,比如如果想分析近期的十九届中央纪委二次全会等新闻文章,很明显出现“中国”这个词语必定会出现在每篇文章,但是对于每个新闻的主干思想有帮助吗?对比“反腐反败”,“人工智能”“大数据”等词语,“中国”这个词语在文章中应该是次要的。
因此进一步假设,如果某个词比较少见(在我们准备的文章库中的占比比较少),但是它在这篇文章中多次出现,那么它很可能反映了这篇文章的特性,正是我们所需要的关键词。
在此,在词频TF的基础上又引出了反文档频率IDF的概念。这既是下面要介绍的方法TF-IDE计算,既要考虑词频,也要赋予每个词的权重,体现某个词的重要性

2.5 代码

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
from scipy.linalg import normdef tf_similarity(s1, s2):def add_space(s):return ' '.join(list(s))s1, s2 = add_space(s1), add_space(s2) #在字中间加上空格cv = CountVectorizer(tokenizer=lambda s: s.split()) #转化为TF矩阵corpus = [s1, s2]vectors = cv.fit_transform(corpus).toarray() #计算TF系数return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print(tf_similarity(s1, s2))

输出

这里的0.73表示的就是两句话之间的向量余弦相似度。

三、TF-IDF计算

一般来说,在一篇文章或一个句子来说,对于每个词都有不同的重要性,这也就是词的权重。在词频的基础上,赋予每一个词的权重,进一步体现该词的重要性。

3.1 TF、IDE、TF-IDF的计算方法

3.1.1 词频TF的计算方法


词频标准化的目的是把所有的词频在同一维度上分析。词频的标准化有两个标准,第一种情况,得出词汇较小,不便于分析。一般情况下,第二个标准更适用,因为能够使词频的值相对大点,便于分析。比如一本书出现一个词语100次,但整本书10万字,词频但是在一句话中出现5次。

3.1.2 反文档频率IDF的计算方法


在这个公式中,有一些需要解释的地方:

  1. 为什么+1?是为了处理分母为0的情况。假如所有的文章都不包含这个词,分子就
    为0,所以+1是为了防止分母为0的情况。
  2. 为什么要用log函数?log函数是单调递增,求log是为了归一化,保证反文档频率不会过大。
  3. 会出现负数?肯定不会,分子肯定比分母大。

3.1.3 TF-IDF的计算方法


通过公式可以知道,TF-IDF与在该文档中出现的次数成正比,与包含该词的文档数成反比。

3.2 利用TF-IDF计算文章相似度

  1. 使用TF-IDF算法,找出两篇文章的关键词
  2. 每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频)
  3. 生成两篇文章各自的词频向量
  4. 计算两个向量的余弦相似度,值越大就表示越相似

3.3 代码

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from scipy.linalg import normdef tfidf_similarity(s1, s2):def add_space(s):return ' '.join(list(s))# 将字中间加入空格s1, s2 = add_space(s1), add_space(s2)# 转化为TF矩阵cv = TfidfVectorizer(tokenizer=lambda s: s.split())corpus = [s1, s2]vectors = cv.fit_transform(corpus).toarray()# 计算TF系数return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print(tfidf_similarity(s1, s2))

输出

这里的0.58表示的就是两句话之间的TF-IDF值。无论从原理还是计算过程还是代码实现,我们都可以发现,余弦相似度作为最基础的算法,计算欧几里得距离,但是就是本文处理中的词频处理,也就是TF法,再优化衍生出了这一章的TF-IDF法。

四、基于语义相似度的计算----DSSM

4.1 原理

DSSM(Deep Structured Semantic Models)的原理很简单,通过搜索引擎里 Query 和 Title 的海量的点击曝光日志,用 DNN 把 Query 和 Title 表达为低纬语义向量,并通过 cosine 距离来计算两个语义向量的距离,最终训练出语义相似度模型。该模型既可以用来预测两个句子的语义相似度,又可以获得某句子的低纬语义向量表达。
目前DSSM的用法还是主要针对查询搜索类问题。
DSSM从上到下氛围三层结构:输入层、表示层、匹配层

4.2 输入层

输入层做的事情是把句子映射到一个向量空间里并输入到 DNN 中,这里英文和中文的处理方式有很大的不同

4.2.1 英文

英文的输入层处理方式是通过word hashing。举个例子,假设用 letter-trigams来切分单词(3 个字母为一组,#表示开始和结束符),boy 这个单词会被切为#-b-o,b-o-y, o-y-#

这样做的好处有两个:首先是压缩空间,50 万个词的 one-hot 向量空间可以通过 letter-trigram 压缩为一个 3 万维的向量空间。其次是增强范化能力,三个字母的表达往往能代表英文中的前缀和后缀,而前缀后缀往往具有通用义。

这里之所以用 3 个字母的切分粒度,是综合考虑了向量空间和单词冲突

4.2.2 中文


以 50 万个单词的词库为例,2 个字母的切分粒度的单词冲突为 1192(冲突的定义:至少有两个单词的 letter-bigram 向量完全相同),而 3 个字母的单词冲突降为 22 效果很好,且转化后的向量空间 3 万维不是很大,综合考虑选择 3 个字母的切分粒度。

4.3表示层

DSSM 的表示层采用 BOW(Bag of words)的方式,相当于把字向量的位置信息抛弃了,整个句子里的词都放在一个袋子里了,不分先后顺序。当然这样做会有问题,我们先为 CNN-DSSM 和 LSTM-DSSM 埋下一个伏笔。
紧接着是一个含有多个隐层的 DNN,如下图所示:

用 Wi 表示第 i 层的权值矩阵,bi 表示第 i 层的 bias 项。则第一隐层向量 l1(300 维),第 i 个隐层向量 li(300 维),输出向量 y(128 维)可以分别表示为:

用 tanh 作为隐层和输出层的激活函数:

最终输出一个 128 维的低纬语义向量。

4.4 匹配层

Query 和 Doc 的语义相似性可以用这两个语义向量(128 维) 的 cosine 距离来表示:

通过softmax 函数可以把Query 与正样本 Doc 的语义相似性转化为一个后验概率:

其中 r 为 softmax 的平滑因子,D 为 Query 下的正样本,D-为 Query 下的负样本(采取随机负采样),D 为 Query 下的整个样本空间。

在训练阶段,通过极大似然估计,我们最小化损失函数

残差会在表示层的 DNN 中反向传播,最终通过随机梯度下降(SGD)使模型收敛,得到各网络层的参数{Wi,bi}。

4.5 优缺点

优点:DSSM 用字向量作为输入既可以减少切词的依赖,又可以提高模型的范化能力,因为每个汉字所能表达的语义是可以复用的。另一方面,传统的输入层是用 Embedding 的方式(如 Word2Vec 的词向量)或者主题模型的方式(如 LDA 的主题向量)来直接做词的映射,再把各个词的向量累加或者拼接起来,由于 Word2Vec 和 LDA 都是无监督的训练,这样会给整个模型引入误差。DSSM 采用统一的有监督训练,不需要在中间过程做无监督模型的映射,因此精准度会比较高。

缺点:上文提到 DSSM 采用词袋模型(BOW),因此丧失了语序信息和上下文信息。另一方面,DSSM 采用弱监督、端到端的模型,预测结果不可控。

NLP——计算文本相似度的常用算法相关推荐

  1. 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度

    自然语言处理(NLP)之使用TF-IDF模型计算文本相似度 所用数据集:ChnSentiCorp_htl_all.csv 语料库即存放稀疏向量的列表. 要注意的是,搜索文本text与被检索的文档共用一 ...

  2. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  3. 使用simhash计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 文本相似度计算常用于网页去重以及NLP里文本分析等 ...

  4. 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法

    详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法 TF-IDF的基本原理 算法思想 计算公式 相似度计算原理 微型图书推荐案例 案例背景 开发工具 数据预处理 TF-IDF模型建 ...

  5. 使用gensim计算文本相似度

    使用gensim计算文本相似度 计算文本相似度步骤逻辑 1.将文本数据,通过jieba分词进行处理,形成一个二维数组 2.将二维数组生成词典 3.将二维数组通过doc2bow稀疏向量,形成语料库 4. ...

  6. 使用余弦相似度计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 2.向量余弦计算文本相似度 2.1 原理 余弦相似 ...

  7. 使用编辑距离计算文本相似度

    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 3. 最小编辑距离计算文本相似度 3.1 编辑距离 ...

  8. DSSM算法-计算文本相似度

    转载请注明出处: http://blog.csdn.net/u013074302/article/details/76422551 导语 在NLP领域,语义相似度的计算一直是个难题:搜索场景下quer ...

  9. 【NLP】余弦定理计算文本相似度

    一. 余弦相似概述 余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1:并且其最小值是-1. 从而两个向量之间的角度的余弦值确定两个向 ...

最新文章

  1. 如何用Linux的at命令安排一个任务
  2. python中文文本分析_python--文本分析
  3. 【arduino】arduino ISP下载程序方法,用arduino uno给arduino nano下载程序
  4. LeetCode题组:第322题-零钱兑换
  5. 为什么大家都只谈薪资,却不谈梦想?
  6. html 怎么显示在投影下面,投影仅底部css3
  7. javascript设计模式研究学习-设计模式类别
  8. plsql 64连接32oracle,32位plsql developer连接64位oracle的方法
  9. 最全CTF Web题思路总结(更新ing)
  10. 光盘驱动器托盘被卡住属于计算机硬故障中的,光驱托盘不会打开?打开卡住CD DVD驱动器托盘的提示 | MOS86...
  11. python tkinter 自主小项目——计算器往事
  12. 树莓派4B(4G/8G)安装Ubuntu18.04桌面版+ROS(Melodic)+Realsense SDK(T265+D400系列)
  13. Python | 一键生成九宫格图片
  14. 西门子S7-1200PLC堆栈程序 在使用西门子1200PLC时候发现,系统没有自带的堆栈功能块,不能实现数据的先进先出后进后出功能
  15. 手机支付:合作之路才是正途
  16. 验证基于逻辑回归的隐马尔可夫模型的心音信号切分算法(literature study)
  17. CAN总线控制器SJA1000
  18. SDUT_人活着系列
  19. 怎样使input失去焦点
  20. 计算机保密管理使用情况表,涉密计算机保密管理情况检查表

热门文章

  1. 通俗易懂——信息熵,条件熵,互信息和相对熵
  2. java有且只有一个什么_1. 一个Java应用程序必须且只有一个类含有 main_____ 方法....
  3. tkinter如何变成悬浮窗
  4. DDF (Diamond Directive File)文件
  5. 按键精灵物理实现重复点击
  6. SQL Server2012清除数据库日志
  7. python pyinstaller打包第三方含字体库报错cannot open resource的解决办法
  8. IPv4、IPv6详解
  9. 这两天用unity做安卓蓝牙demo遇到打包安卓包时报错 The option ‘android.enableR8’ is deprecated and should not be used anym
  10. 基于java的购物网站论文,基于JAVA购物网站的设计与实现(SSH,MySQL)