如何在C#中检查两个字符串的部分相似性

时间:2015-03-28 19:46:01

标签: c#

C#中是否有任何函数检查两个字符串的相似度百分比?

例如我有:

var string1="Hello how are you doing"; 
var string2= " hi, how are you";

function(string1, string2) 

会返回相似度,因为单词" how","","你"存在于该行中。

甚至更好,给我60%的相似度,因为"","","你"是string1的3/5。

C#中是否存在任何功能?

3 个答案:

答案 0 :(得分:2)

字符串相似性的常用度量是所谓的Levenshtein distance编辑距离。在该方法中,定义了一组定义的编辑操作。 Levenshtein距离是从第一个字符串获得第二个字符串所需的最小编辑步骤数。密切相关的是Damerau-Levenshtein distance,它使用一组不同的编辑操作。

在算法上,Levenshtein距离可以使用Dynamic programming来计算,这可以被认为是有效的。但请注意,这种方法实际上并不考虑单个单词,也不能直接表示百分比的相似性。

答案 1 :(得分:2)

现在我要冒一个 -1 来冒险我的建议,但是在你试图得到一些接近但不那么复杂的东西的情况下,那么有很多更简单的解决方案然后是Levenshtein距离,如果你需要exakt结果并有时间编码它是完美的。

如果你对准确性有点宽松,那么我会遵循这个简单的规则:

  1. 比较 文字首先(strSearch == strReal) - 如果匹配退出
  2. 搜索字符串和实际字符串转换为小写
  3. 从字符串[aeiou-"!]删除元音和其他字符

    现在你有两个转换后的字符串。你的搜索字符串:

    mths dhlgrn mtbrn
    

    和你要比较的真实字符串

    rstrnt mths dhlgrn
    
  4. 比较 已转换的字符串,如果它们匹配退出

  5. 仅使用简单拆分功能或使用正则表达式\W+
  6. 按字词拆分搜索字符串
  7. 通过将100除以部分数量来计算一部分的虚拟值(重量) - 在这种情况下为33
  8. 比较 搜索字符串的每个部分 真实字符串,如果包含,则将每个匹配的值添加到总重量中。在这种情况下,我们有三个元素和两个匹配,因此结果是66 - 所以66%匹配
  9. 这种方法简单易用,可以越来越详细,实际上你可以使用步骤1-7,如果步骤7返回50%以上的任何值,那么你认为你有匹配,否则你会使用更复杂的计算。

    好的,现在不要 -1 我太快,因为其他答案都很完美,这只是 lazy 开发人员的解决方案并且可能在那里有价值,结果满足期望。

答案 2 :(得分:0)

您可以创建一个函数,将两个字符串拆分为数组,然后迭代其中一个以检查另一个字是否存在。

如果你想要它的百分比,你必须计算单词总数,看看有多少是相似的,并根据它创建一个数字。