基础

LCS(Longest Common Subsequence)通常指的是最长公共子序列,区别最长公共字串(Longest Common Substring)。我们先从子序列的定义理解:

一个序列S任意删除若干个字符得到新的序列T,则T叫做S的子序列。

子序列和子串的一个很大的不同点是,子序列不要求连接,而子串要求连接。

两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列,例如:

  • 字符串12455245576的最长公共子序列为2455
  • 字符串acdfgadfc的最长公共子序列为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相关推荐

  1. NLP文本相似度算法LCS

    目录 一.什么是LCS 子序列 最长公共子序列 二.LCS的应用场景 三.LCS的查找方法 1. 动态规划法计算LCS的长度和两字符串的相似度 2. 回溯算法查找LCS 四.代码实现 一.什么是LCS ...

  2. nlp文本相似度_用几行代码在Python中搜索相似文本:一个NLP项目

    nlp文本相似度 自然语言处理 (Natural Language Processing) 什么是自然语言处理? (What is Natural Language Processing?) Natu ...

  3. NLP文本相似度(TF-IDF)

    前言 我们在比较事物时,往往会用到"不同","一样","相似"等词语,这些词语背后都涉及到一个动作--双方的比较.只有通过比较才能得出结论, ...

  4. NLP文本相似度 - LCS(最长公共子序列)java代码

    LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 比如,对于char x[ ...

  5. 语音识别的JavaSDK与文本相似度计算

    目录 语音识别 文本相似度计算 Jaccard相似度算法 LCS(最长公共子序列) 编辑距离 语音识别 阿里云提供的语音识别的Java SDK文档 文本相似度计算 Jaccard相似度算法 Jacca ...

  6. 文本相似度检测之余弦相似度

    为什么文本也需要余弦相似度 文本的余弦相似度是为了计算文本的相似程度而引入的一种方法,例如我们要比较这样两句话的相似程度: A句子:你笑起来真好看. B句子:你笑起来不好看. 这两句话,看起来很相似了 ...

  7. 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度

    自然语言处理(NLP)之使用TF-IDF模型计算文本相似度 所用数据集:ChnSentiCorp_htl_all.csv 语料库即存放稀疏向量的列表. 要注意的是,搜索文本text与被检索的文档共用一 ...

  8. 从0到1,了解NLP中的文本相似度

    本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...

  9. 【NLP实战】基于ALBERT的文本相似度计算

    实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式.因此,NLP专栏推出了实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试. ALBERT是一个比BERT要轻量,效果更好的模型,本篇 ...

最新文章

  1. python怎么导入视频-python中的导入如何使用,以及.和..相对导入的使用
  2. 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  3. Java源代码分析与生成
  4. java 打印命令_Java 普通命令行程序main关掉 DEBUG 打印
  5. di-tech2016_2016年Tech最佳愚人节笑话
  6. java后端技术路线_Java后端精选技术:Java的反射机制
  7. 美团点评成中国第三大互联网公司!
  8. UnityShader14.1:透明效果实现(下)
  9. qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
  10. PHP array_diff_assoc
  11. React Native状态机和应用设计思路
  12. matlab-高数 反、双曲、正、余弦、正切函数
  13. Process-wide API spying - an ultimate hack 摘要翻译(二)
  14. 熬夜肝出 3w 字测试开发学习路线
  15. 计算机软考证书含金量和性价比分析
  16. TCP FIN_WAIT1状态的实验和验收
  17. 服务器做系统怎么规划,如何做系统容量规划 | 知行天下
  18. 如何进入游戏行业成为一个程序员(摘自Geoff Howland)
  19. python人物抠图算法_比PS还好用!Python 20行代码批量抠图
  20. OpenFOAM 量纲检查开启和关闭

热门文章

  1. 深度 | 推荐系统如何冷启动?
  2. 校验 CentOS 7 镜像文件
  3. 《TCP/IP网络编程》课后练习答案第一部分6~10章 尹圣雨
  4. 你不得不知的6位95后创业者,95后的创业时代已经到来?
  5. 2022怎么开个人淘宝网店?星志远电商
  6. poi读取excel模板,并填充数据
  7. 为什么mysql字段要使用NOT NULL
  8. Excel——快速删除空白行、空白单元格
  9. 3D模型的加载与使用
  10. 计算机路由器无线级联配置,两个无线路由器级联设置上网的教程