基于 F23.StringSimilarity.dll  组件。Github 上可以搜索到该组件。

核心方法:

var l = new Levenshtein();
double tempValue = l.Distance("我是中国人", "我是中国人。"); // 将返回 1

下面是我扩展的方法,从一个集合中找到与目标字符串最相似的一个或多个字符串。

比如:["我是中国人", "我是美国人", "我的中国心", "我是中国通"]  ,现在要找到 和 “我是中国” 最接近的字符串(可能有多个)。

如果用我下面的扩展方法。返回值

SimilarityValue = 1,  SimilarityTargetList = ["我是中国人", "我是中国通"]

有需要的请拿走,不谢。

using F23.StringSimilarity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Demo
{
/// <summary>
/// 相似度结果信息
/// </summary>
/// <typeparam name="TSource">源集合的类型</typeparam>
public class SimilarityResultInfo<TSource>
{
/// <summary>
/// 相似度值。值越小,表示差异越小。等于 1 表示只有一个字符差异。等于 0 表示完全相等。
/// </summary>
public double SimilarityValue { get; set; } /// <summary>
/// 相似度等于 1 表示只有一个字符差异,则最接近的可能有一个或多个字符串
/// </summary>
public IEnumerable<TSource> SimilarityTargetList { get; set; }
} /// <summary>
/// IEnumerable的扩展类,扩展了一个名为 Similarity 的方法
/// </summary>
public static class EnumerableMethodSimilarityExtension
{
/// <summary>
/// 获取集合中和目标字符串最相似的集合(备注:比如:相似度等于 1 表示只有一个字符差异,则最接近的可能有一个或多个字符串)
/// </summary>
/// <param name="source">源集合</param>
/// <param name="targetText">目标字符串</param>
/// <returns>如果 source 没有元素,则返回 NULL。否则,返回值不为 NULL</returns>
public static SimilarityResultInfo<string> Similarity(this IEnumerable<string> source, string targetText)
{
return Similarity<string>(source, c => c, targetText);
} /// <summary>
/// 获取集合中和目标字符串最相似的集合(备注:比如:相似度等于 1 表示只有一个字符差异,则最接近的可能有一个或多个字符串)
/// </summary>
/// <typeparam name="TSource">源集合的类型</typeparam>
/// <param name="source">源集合</param>
/// <param name="textSelector">源集合要比较的属性</param>
/// <param name="targetText">目标字符串</param>
/// <returns>如果 source 没有元素,则返回 NULL。否则,返回值不为 NULL</returns>
public static SimilarityResultInfo<TSource> Similarity<TSource>(this IEnumerable<TSource> source, Func<TSource, string> textSelector, string targetText)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (textSelector == null)
{
throw new ArgumentNullException("textSelector");
}
var l = new Levenshtein(); // 检查 2 个字符串的相似度。
double? minStringSimilarityValue = null;
List<TSource> similarityTargetList = null;
foreach (var item in source)
{
string elementTextValue = textSelector(item);
if (string.IsNullOrEmpty(elementTextValue))
{
continue;
}
double tempValue = l.Distance(elementTextValue, targetText);
if (!minStringSimilarityValue.HasValue)
{
//说明是第一次比较。http://music.cnblogs.com
minStringSimilarityValue = tempValue;
similarityTargetList = new List<TSource>() { item };
continue;
}
if (tempValue < minStringSimilarityValue.Value)
{
minStringSimilarityValue = tempValue;
similarityTargetList.Clear();
similarityTargetList.Add(item);
continue;
}
if (tempValue == minStringSimilarityValue.Value)
{
similarityTargetList.Add(item);
continue;
}
}
if (!minStringSimilarityValue.HasValue)
{
//说明集合是空的
return null;
}
SimilarityResultInfo<TSource> result = new SimilarityResultInfo<TSource>();
result.SimilarityValue = minStringSimilarityValue.Value;
result.SimilarityTargetList = similarityTargetList;
return result;
}
} }

谢谢浏览!

C# 中如何判断字符串的相似度的更多相关文章

  1. 在shell中如何判断字符串是否为有效的IP地址【转】

    转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...

  2. Oracle中如何判断字符串是否全为数字

    Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是 ...

  3. Oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字

    本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数).这个办法是一个公司同事发现的,用起来很方便,但理解 ...

  4. asp.net 中如何判断字符串中有几个逗号 (asp也通用)

    如: 字符串 a="1,2,3"; 怎样判断a 中的逗号 有几个 len(a)-len(replace(a,",",""))

  5. JS 中如何判断字符串类型的数字

    function isNumberStr(str){ var n = Number(str); return !isNaN(n); } console.log(isNumberStr('37')); ...

  6. python利用difflib判断两个字符串的相似度

    我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...

  7. 用递归法判断字符串A中包含多少个字符串B

    string类提供了判断字符串B在字符串A中首次(或最后)出现的Index的方法,但有时候需要判断B在A中出现了多少次. 为此想了一个算法. public static void CountIndex ...

  8. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  9. [转]Java中怎样判断一个字符串能否转成数字

    原文地址:http://blog.sina.com.cn/s/blog_7bac470701014mjf.html 判断字符串是否为数字 //1.正则表达式  public static boolea ...

随机推荐

  1. vmware P2V迁移域内windows服务器脱域问题

    windows 域服务器采用vmware converter进行物理机转换为虚拟机,需要在完成后进行退域重新加域操作. 否则,有可能会出现服务器在30天后脱域情况.出现脱域情况,可以通过退域加域的方式 ...

  2. 织梦dedecms如何修改关键词的字数长度限制

    亲测,这个教程比较完善,百度了很多有些少步骤,或者方法根本不对,导致不成功.这个方法我亲子测试了.奏效. 首先登陆数据库后台,如phpmyadmin,找到相应的数据表dede_archives和ded ...

  3. Django-CSRF跨站请求伪造防护

    前言 CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为C ...

  4. Ambari 常用的 REST API 介绍

    源码文档路径:ambari\ambari-server\docs\api\v1 swagger风格api文档:https://www.cnblogs.com/felixzh/p/10694724.ht ...

  5. 查看三种MySQL字符集的方法(转)

    MySQL字符集多种多样,下面为您列举了其中三种最常见的MySQL字符集查看方法,该方法供您参考,希望对您学习MySQL数据库能有所启迪. 一.查看MySQL数据库服务器和数据库MySQL字符集. m ...

  6. Linux内存管理 (5)slab分配器

    专题:Linux内存管理专题 关键词:slab/slub/slob.slab描述符.kmalloc.本地/共享对象缓冲池.slabs_partial/slabs_full/slabs_free.ava ...

  7. 使用 Node.js 搭建 Web 服务器

    使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块.文件系统.url解析模块.路径解析模块.以及301重定向技术等, ...

  8. 图的BFS----迷宫问题

    题目描述: ...11111111111111111111111111111 11.111111........1111111111.1111 11.111111..111.11111111..... ...

  9. Vue.js-03:第三章 - 事件修饰符的使用

    一.前言 熟悉了 Vue 的指令系统后,在实际开发中,不可避免的会使用到对于事件的操作,如何处理 DOM 事件流,成为我们必须要掌握的技能.不同于传统的前端开发,在 Vue 中给我们提供了事件修饰符这 ...

  10. SpringSecurity设置角色和权限的注意点

    概念 在UserDetailsService的loadUserByUsername方法里去构建当前登陆的用户时,你可以选择两种授权方法,即角色授权和权限授权,对应使用的代码是hasRole和hasAu ...