当前位置:网站首页>C# F23.StringSimilarity库 字符串重复度、文本相似度、防抄袭
C# F23.StringSimilarity库 字符串重复度、文本相似度、防抄袭
2022-04-23 11:35:00 【铺侦探-刘亚东】
最近在我们的铺侦探(买铺租铺就上铺侦探)项目中,为了防止经纪人发布铺源的时候抄袭其他经纪人的铺源介绍,所以我们准备根据内容的相似度进行初步的防抄袭判断。
话不多说,懒得打字,下面直接上干货:
直接在VS的Nuget管理器中搜索:F23.StringSimilarity安装。GitHub传送门,里面有详细的介绍,并且也在不断更新。
该库目前实现了十多种算法,根据自己的需求选取合适自己业务的算法,每一种算法都有自己的优缺点,建议把每一种算法大致弄明白,方便自己选择使用哪种,可以根据该插件中每个算法的命名去搜索了解。
下图是通过谷歌自动翻译的十多种算法截图,上面的GitHub传送门可以自己进去看,每一种的算法都有介绍:
每种算法的使用都很简单,下面是各种算法的使用示例:
public static void Main(string[] args)
{
var str1 = Html2Text(@"<div><div style='padding: 10px 0 5px 0'><p>1:物业面积:二楼 1221㎡,三楼:518㎡。<br/>2:整层卖,独立过道,可以自己打通使用啊。<br/>3:旅游度假区,人流量非常大。</p></div></div>");
var str2 = Html2Text(@"<div><div style='padding: 10px 0 5px 0'><p>1:<br/> 三楼:518.76平方米<br/> 2:整层,独立过道,可以自己打通使用<br/>3:旅游度假区,大型商业街中心,人流量超大。</p></div></div>");
var jaroWinkler = new JaroWinkler();
var a= jaroWinkler.Similarity(str1, str2);
var normalizedLevenshtein = new NormalizedLevenshtein();
var b= normalizedLevenshtein.Similarity(str1, str2);
var cosine = new Cosine();
var c= cosine.Similarity(str1, str2);
var jaccard = new Jaccard();
var d = jaccard.Similarity(str1, str2);
var sorensenDice = new SorensenDice();
var e = sorensenDice.Similarity(str1, str2);
var ratcliffObershelp = new RatcliffObershelp();
var f = ratcliffObershelp.Similarity(str1, str2);
var longestCommonSubsequence = new LongestCommonSubsequence();
var g= longestCommonSubsequence.Distance(str1, str2);
}
public static string Html2Text(string htmlStr)
{
if (String.IsNullOrEmpty(htmlStr))
{
return "";
}
string regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
string regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
string regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式
htmlStr = Regex.Replace(htmlStr, regEx_style, "");//删除css
htmlStr = Regex.Replace(htmlStr, regEx_script, "");//删除js
htmlStr = Regex.Replace(htmlStr, regEx_html, "");//删除html标记
htmlStr = Regex.Replace(htmlStr, "\\s*|\t|\r|\n", "");//去除tab、空格、空行
htmlStr = htmlStr.Replace(" ", "");
htmlStr = htmlStr.Replace("\"", "");
htmlStr = htmlStr.Replace("\"", "");
htmlStr = htmlStr.Replace(" ", "");
return htmlStr.Trim();
}
顺便赠送一个过滤html代码的函数,上图中的Html2Text(string htmlStr)
哈哈。
然后说说我自己使用的思路吧,我用的是这个:NormalizedLevenshtein,相似度值在0~1之间
因为在网上查询了一下,这个算法比较适合论文的抄袭判断,比较符合我的需求,当然还需要加入一些自己的逻辑,比如把两个字符串的html代码去掉再比较,数字字母是否需要比较等等,然后设置一个阀值,我设置的是0.65,大于这个值就认为是抄袭的。当然抄袭只是说的是本系统直接的抄袭,因为我只与本系统之间的数据进行了比较。
版权声明
本文为[铺侦探-刘亚东]所创,转载请带上原文链接,感谢
https://blog.csdn.net/superman26/article/details/124350055
边栏推荐
- Using Baidu PaddlePaddle EasyDL to accomplish specified target recognition
- mysql插入datetime类型字段不加单引号插入不成功
- MySQL Router重装后重新连接集群进行引导出现的——此主机中之前已配置过的问题
- 云呐|固定资产盘点中,支持多种盘点方式(资产清查盘点)
- Learning go language 0x02: understanding slice
- Overall plan management mode in maker Education
- map<QString, bool> 的使用记录
- Laravel增加自定义助手函数
- 项目实训-火爆辣椒
- [Web 每日一练] 八色拼图(float)
猜你喜欢
Database design of simple voting system
Simple construction of rebbitmq
抓包整理————tcp 协议[八]
Laravel绑定钉钉群警报(php)
GPU, CUDA,cuDNN三者的关系总结
Practical data Lake iceberg lesson 30 MySQL - > iceberg, time zone problems of different clients
配电房远程综合监控系统在10kV预制舱项目中的应用
Change exchange II - [leetcode]
Redis learning 5 - high concurrency distributed lock practice
Canvas详解
随机推荐
初探 Lambda Powertools TypeScript
How does QT turn qwigdet into qdialog
Usage record of map < qstring, bool >
redis优化系列(二)Redis主从原理、主从常用配置
Interprocess communication -- message queue
Using Baidu PaddlePaddle EasyDL to accomplish specified target recognition
Overall plan management mode in maker Education
tensorflow常用的函数
Maker education for primary and middle school students to learn in happiness
Tensorflow使用keras创建神经网络的方法
How to count fixed assets and how to generate an asset count report with one click
Laravel增加自定义助手函数
Nacos Foundation (9): Nacos configuration management from single architecture to microservices
oh-my-lotto
qt 64位静态版本显示gif
用curl库压缩成发送字符串为utf8并用curl库发送
分享两个实用的shell脚本
TclError: no display name and no $DISPLAY environment variable
解读2022机器人教育产业分析报告
卷积层和池化层总结