NLP文本相似度
相似度
相似度度量:计算个体间相似程度
相似度值越小,距离越大,相似度值越大,距离越小
-
最常用--余弦相似度:
一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小
余弦值接近1,夹角趋于0,表明两个向量越相似
-
如果向量a和b不是二维而是n维
示例
句子1:这只皮鞋号码大了,那只号码合适
-
句子2:这只皮鞋号码不小,那只更合适
分词
句子1:这只/皮鞋/号码/大了,那只/号码/合适
-
句子2:这只/皮鞋/号码/不/小,那只/更/合适
列出所有词
-
这只,皮鞋,号码,大了,那只,合适,不,小,更
计算词频
句子1:这只1,皮鞋1,号码2,大了1,那只1,合适1,不0,小0,更0
-
句子1:这只1,皮鞋1,号码1,大了0,那只1,合适1,不1,小1,更1
词频向量化
句子1:(1,1,2,1,1,1,0,0,0)
-
句子2:(1,1,1,0,1,1,1,1,1)
套公式计算
处理流程
得到了文本相似度计算的处理流程:
找出两篇文章的关键词
每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频
生成两篇文章各自的词频向量
计算两个向量的余弦相似度,值越大就表示越相似
词频-TF
假设:如果一个词很重要,应该会在文章中多次出现
词频-TF(term frequency):一个词在文章中出现的次数
也不是绝对的!出现次数最多的是“的”、“是”、“在”,这类最常用的词,叫做停用词(stop words)
停用词对结果毫无帮助,必须过滤掉的词
过滤掉停用词后就一定能解决问题么?
进一步调整假设:如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能反映了这篇文章的特性,正是我们所需要的关键词
反文档频率-IDF
在词频的基础上,赋予每一个词的权重,进一步体现该词的重要性
最常见的词(“的”、“是”、“在”)给予最小的权重
较常见的词(“国内”、“中国”、“报道”)给予较小的权重
较少见的词(“养殖”、“维基”、“涨停”)给予最大的权重
将TF和IDF进行相乘,就得到了一个词的TF-IDF值,某个词对文章重要性越高,该值越大, 于是排在前面的几个词,就是这篇文章的关键词。
计算步骤
-
词频(TF)= 某个词在文章中出现的次数
词频标准化:词频(TF)=某个词在文章中出现的次数文章的总词数
词频标准化:词频(TF)=某个词在文章中出现的次数该文出现次数最多的词的出现次数
反文档频率(IDF)= log(语料库文档总数包含该词的文档数)
TF-IDF = 词频(IF)* 反文档频率(IDF)
相似文章
-
使用TF-IDF算法,找出两篇文章的关键词
top-n(TF-IDF值)
按分数(TF-IDF值)过滤
每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中词的词频(为了避免文章长度的差异,可以使用相对词频)
生成两篇文章各自的词频向量
计算两个向量的余弦相似度,值越大就表示越相似
自动摘要
-
确定关键词集合
top-n(TF-IDF值)
按分数(TF-IDF值)过滤
找出包含关键词的句子
对关键词排序,相对于的句子划分等级
把等级高的句子取出来,就是摘要
文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。“自动摘要”就是要找出哪些包含信息多的句子
句子的信息量用“关键词”来衡量,如果包含的关键词越多,就说明这个句子越重要
只有关键词之间的距离小于“门槛值”,他们就被认为处于同一个蔟之中,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个蔟
-
对于每个蔟,都计算它的重要性分值
蔟的重要性包含的关键词数量族的长度
示例:其中某个蔟一共有7个词,其中4个是关键词。因此,它的重要性分值等于(4*4)/7 = 2.3
-
简化:不再区分“蔟”,只考虑句子包含的关键词。只考虑关键词首先出现的句子
优点:简单快速,结果比较符合实际情况
缺点:单纯以“词频”做衡量标准,不够全面,有时重要的词可能出现的次数并不多
最长公共子序列-LCS
最长公共子序列(Longest Common Subsequence)
一个序列s任意删除若干个字符得到的新序列T,则T叫做S的子序列
-
两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列
示例:
字符串12455与245576的最长公共子序列为2455
字符串acdfg与adfc的最长公共子序列为adf
-
注意区别最长公共字串(Longest Common Substring)
最长公共字串要求是连续的
LCS作用
-
求两个序列中最长的公共子序列算法
生物学家常利用该算法进行基因序列对比,以推测序列的结构、功能和演化过程
-
描述两段文字之间的“相似度”
辨别抄袭,对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,该方法判断修改的部分
求解-暴力穷举法
假定字符串X,Y的长度分别为m,n;
X的一个子序列即下标序列{1,2,.......,m}严格递增子序列,因此,X共有个不同子序列;同理,Y有个不同子序列
穷举搜索法时间复杂度O()
对于X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且在检查过程中选出最长的公共子序列
复杂度高,不可用
求解-动态规划法
字符串X,长度m;字符串Y,长度为n
即 X序列的前i个字符(1<= j <= m)(计作“字符串X的i前缀”)
即 Y序列的前i个字符(1<= j <= n)(计作“字符串X的j前缀”)
LCS(X,Y) = 为字符串X和Y的最长公共子序列,即为
若果(最后一个字符相同),则:与的最长公共子序列的最后一个字符必定为
-
如果
1 2 3 4 5 6 7 X B D C A B A Y A B C B D A B 对于上面的字符串X和Y:
'C' 则有:LCS(BDC, ABC) = LCS(BD, AB) + 'C'
'B' 则有:LCS(BDCAB, ABCB) = LCS(BDCA, ABC) + 'B'
如果 ,则, 或者,即
则有:{}
则有:{}
总结:
属于动态规划问题
数据结构-二维数组
使用二维数组C[m, n]
-
C[i, j]记录序列和的最长公共子序列的长度
当或当且当且
-
例子
X= <A, B, C, B, D, A, B>
y = <B, D, C, A, B, A>
j 0 1 2 3 4 5 6 i B D C A B A 0 0 0 0 0 0 0 0 1 A 0 0 0 0 1 1 1 2 B 0 1 1 1 1 2 2 3 C 0 1 1 2 2 2 2 4 B 0 1 1 2 2 2 3 5 D 0 1 2 2 2 2 3 6 A 0 1 2 2 3 3 4 7 B 0 1 2 2 3 4 4