前言
前面我们知道了通过TF-IDF找出文章中的关键词,以及通过余弦相似度来判断两个句子或者文章的相似程度。那么我们还可以通过LCS即最长公共子序列(Longest Common Subsequence)的方式来比对两段文字之间的相似度。
LCS定义
- 一个序列S任意删除若干个字符得到的新序列T,则T叫做S的子序列
- 两个序列X和Y的公共子序列中,长度最长的那个定义为X和Y的最长公共子序列
- 字符串123456789与567891011的最长公共子序列为56789
- 字符串adfa与afa的最长公共子序列为afa
LCS作用
- 求两个序列中最长的公共子序列
- 描述两段文字之间的相似度(根据最长子序列来判断,举例如果一个句子一共20个字符,另外一个15个字符,假如它们的最长子序列达到了10个字符,那么这里两个句子相似度应该就比较高了)
LCS公式
a = ‘BDCABA’
b = ‘ABCBDAB’
属于动态规划问题
使用二维数组C(m,n)
C[i,j]记录序列X_i和Y_j的最长公共子序列的长度
当i=0或j=0时,空虚了是X_i和Y_j的最长公共子序列,即C[i,j]=0
LCS代码实现
计算文本相似度
- 将两个字符串分别以行和列组成矩阵。
- 计算每个节点行列字符是否相同,如相同则为 通过公式计算。
- 通过找出值变化 的最长对角线即可得到最长公共子串。
1 | # coding=utf-8 |
1 | 代码结果输出: |
代码:https://github.com/lishijia/py-data-demo/tree/master/nlp