C语言两个文本相似度的算法,两个文本相似度算法实现和对比
背景
最近做一个爬虫相关的项目,需要排除掉一些相似的链接,比如分页控件里上一页,下一页等等没什么用的链接.
编辑距离算法
编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
这个概念是由俄罗斯科学家Vladimir Levenshtein在1965年提出来的,所以也叫 Levenshtein 距离。它可以用来做DNA分析,拼字检测,抄袭识别等等。总是比较相似的,或多或少我们可以考虑编辑距离。
如果你去搜索编辑距离算法的话可能会看到下面的例子
如果str1=”ivan”,str2=”ivan”,那么经过计算后等于 0。没有经过转换。相似度=1-0/Math.Max(str1.length,str2.length)=1
如果str1=”ivan1”,str2=”ivan2”,那么经过计算后等于1。str1的”1”转换”2”,转换了一个字符,所以距离是1,相似度=1-1/Math.Max(str1.length,str2.length)=0.8
注意算法中的1,其实是固定的值.我就是因为这个值总是算不对走了一些弯路.还有一些文章中介绍算法的时候会用矩阵计算.但是我数学功底很差,所以用了另一种方式实现.
通过算法描述中可以知道,字符串的编辑操作可以是插入,删除,修改.这三个方式的编辑操作,操作数都记为1.那么我的实现中,其实是移除了插入和删除的两个操作,全部是修改操作.实现如下,有什么问题的话还请指出.谢谢!
public static int Levenshtein(string str1, string str2)
{
var maxLen = Math.Max(str1.Length, str2.Length);
var tmp1 = str1.PadRight(maxLen);
var tmp2 = str2.PadRight(maxLen);
var interval = 0.0f;
for (int i = 0; i < maxLen; i++)
{
if (tmp1[i] != tmp2[i])
{
interval += 1;
}
}
return Convert.ToInt32((1 - interval / maxLen) * 100);
}
杰卡德相似系数
Jaccard index, 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。
给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值
这个算法还是比较容易理解的,其实就是计算两个字符串中字符的交集和并集的比值.在实际使用时两个长度不相同的链接相似度过高的问题,而且在比对url这种场景下反斜线对于相似度的判断还是有一些影响的.经过简单的修改实现的代码如下
public static int Jaccard(string str1, string str2)
{
var tmp1 = Regex.Replace(str1, "/", "");
var tmp2 = Regex.Replace(str2, "/", "");
var intersect = tmp1.Intersect(tmp2).Count();
var union = tmp1.Union(tmp2).Count();
var abs = Math.Abs(tmp2.Length - tmp1.Length);
return Convert.ToInt32((double)intersect / (union + abs) * 100);
}
对比
分别使用两个算法计算以下两个网址的相似度
结果如下
算法
相似度
Jaccard
86%
Levenshtein
94%
延展
通过相似度算法似乎也可以实现爬虫中只抓取列表页中的内容链接
C语言两个文本相似度的算法,两个文本相似度算法实现和对比相关推荐
- 两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...
在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题,但它有一定缺陷,举个例子,看下面的两个字符串 我爱吃小青菜和各种鲜水果. 我很爱吃青菜与各样水果. 上面两个字符串,如果通过计算子串来求相 ...
- pbewithmd5anddes算法 对应.net_文本相似度算法之-simhash
文本相似度算法种类繁多,今天先介绍一种常见的网页去重算法Simhash. 1.什么是simhash simhash是google于2007年发布的一篇论文<Detecting Near-dupl ...
- R语言数据类型基础1 数值型、逻辑型与文本型
R语言数据类型基础1 数值型.逻辑型与文本型 我看的R语言教材是李东风老师写的,已经跟着写了一周的代码了,但是可能是缺乏练习和总结,我相当于是打了遍字而已.所以现在又回头总结一下,里面一些太过细节的操 ...
- bert获得词向量_无监督语义相似度匹配之Bert抽取文本特征实战
今天记一次采用bert抽取句子向量的实战过程,主要是想感受一下bert抽取出来的句子特征向量是否真的具有不错的语义表达. 在此之前,我们来回顾一下,如果我们想拿到一个句子的特征向量可以采用什么样的方式 ...
- 【相似度计算】详解文本相似度计算(介绍、公式)
本文收录于<深入浅出讲解自然语言处理>专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! 个人主页:有梦想的程序星空 个人介绍:小编是人工智能领域硕士,全栈工 ...
- 文本相似度检测的流程以及文本相似度的数学度量方法
1.流程: ①对于两个文本,通过特征提取的模型或手动实现,找出两个文本的关键字: ②从每个文本中各取出若干个关键词,把这些关键词合并成成一个集合,计算每个文本中各个词对于这个集合中的关键词的词频: ...
- 【转】自然语言处理:文本相似度计算(欧氏距离、余弦相似度、编辑距离、杰卡德相似度)
文本相似度,顾名思义是指两个文本(文章)之间的相似度,在搜索引擎.推荐系统.论文鉴定.机器翻译.自动应答.命名实体识别.拼写纠错等领域有广泛的应用. 与之相对应的,还有一个概念--文本距离--指的是两 ...
- 自然语言处理:文本相似度计算(欧氏距离、余弦相似度、编辑距离、杰卡德相似度)
文本相似度,顾名思义是指两个文本(文章)之间的相似度,在搜索引擎.推荐系统.论文鉴定.机器翻译.自动应答.命名实体识别.拼写纠错等领域有广泛的应用. 与之相对应的,还有一个概念--文本距离--指的是两 ...
- python中文相似度_基于TF-IDF、余弦相似度算法实现文本相似度算法的Python应用
基于TF-IDF算法.余弦相似度算法实现相似文本推荐--文本相似度算法,主要应用于文本聚类.相似文本推荐等场景. 设计说明 使用jieba切词,设置自定义字典 使用TF-IDF算法,找出文章的关键词: ...
- ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...
最新文章
- [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)
- oracle fra空间不足,ORACLE 基础解决方案1_扩大FRA区
- 2020年最新前端学习路线
- 如何提高科研论文录用率?
- layui数据表格获取当前页数
- 如何让计算机两个用户使用不同步,如何实现两台或多台电脑远程修改文件同步更新?...
- vue 查询框赋值后不可编辑_vue input 赋值无效
- 《网管员必读》系列丛书试读连载
- 那些聪明人都是怎么提高情商的?
- scp传输文件的命令
- 华为云服务器安全组设置
- 13个适合上班时做的保健小动作
- 中国农业机械融资租赁市场预测与投资战略报告(2023版)
- 从零开始 verilog 以太网交换机(一)架构分析
- C语言刷题随记 —— 国际象棋棋盘
- (21) 出行需求预测新视角---基于图卷积神经网络GCN的出租车OD需求预测
- java jtextarea.setfont,Java JTextArea用法
- 数值积分-龙贝格(Romberg)积分
- 使用scrapy创建一个项目爬取网易云音乐的所有歌手的相关资料
- web前端 html5 直播功能开发