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# 生成Zip压缩包代码

    让我来为你详细讲解如何基于C#生成Zip压缩包的完整攻略。 步骤一:安装DotNetZip库 生成Zip压缩包代码首先需要安装一个叫做DotNetZip的开源库。DotNetZip是一个C#库,可以帮助我们生成ZIP压缩文件,并提供了丰富的参数供我们配置和自定义。 你可以通过NuGet包管理器或手动下载来安装DotNetZip库。 //NuGet命令 Ins…

    C# 2023年6月1日
    00
  • C#的path.GetFullPath 获取上级目录实现方法

    下面就是使用C#中的Path类的GetFullPath方法获取上级目录的实现方法。 1. 基本用法 Path.GetFullPath方法可以将相对路径转换为绝对路径,同时也可以获取当前路径的完整路径。 下面是示例代码: string path = "../example.txt"; string fullPath = Path.GetFu…

    C# 2023年6月1日
    00
  • 列举ASP.NET页面之间传递值的几种方式

    ASP.NET页面之间传递值的几种方式: 1. 查询字符串(Query String) 这是最常见的一种方式,通过URL传递参数,例如: Response.Redirect("http://www.example.com/Page2.aspx?user_id=12345"); 在Page2.aspx页面中获取传递的参数: string u…

    C# 2023年6月3日
    00
  • 在C# 8中如何使用默认接口方法详解

    当在一个现有的接口中添加新的成员时,会面临着兼容性问题,因为所有使用该接口的实现类都需要进行相应的修改。针对这种情况,C# 8推出了接口的默认实现方法的特性。通过默认实现方法,接口的作者可以为接口提供新功能,而无需破坏面向对象设计中的接口整体抽象性原则。 一、默认接口方法的定义 默认接口方法的定义与普通接口方法一致,不同的在于将其实现体嵌入在接口定义之中,并…

    C# 2023年6月6日
    00
  • 用C#来解析PDF文件

    当我们要使用 C# 来解析 PDF 文件时,可以使用一些开源库,例如 iTextSharp、PDFSharp 和 Syncfusion.PDF 等。这些库可以帮助我们进行 PDF 文档的读取和编辑,并且提供了一些 API 用于实现文档的操作。 接下来,我们来具体讲解使用 iTextSharp 库和 PDFSharp 库来解析 PDF 文件的两个示例: 示例1…

    C# 2023年5月15日
    00
  • C#精确到纳秒级别的计时器类实现代码

    下面我将为您详细讲解“C#精确到纳秒级别的计时器类实现代码”的完整攻略。 1. 实现思路 在C#中,我们可以使用System.Diagnostics.StopWatch类来实现高分辨率的计时器。StopWatch能够提供极其精确的计时,其精度可达纳秒级别,而且使用非常简单。 StopWatch通过读取计算机系统时钟记录时间,并在计时暂停、重启和停止时自动计算…

    C# 2023年6月1日
    00
  • c#版在pc端发起微信扫码支付的实例

    下面我将为您详细讲解c#版在pc端发起微信扫码支付的实例。 准备工作 首先,您需要一个微信商户号和应用密钥,以便进行微信支付。如果您还没有,请前往微信支付官网注册并申请。 其次,使用c#语言的开发环境(如:Visual Studio)来编写代码。 最后,您需要下载微信支付的SDK包,该包提供了相应的API和文档,便于开发。 编写代码 引用微信支付SDK 在代…

    C# 2023年5月31日
    00
  • C#中使用CliWrap让命令行交互举重若轻

    CLIWrap是一个C#库,它允许我们在C#代码中调用命令行工具(例如,FFmpeg,ImageMagick等),并简化与这些命令行工具的交互。以下是使用CliWrap的C#代码,用于从命令行执行ffmpeg: using CliWrap; using CliWrap.Models; using System; using System.IO; using …

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