C# 如何确定数组中哪个字符串与给定字符串最相似?

C# 如何确定数组中哪个字符串与给定字符串最相似?,c#,algorithm,C#,Algorithm,给定一个字符串 string name = "Michael"; 我希望能够计算数组中最相似的字符串: string[] names = new[] { "John", "Adam", "Paul", "Mike", "John-Michael" }; 我想为用户创建一条消息:“我们找不到‘Michael’,但‘John Michael’很接近。这就是你的意思吗?”我该如何确定?这通常使用编辑距离/根据删除次数比较哪个词最接近,将一个单词转换为另一个单词所需的添加或更改 有一篇文章为您提供了

给定一个字符串

string name = "Michael";
我希望能够计算数组中最相似的字符串:

string[] names = new[] { "John", "Adam", "Paul", "Mike", "John-Michael" };

我想为用户创建一条消息:“我们找不到‘Michael’,但‘John Michael’很接近。这就是你的意思吗?”我该如何确定?

这通常使用编辑距离/根据删除次数比较哪个词最接近,将一个单词转换为另一个单词所需的添加或更改


有一篇文章为您提供了C#的通用实现。

这里有使用Levenshtein距离的示例结果:

EditDistance["Michael",#]&/@{"John","Adam","Paul","Mike","John-Michael"}
{6,6,5,4,5}  
这里是史密斯-沃特曼相似性测试的结果

SmithWatermanSimilarity["Michael",#]&/@{"John","Adam","Paul","Mike","John-Michael"}
{0.,0.,0.,2.,7.} 

仅供参考,您拥有
string[]name=
这一事实意味着您不需要
new[]
。请定义“类似”。这1个例子并没有很好地说明这一点。我对做出这一决定的算法很满意。我可以用“迈克”或“约翰·迈克尔”来回答。我只是想得到一些有意义的建议。+1,但我也建议,如果用户在名称中发现一个非字母字符,沿着字符分割名称可能是一个好主意,否则,对于John Michael来说,与Mike或其他名字相比,Levenshtein距离可能太大。@Lirik您可以对距离进行各种更改,以使其适合特定问题,即指定不同的权重(而不是1/1/1)添加和替换-如果您增加了替换的权重,算法将“更喜欢”添加/删除,这将涵盖您刚才给出的示例,引入两个不同的相似性测试非常好;这就是我需要的。再加上另一个答案,我得到了我所需要的。谢谢@Michael,出于您的目的,您可以微调两者的加权平均值。祝你好运