开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 11506|回复: 55
收起左侧

[易语言纯源码] 快速计算文本相似度

[复制链接]
发表于 2016-4-19 01:42:05 | 显示全部楼层 |阅读模式   湖南省株洲市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 梦中的挂念 于 2016-4-19 09:49 编辑

考虑求出最长子序列(LCS),再除以两串中最长的,得出相似度。


求最长子序列有穷举法,设字符串长度为n,其计算量为2的n次方,十分恐怖。


所以考虑使用动态规划递推解决。

注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。


首先,子序列和子串是不一样的。子串是连续的,而子序列中的元素组成可以是不连续的,但元素的位置下标一定是递增的。以一个字串S = "abcdef"为例,字串S的一个子串是"abc",'cdef'这种连续的,而子序列可以是"abc",也可以是"af ",给人的直观感觉就是用S中的字符拼凑成的,但f一定在a之前。

      我们设有两个字符串X和Y,其中,X={x0, x1, x2, ....xi },Y={y0, y1, y2, yj }。用lcs(i , j)表示字符串X与Y的最长公共子序列的长度。
由动态规划思想可知,问题的最优解是由子问题的最优解构成的,所以lcs(i,j) 的值与lcs(i-1, j-1), lcs(i-1, j), lcs(i, j-1) 都有一定的关系。
要确定lcs(i,j)的值,首先比较一下xi, yj 的值,有以下2种情况:

1. xi == yj,说明xi与yj 一定在最长公共子序列中,所以lcs (i , j) 是由lcs(i-1,j -1)之前的值决定的,即
     lcs(i,j) = lcs(i-1, j-1) + 1;
2. xi != yj ,设在最长公共子序列中的最后一个值为zk,可能zk == xi,也可能zk == yj,也可能zk与xi, yj的值都不同。
    这3种情况的分析如下:
     a. zk == xi, 那么最长公共子序列取决于去掉yj的Y字符串与X字符串的最长公共子序列,
         即lcs(i, j) = lcs(i, j-1);
     b. 与a同理,若yj在最长公共子序列中,那么lcs(i, j) = lcs(i - 1, j);
     c. zk与xi, yj的值都不同,那么lcs( i, j ) 的值取决于去掉xi的X字串与去掉yj的Y字串的最长公共子序列的长度,即
         lcs(i, j) = lcs( i-1, j-1)。

     结合a,b,c的情况,因为最长公共子序列必有最大的长度,所以
     lcs(i, j) = max ( lcs( i-1, j) , lcs( i, j-1) )。这个公式之所以包含情况c,是因为在情况c下,最长公共子序列的最后一个
     值zk肯定是xi与yj之前的位置上的值,xi 与yj 在这种情况下对最长公共子序列的长度没有影响力,所以在这种情况下,
      lcs( i-1, j) 和 lcs( i, j-1)都等于lcs (i -1, j -1),可归并到公式中。


因此可得状态转移方程为:



if (xi == yj) LCS(i,j) = LCS(i-1, j-1) + 1
if (xi != yj) LCS(i, j) = max ( LCS( i-1, j) , LCS( i, j-1) )



具体请看源码
快速计算文本相似度.zip (2.2 KB, 下载次数: 963)

评分

参与人数 3好评 +3 精币 +10 收起 理由
lzx964753100 + 1 + 2 不错呀
冰点 + 1 + 5 精彩文章希望继续努力
村雨 + 1 + 3 感谢发布原创作品,精易因你更精彩!

查看全部评分


本帖被以下淘专辑推荐:

结帖率:82% (31/38)

签到天数: 12 天

发表于 前天 22:15 | 显示全部楼层   福建省泉州市
回复 支持 反对

使用道具 举报

结帖率:87% (13/15)

签到天数: 13 天

发表于 2024-5-17 22:23:34 | 显示全部楼层   山东省济南市
精彩文章希望继续努力
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2024-3-16 23:10:22 | 显示全部楼层   江苏省苏州市
666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:50% (7/14)

签到天数: 3 天

发表于 2024-2-29 19:12:25 | 显示全部楼层   江西省吉安市
为什么是短整数型啊?我要比较的字符串比较长呢?
回复 支持 反对

使用道具 举报

结帖率:98% (107/109)

签到天数: 20 天

发表于 2024-2-22 21:38:12 | 显示全部楼层   山东省青岛市
谢谢分享,学习一下
回复 支持 反对

使用道具 举报

签到天数: 12 天

发表于 2024-2-7 21:52:12 | 显示全部楼层   广东省广州市
谢谢分享,学习一下
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)

签到天数: 20 天

发表于 2024-1-24 07:46:17 | 显示全部楼层   贵州省黔南布依族苗族自治州
谢谢分享,学习一下
回复 支持 反对

使用道具 举报

结帖率:65% (11/17)

签到天数: 19 天

发表于 2024-1-20 22:20:16 | 显示全部楼层   北京市北京市
谢谢分享,学习一下
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 20 天

发表于 2024-1-15 22:05:09 | 显示全部楼层   河北省邯郸市
我来看看了
回复 支持 反对

使用道具 举报

发表于 2023-11-18 23:22:42 | 显示全部楼层   辽宁省沈阳市
学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表