C#计算2个字符串的相似度

首先,计算两个字符串的相似度是一件比较复杂的问题,因为相似度有很多种计算方法,涉及到文本相似度、编辑距离、余弦相似度等不同的算法。在这里,我将介绍一种基于余弦相似度算法的实现。

1. 余弦相似度算法简介

余弦相似度是一种用来度量两个向量之间的相似度的方法,它主要被用于计算文本的相似度。其原理就是将两个文本看成两个向量,然后计算这两个向量之间的夹角。

余弦相似度的计算公式如下:

similarity = cos(theta) = A • B / |A| • |B|

其中 A 和 B 分别表示两个向量,计算过程分为三个步骤:

  1. 将两个文本分词,将分词后的结果表示成向量,向量中的每个元素表示一个词的出现频率;
  2. 计算两个向量之间的点乘积;
  3. 计算两个向量的模长,并将点乘积除以两个向量的模长。

通过这种方法计算余弦相似度,可以得到两个文本的相似度值,值越大表示两个文本越相似。

2. C#实现

在C#中,我们可以使用 System.Linq 命名空间中的 LINQ查询语句和字符串操作来实现文本分词和词频统计。

下面是程序的核心代码:

public static double GetSimilarity(string text1, string text2)
{
    // 分词
    var words1 = text1.Split().ToList();
    var words2 = text2.Split().ToList();

    // 取并集
    var union = words1.Union(words2).ToList();

    // 统计词频
    var freq1 = union.Select(w => (double)words1.Count(x => x == w)).ToArray();
    var freq2 = union.Select(w => (double)words2.Count(x => x == w)).ToArray();

    // 计算余弦相似度
    var dotProduct = DotProduct(freq1, freq2);
    var magnitute1 = Magnitude(freq1);
    var magnitute2 = Magnitude(freq2);
    return dotProduct / (magnitute1 * magnitute2);
}

private static double DotProduct(double[] a, double[] b)
{
    var dotProduct = 0d;
    for (var i = 0; i < a.Length; i++)
    {
        dotProduct += a[i] * b[i];
    }
    return dotProduct;
}

private static double Magnitude(double[] vector)
{
    var sum = 0d;
    for (var i = 0; i < vector.Length; i++)
    {
        sum += vector[i] * vector[i];
    }
    return Math.Sqrt(sum);
}

以上代码中的 GetSimilarity 方法实现了两个字符串之间的相似度计算。它首先对传入的两个字符串进行分词,然后将分词结果合并并去重,统计每个词在两个字符串中的出现次数,最后计算这两个词频向量之间的余弦相似度。

下面是示例代码调用:

var text1 = "Hello world! This is a test.";
var text2 = "This is a test. Hello world!";

var similarity = GetSimilarity(text1, text2);
Console.WriteLine($"相似度:{similarity:P2}");

输出结果为:

相似度:100.00%

可以看到,这两个字符串的相似度为 100%。如果我们将一个字符串中的某个单词改成大小写,那么它们的相似度应该会下降:

var text1 = "Hello world! This is a test.";
var text2 = "This is a Test. Hello world!";

var similarity = GetSimilarity(text1, text2);
Console.WriteLine($"相似度:{similarity:P2}");

输出结果为:

相似度:82.03%

可以看到,这两个字符串的相似度下降到了82.03%。这说明余弦相似度算法对大小写是敏感的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#计算2个字符串的相似度 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • C# 实现在控制台上换行输出与不换行输出

    C# 实现在控制台上换行输出与不换行输出 在C#中,我们可以使用Console.WriteLine()方法以及Console.Write()方法实现在控制台上换行输出与不换行输出。 换行输出 使用Console.WriteLine()方法可以实现在控制台上换行输出。以下是该方法的语法: Console.WriteLine(); 当我们在调用Console.W…

    C# 2023年6月7日
    00
  • .Net整合Json实现REST服务客户端的方法详解

    .Net整合Json实现REST服务客户端 什么是REST服务? REST(Representational State Transfer)是目前最流行的一种网络应用程序的设计风格和开发方式,是一种轻量级的Web服务解决方案。它采用REST架构,通过HTTP协议实现,既可以返回XML或JSON格式的数据。 相较于SOAP,REST服务具有轻量级、易于缓存、可…

    C# 2023年5月31日
    00
  • 解析C#面向对象编程中方法(method)的使用

    解析C#面向对象编程中方法的使用 C#中的方法是一种封装了代码的基本单元,其中包含了一系列的语句,并可以接收参数、执行操作,并返回值。 方法的定义 在C#中,方法必须定义在类中。其定义的语法如下: [访问修饰符] [修饰符] 返回类型 方法名称([参数列表]) { // 方法体 } 其中,访问修饰符和修饰符是可选的。返回类型可以是任何有效的数据类型或者voi…

    C# 2023年5月15日
    00
  • 几分钟搞懂c#之FileStream对象读写大文件(推荐)

    下面我将详细讲解“几分钟搞懂c#之FileStream对象读写大文件(推荐)”的完整攻略。 1. FileStream对象读取大文件 1.1 创建一个FileStream对象 首先我们需要创建一个FileStream对象。FileStream对象是用来读写文件的。它的构造函数有三个参数: 文件的路径 操作文件的模式,如读取/写入等 文件权限,如读取/写入等 …

    C# 2023年6月1日
    00
  • c#创建vc可调用的com组件方法分享

    下面我就来详细讲解一下“C#创建VC可调用的COM组件方法分享”的完整攻略。 1. 确定组件需求 首先,我们需要确定下自己需要开发什么样的组件,这是COM组件开发的第一步。根据需求确定组件接口和类,建议先画一张组件结构图,方便我们更好地理解组件整体架构。 2. 创建COM组件项目 打开Visual Studio创建新的C# Class Library项目,选…

    C# 2023年6月7日
    00
  • 微信小程序与AspNetCore SignalR聊天实例代码

    微信小程序与AspNetCore SignalR聊天实例代码 在本攻略中,我们将详细讲解如何使用微信小程序和AspNetCore SignalR实现聊天功能,并提供两个示例说明。 步骤一:创建AspNetCore SignalR应用程序 首先,我们需要创建一个AspNetCore SignalR应用程序。您可以使用Visual Studio创建一个新的Asp…

    C# 2023年5月17日
    00
  • C# 输出字符串到文本文件中的实现代码

    下面是在 C# 中输出字符串到文本文件中的实现代码攻略: 1. 创建文件并写入字符串 代码实现 using System.IO; // 定义字符串变量 string str = "hello world!"; // 创建一个文件流 FileStream fs = new FileStream("output.txt",…

    C# 2023年5月31日
    00
  • HttpWebRequest实现下载图片至本地

    下面我来详细讲解如何用 HttpWebRequest 实现下载图片至本地: 1. HttpWebRequest 简介 HttpWebRequest 是 .NET Framework 提供的一个类,用于创建 HTTP 请求并与 Web 服务器进行通信。使用 HttpWebRequest 可以发送 GET、POST 和其他 HTTP 请求,在本例中,我们将使用 …

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部