如果词可能有缩写、近义词或拼写差异,可以使用 字符串相似度算法

在C#中,如果不调用外部AI服务,可以通过以下几种本地方式来判断两个词是否属于同一类别或列表:

1. 字符串精确匹配(完全匹配)

如果只是简单的固定列表匹配,可以直接使用 ContainsEquals 方法:

List<string> category1 = new List<string> { "班级排名", "年级排名" };
string input = "年排";

bool isMatch = category1.Any(x => x.Contains(input) || input.Contains(x));
// 或者更严格的匹配
bool isExactMatch = category2.Contains(input);

2. 模糊匹配(相似度计算)

如果词可能有缩写、近义词或拼写差异,可以使用 字符串相似度算法,如:

  • Levenshtein Distance(编辑距离)
  • Jaro-Winkler Distance
  • Cosine Similarity(词向量方式,但需要本地词库)

示例(使用 FuzzySharp 库,需安装 FuzzySharp NuGet 包):

using FuzzySharp;

List<string> category = new List<string> { "班级排名", "年级排名" };
string input = "年排";

// 返回相似度最高的词
var bestMatch = Process.ExtractOne(input, category, scorer: ScorerCache.Get<PreparedRatioScorer>());
if (bestMatch.Score > 80)  // 设定阈值,如80%
{
    Console.WriteLine($"匹配到: {bestMatch.Value}");
}

3. 正则表达式(模式匹配)

如果词有固定模式(如“XX排名”),可以用正则表达式:

string input = "年排";
bool isMatch = Regex.IsMatch(input, @"(班|年)级?排名?");

4. 本地词向量(Word Embeddings)

如果有本地词向量库(如 Word2VecFastText 的预训练模型),可以计算词相似度:

// 示例:使用 TensorFlow.NET 或 ML.NET 加载本地词向量模型(较复杂)
// 需要提前训练或下载词向量文件

推荐方案

  • 如果词表固定且简单 → 方法1(精确匹配)
  • 如果有缩写或相似词 → 方法2(FuzzySharp)
  • 如果涉及复杂语义 → 方法4(本地词向量,但实现较复杂)

最简单的方式是 FuzzySharp,安装命令:

Install-Package FuzzySharp

这样可以避免调用AI,完全在本地运行。

posted @ 2025-04-16 23:13  青山下  阅读(83)  评论(0)    收藏  举报