NLP文本相似度之LCS
基础
LCS(Longest Common Subsequence)通常指的是最长公共子序列,区别最长公共字串(Longest Common Substring)。我们先从子序列的定义理解:
一个序列S任意删除若干个字符得到新的序列T,则T叫做S的子序列。
子序列和子串的一个很大的不同点是,子序列不要求连接,而子串要求连接。
两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列,例如:
- 字符串12455与245576的最长公共子序列为2455;
- 字符串acdfg与adfc的最长公共子序列为adf
应用
LCS通常可以用来描述两段文字之间的相似度。例如:在辨别抄袭中,对一段文字进行修改后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,就可以判断文字修改的部分了。
求解
对于求解字符串X,Y的最长公共子序列问题,最容易想到的应该是暴力穷举法。如果假定X,Y的长度分别为m、n,则X共有pow(2,m)个不同的子序列,Y有pow(2,n)个不同的子序列,对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且在检查过程中选出最长的公共子序列。穷举法带来的时间复杂度为O(2m∗2n)O(2^m*2^n)O(2m∗2n)
如此高的时间复杂度显然不可用,比较理想的求解方式是动态规划。动态规划的两个关键步骤:
- 状态的定义;
- 状态转移方程的定义。
我们定义c(i,j)的值为序列X的前i个字符和序列Y的前j个字符的最长公共子序列长度。对于任意i,j ,其状态转移方程如下:
程序实现
def LCS(str1,str2):dp = [[0 for i in range(len(str1)+2)] for j in range(len(str2)+2)]for i in range(len(str1)-1,-1,-1): # 倒序,简化边界条件判断for j in range(len(str2)-1,-1,-1):if str1[i] ==str2[j]:dp[i][j] =dp[i+1][j+1]+1else:dp[i][j] =max(dp[i+1][j],dp[i][j+1])return dp[0][0]
写在最后
不积硅步,无以至千里。工作-生活-学习,过去的每天都忙忙碌碌,很少花时间去整理自己所学。年初这场裸辞后,我的生活突然慢了下来,固然还在为下一份工作奔波,但找工作之余,学点感兴趣的东西,记录下每一次学习的收获,也算充实。这段时间焦虑、自我怀疑、懊悔…这些负面情绪纷纷扰扰,但是我依旧咬牙前行。越努力越幸运,与君共勉。
NLP文本相似度之LCS相关推荐
- NLP文本相似度算法LCS
目录 一.什么是LCS 子序列 最长公共子序列 二.LCS的应用场景 三.LCS的查找方法 1. 动态规划法计算LCS的长度和两字符串的相似度 2. 回溯算法查找LCS 四.代码实现 一.什么是LCS ...
- nlp文本相似度_用几行代码在Python中搜索相似文本:一个NLP项目
nlp文本相似度 自然语言处理 (Natural Language Processing) 什么是自然语言处理? (What is Natural Language Processing?) Natu ...
- NLP文本相似度(TF-IDF)
前言 我们在比较事物时,往往会用到"不同","一样","相似"等词语,这些词语背后都涉及到一个动作--双方的比较.只有通过比较才能得出结论, ...
- NLP文本相似度 - LCS(最长公共子序列)java代码
LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 比如,对于char x[ ...
- 语音识别的JavaSDK与文本相似度计算
目录 语音识别 文本相似度计算 Jaccard相似度算法 LCS(最长公共子序列) 编辑距离 语音识别 阿里云提供的语音识别的Java SDK文档 文本相似度计算 Jaccard相似度算法 Jacca ...
- 文本相似度检测之余弦相似度
为什么文本也需要余弦相似度 文本的余弦相似度是为了计算文本的相似程度而引入的一种方法,例如我们要比较这样两句话的相似程度: A句子:你笑起来真好看. B句子:你笑起来不好看. 这两句话,看起来很相似了 ...
- 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度
自然语言处理(NLP)之使用TF-IDF模型计算文本相似度 所用数据集:ChnSentiCorp_htl_all.csv 语料库即存放稀疏向量的列表. 要注意的是,搜索文本text与被检索的文档共用一 ...
- 从0到1,了解NLP中的文本相似度
本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...
- 【NLP实战】基于ALBERT的文本相似度计算
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式.因此,NLP专栏推出了实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试. ALBERT是一个比BERT要轻量,效果更好的模型,本篇 ...
最新文章
- python怎么导入视频-python中的导入如何使用,以及.和..相对导入的使用
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Java源代码分析与生成
- java 打印命令_Java 普通命令行程序main关掉 DEBUG 打印
- di-tech2016_2016年Tech最佳愚人节笑话
- java后端技术路线_Java后端精选技术:Java的反射机制
- 美团点评成中国第三大互联网公司!
- UnityShader14.1:透明效果实现(下)
- qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
- PHP array_diff_assoc
- React Native状态机和应用设计思路
- matlab-高数 反、双曲、正、余弦、正切函数
- Process-wide API spying - an ultimate hack 摘要翻译(二)
- 熬夜肝出 3w 字测试开发学习路线
- 计算机软考证书含金量和性价比分析
- TCP FIN_WAIT1状态的实验和验收
- 服务器做系统怎么规划,如何做系统容量规划 | 知行天下
- 如何进入游戏行业成为一个程序员(摘自Geoff Howland)
- python人物抠图算法_比PS还好用!Python 20行代码批量抠图
- OpenFOAM 量纲检查开启和关闭