C# 中如何判断字符串的相似度
基于 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# 中如何判断字符串的相似度的更多相关文章
- 在shell中如何判断字符串是否为有效的IP地址【转】
转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...
- Oracle中如何判断字符串是否全为数字
Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是 ...
- Oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数).这个办法是一个公司同事发现的,用起来很方便,但理解 ...
- asp.net 中如何判断字符串中有几个逗号 (asp也通用)
如: 字符串 a="1,2,3"; 怎样判断a 中的逗号 有几个 len(a)-len(replace(a,",",""))
- JS 中如何判断字符串类型的数字
function isNumberStr(str){ var n = Number(str); return !isNaN(n); } console.log(isNumberStr('37')); ...
- python利用difflib判断两个字符串的相似度
我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...
- 用递归法判断字符串A中包含多少个字符串B
string类提供了判断字符串B在字符串A中首次(或最后)出现的Index的方法,但有时候需要判断B在A中出现了多少次. 为此想了一个算法. public static void CountIndex ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- [转]Java中怎样判断一个字符串能否转成数字
原文地址:http://blog.sina.com.cn/s/blog_7bac470701014mjf.html 判断字符串是否为数字 //1.正则表达式 public static boolea ...
随机推荐
- windows之自动化在虚拟机部署操作系统并自带python环境
(1)使用详情: **************************** * 操作说明 * **************************** 1.修改Config文件夹中的Se ...
- C语言多线程的一个简单例子
多线程的一个简单例子: #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- ASP.NET Aries 高级开发教程:主题样式及多语言(标签化控制)
前言: 最新ASP.NET Aries升级到V5.2.0以上之后,之前的样式和多语言机制,有了重大的升级机制,这篇就简单介绍一下. 1.控制开关 在配置维护那里,新增了两个控制项: 2.如何添加主题 ...
- Asp.net Core的Swagger接口根据模块、版本分组
近期一直在学习Asp.net Core,微软的文档太难看,都是英文翻译过来的,很不友好,感谢这个博客,从壹开始前后端分离[ .NET Core2.0 +Vue2.0 ],让我入门了,刚学到这个Swag ...
- Java实现Http请求的常用方式
一.使用Java自带的java.io和java.net包. 实现方式如下: public class HttpClient { //1.doGet方法 public static String doG ...
- Identity Server 4 - Hybrid Flow - 保护API资源
这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源. 保护MVC客户端的文章: https://w ...
- 死磕 java集合之LinkedHashSet源码分析
问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ...
- 内联汇编获取Kernaer32基址.
DWORD GetKerner32ImageBase() { DWORD nIMageBase = 0; __asm { xor edx,edx mov ecx, fs:[0x30]; mov ecx ...
- kubernetes系列09—Ingress控制器详解
本文收录在容器技术学习系列文章总目录 1.认识Ingress 1.1 什么是Ingress? 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问.所有到达边界路由器的流量或被丢弃或 ...
- MySQL/MariaDB数据库忘掉密码解决办法--技术流ken
前言 有些时候我们常常会忘掉一些服务的密码,比如系统密码,我们可以进入救援模式进行修改密码,可参考我之前的博客<Centos7破解密码的两种方法--技术流ken>.但有些时候我们也会忘掉数 ...