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;
        }
    }


}

 

 

谢谢浏览!

 

转载于:https://www.cnblogs.com/Music/p/string-similarity-demo-in-dotnet.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 可以使用 Levenshtein 距离算法来计算两个字符串之间的相似度。 Levenshtein 距离是指将一个字符串转换成另一个字符串所需的最少编辑次数,其每个编辑操作可以是插入、删除或替换一个字符。可以通过计算两个字符串之间的 Levenshtein 距离来衡量它们之间的相似度。 下面是一个计算 Levenshtein 距离的 C# 函数: ```csharp public static int LevenshteinDistance(string s, string t) { int n = s.Length; int m = t.Length; int[,] d = new int[n + 1, m + 1]; if (n == 0) { return m; } if (m == 0) { return n; } for (int i = 0; i <= n; i++) { d[i, 0] = i; } for (int j = 0; j <= m; j++) { d[0, j] = j; } for (int j = 1; j <= m; j++) { for (int i = 1; i <= n; i++) { if (s[i - 1] == t[j - 1]) { d[i, j] = d[i - 1, j - 1]; } else { d[i, j] = Math.Min(Math.Min(d[i - 1, j], d[i, j - 1]), d[i - 1, j - 1]) + 1; } } } return d[n, m]; } ``` 使用此函数,可以计算两个字符串之间的 Levenshtein 距离,然后通过一些转换得出它们之间的相似度。 例如,可以使用以下公式计算相似度: ``` similarity = 1 - (distance / max(len(s), len(t))) ``` 其,`distance` 是 Levenshtein 距离,`len(s)` 和 `len(t)` 分别是两个字符串的长度。`similarity` 的取值范围是 [0, 1],值越大表示相似度越高。 使用 C# 代码实现这个公式可以是: ```csharp public static double StringSimilarity(string s, string t) { int distance = LevenshteinDistance(s, t); int maxLength = Math.Max(s.Length, t.Length); return 1.0 - (double)distance / maxLength; } ``` 这个函数返回两个字符串之间的相似度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值