文本相似一般是指的,某一文本 d o c 1 doc1 doc1与另一文本 d o c 2 doc2 doc2的相似程度。一般可以从两个方面去考察两个文本之间的相似程度:形似(字面相似)和神似(语义相似)。当然这两种相似性也不能够完全割裂开来,只不过可以认为字面相似的文本不一定语义相似,语义相似的文本不一定用词相似。
为了考察文本的相似性,同样需要对文本进行相应的表示,表示的方法在上一部分进行说明,本部分不再进行阐述。所以文本的相似性度量,可以认为是文本表示的下游任务。
字面相似
字面相似是从文本的字词本身是否相似而考量,希望达到的效果是:两个文本“长得”越像,其本身含义也相近的效果。其中包含有编辑距离,最长公共子序列、最长公共子串,Jaccard(杰卡德)相似度和SimHash算法等。
编辑距离
编辑距离是一个经典的字符串动态规划算法,用于计算两个字符串(A和B),由A变动到B的最小的操作次数,其中每一次的插入、替换和删除都算作一次操作。可以直观的理解编辑距离就是字符串A变为字符串B最少的编辑次数。
当然将字符串A与B视为文本doc1和doc2,就能够刻画两个文本之间的相似程度。
最长公共子序列和最长公共子串
这两个算法类似,但是有一个区别之处在于:子串与子序列的定义不同。
用例子说明如下:
abcdefg
是原本的字符串,abc
是子串也是子序列,aeg
是子序列但不是子串。
从例子中我们可知,子串必是子序列,子序列不一定是子串。唯一的区分点就在于:是否连续。
如何求解最长公共子串和最长公共子序列同样也是较为经典的字符串动态规划算法。通过求解的结果,就可以依据最长公共子串(子序列)的长度越长,就表明两个文本更相似。
Jaccard(杰卡德)相似度
Jaccard相似度的计算用到了集合论中的交集并集的相关概念,可以认为Jaccard相似度可以计算两个集合的相似程度,当然在文本中也适用,用一个例子来说明:
今天天气很好==>今天/天气/很好
今天天气不好==>今天/天气/不好
所有词汇的集合:
word_set = {今天,天气,很好,不好}
两个句子中相同的词汇集合:
same_set = {今天,天气}
J a c c a r d _ s i m i l a r i t y = l e n ( s a m e _ s e t ) l e n ( w o r d _ s e t ) = 2 4 = 0.5 Jaccard\_similarity=\frac{len(same\_set)}{len(word\_set)}=\frac{2}{4}=0.5 Jaccard_similarity=len(word_set)len(same_set)=42=0.5
把这个问题抽象出来可以给出Jaccard相似度的定义:
给定两个集合A,B,Jaccard系数(相似度)定义为A与B交集大小与并集大小的比值,公式如下:
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ J(A,B)=\frac{|A\cap B|}{|A\cup B|}=\frac{|A\cap B|}{|A| + |B| - |A\cap B|} J(A,B)=