在 .Net 中对整个句子实施 soundex
Implement soundex in .Net for entire sentences
我有一个regex/soundex类型的方法:
public static string SoundEx(string word)
{
if (word.All(char.IsDigit))
{
//sentenceParts = words;
return word;
}
word = word.ToUpper();
word = word[0] +
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(word.Substring(1), "[AEIOUYHW]", ""), "[BFPV]+", "1"), "[CGJKQSXZ]+", "2"), "[DT]+", "3"), "[L]+", "4"), "[MN]+", "5"), "[R]+", "6");
return word;//word.PadRight(4, '0').Substring(0, 4);
}
这在只有一个单词的字符串上效果很好,但一旦你把一个句子扔进去,它就会开始表现得很滑稽。
"The big brown cat."
和
"The big brown dog."
来一场比赛吧。现在我明白它会保留第一个单词的第一个字符,然后开始使用正则表达式将数字与元音等进行匹配。但是我如何在整个句子上实现它以使其更准确?
您必须 soundex 每个单词分开。这会将句子变成一组 4 字节代码而不是字符串。然后,您将这些集合相互比较。
所以你的例子变成了"T000 B200 B650 D200" v "T000 B200 B650 C300"。
我建议使用双 Metaphone 算法而不是 soundex 因为它好得多,它也不依赖于第一个字母保持不变,这无济于事匹配钓鱼和网络钓鱼等词。
我有一个regex/soundex类型的方法:
public static string SoundEx(string word)
{
if (word.All(char.IsDigit))
{
//sentenceParts = words;
return word;
}
word = word.ToUpper();
word = word[0] +
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(word.Substring(1), "[AEIOUYHW]", ""), "[BFPV]+", "1"), "[CGJKQSXZ]+", "2"), "[DT]+", "3"), "[L]+", "4"), "[MN]+", "5"), "[R]+", "6");
return word;//word.PadRight(4, '0').Substring(0, 4);
}
这在只有一个单词的字符串上效果很好,但一旦你把一个句子扔进去,它就会开始表现得很滑稽。
"The big brown cat." 和 "The big brown dog."
来一场比赛吧。现在我明白它会保留第一个单词的第一个字符,然后开始使用正则表达式将数字与元音等进行匹配。但是我如何在整个句子上实现它以使其更准确?
您必须 soundex 每个单词分开。这会将句子变成一组 4 字节代码而不是字符串。然后,您将这些集合相互比较。
所以你的例子变成了"T000 B200 B650 D200" v "T000 B200 B650 C300"。
我建议使用双 Metaphone 算法而不是 soundex 因为它好得多,它也不依赖于第一个字母保持不变,这无济于事匹配钓鱼和网络钓鱼等词。