2

我有一个字符串是“ The White Horse is hungry

现在,我需要将其与可能的发音相匹配。以下是示例。(将这些视为音素,好吧,我的意思是用户可以发音的方式)

The White Horse is hungary
The White Horse is not hungry
The White Horse is very hungry
The Horse is hungry
The Horse is hungries
White Horse is hungry
star wars..clone wars

现在您可以看到发音可能有多么相似以及它们可能有多么不同。我可以申请 Levenshtein distance找出差异。它给了我非常准确的结果。但是,我还发现如果我能找到一种方法来比较两个音素的相似度,例如,当用户说出错误的音素时,而不是添加或删除音素,我可以获得更好的结果。

任何人都知道一个好的算法吗?以及 C# 实现的示例/链接?

4

2 回答 2

1

您可能想在这里尝试该算法:http: //www.catalysoft.com/articles/StrikeAMatch.html

它的示例实现。

string input = "The White Horse is hungry";
string[] toTest = new string[]{
    "The White Horse is hungary",
    "The White Horse is not hungry",
    "The White Horse is very hungry",
    "The Horse is hungry",
    "The Horse is hungries",
    "White Horse is hungry",
    "star wars..clone wars",
};

string closest = toTest
                .Select(s => new
                {
                    Str = s,
                    Distance = s.Distance(input)
                })
                .OrderByDescending(x => x.Distance)
                .First().Str;

public static class StringSimilarity
{
    public static float Distance(this string s1, string s2)
    {
        var p1 = GetPairs(s1);
        var p2 = GetPairs(s2);
        return (2f * p1.Intersect(p2).Count()) / (p1.Count + p2.Count);
    }

    static List<string> GetPairs(string s)
    {
        if (s == null) return new List<string>();
        if (s.Length < 3) return new List<string>() { s };

        List<string> result = new List<string>();
        for (int i = 0; i < s.Length - 1; i++)
        {
            result.Add(s.Substring(i, 2).ToLower(CultureInfo.InvariantCulture));
        }
        return result;
    }
}
于 2013-05-31T06:55:45.507 回答
0

如果不是 Levenshtein 距离,那么Fuzzy approach 或LCS呢?

于 2013-05-31T06:55:53.857 回答