NLP之文档相似性
前言
在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种
高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性。而有了文本
之间相似性的度量方式,我们便可以利用划分法的K-means、基于密度的DBSCAN或者是基于模
型的概率方法进行文本之间的聚类分析;另一方面,我们也可以利用文本之间的相似性对大规模
语料进行去重预处理,或者找寻某一实体名称的相关名称(模糊匹配)。而衡量两个字符串的相
似性有很多种方法,如最直接的利用hashcode,以及经典的主题模型或者利用词向量将文本抽象
为向量表示,再通过特征向量之间的欧式距离或者皮尔森距离进行度量。本文围绕文本相似性度
量的主题,从最直接的字面距离的度量到语义主题层面的度量进行整理总结,并将平时项目中用
到的文本相似性代码进行了整理,如有任何纰漏还请指出,我会第一时间改正^v^。(ps.平时用
的Java和scala较多,本文主要以Java为例。)
字面距离
提到如何比较两个字符串,我们从最初编程开始就知道:字符串有字符构成,只要比较比较两个
字符串中每一个字符是否相等便知道两个字符串是否相等,或者更简单一点将每一个字符串通过
哈希函数映射为一个哈希值,然后进行比较。但是这种方法有一个很明显的缺点,就是过
于“硬”,对于相似性的度量其只有两种,0不相似,1相似,哪怕两个字符串只有一个字符不相等
也是不相似,这在NLP的很多情况是无法使用的,所以下文我们就“软”的相似性的度量进行整理,
而这些方法仅仅考虑了两个文本的字面距离,无法考虑到文本内在的语义内容。
common lang库
文中在部分代码应用中使用了Apache提供的common lang库,该库包含很多Java标准库中没有
的但却很实用的函数。其maven引用如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version></dependency>
相同字符数
在传统的字符串比较过程中,我们考虑字符串中每个字符是否相等,并且考虑了字符出现的顺
序,如果不考虑字符出现的顺序,我们可以利用两个文本之间相同的字符数量,很简单不再赘
述,可以利用common lang中的getFuzzyDistance:
评论0