我是靠谱客的博主 忧心小鸭子,最近开发中收集的这篇文章主要介绍比较两个字符串的相似度算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

平时的编码中,我们经常需要判断两个文本的相似性,不管是用来做文本纠错或者去重等等,那么我们应该以什么维度来判断相似性呢?这些算法又怎么实现呢?这篇文章对常见的计算方式做一个记录。Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次

数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能。现在提供一个比较两个字符串相似度的方法。通过计算出两个字符串的相似度,就可以通过Linq在内存中对数据进行排序和筛选,选出和目标字符串最相似的一个结果。本次所用到的相似度计算公式是 相似度=Kqq/(Kqq+Krr+Kss) (Kq > 0 , Kr>=0,Ka>=0) 其中,q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串2中存在,字符串1中不存在的单词总数. Kq,Kr和ka分别是q,r,s的权重,根据实际的计算情况,我们设Kq=2,Kr=Ks=1. 根据这个相似度计算公式,得出以下程序代码:

/// <summary>
 /// 获取两个字符串的相似度
/// </summary>
 /// <param name=”sourceString”>第一个字符串</param>
 /// <param name=”str”>第二个字符串</param>
 /// <returns></returns>
 public static decimal GetSimilarityWith(this string sourceString, string str)
 {
decimal Kq = 2;
 decimal Kr = 1;
 decimal Ks = 1;
char[] ss = sourceString.ToCharArray();
 char[] st = str.ToCharArray();
//获取交集数量
int q = ss.Intersect(st).Count();
 int s = ss.Length – q;
 int r = st.Length – q;
return Kq * q / (Kq * q + Kr * r + Ks * s);
 }

这就是计算字符串相似度的方法,但是实际应用时,还需要考虑到同义词或近义词的情况发生, 如“爱造人小说阅读的更新最快”和“爱造人小说阅读地更新最快” 。两个字符串在一定意义上说其实是相同的,如果使用上述方法计算就会出现不准确的情况。所以在实际应用的时候,我们需要替换同义词或近义词,计算替换后的相似度。如果是近义词,需要综合替换近义词前和近义词后的计算结果,得出两个字符串的实际相似度。

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

最后

以上就是忧心小鸭子为你收集整理的比较两个字符串的相似度算法的全部内容,希望文章能够帮你解决比较两个字符串的相似度算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部