我开发自动语言检测启发式,想找出给定的信中是否有变音符号(如“ÐàäèîÊóëüòóðà” - 所有的字母都变音符号)。如果可能的话,如果我也可以得到变音符的类型,那将是最好的。如何检查Unicode字符在.Net中是否有变音符号?
我通过UnicodeCategory
枚举浏览,但没有发现任何可以帮助我在这里。
我开发自动语言检测启发式,想找出给定的信中是否有变音符号(如“ÐàäèîÊóëüòóðà” - 所有的字母都变音符号)。如果可能的话,如果我也可以得到变音符的类型,那将是最好的。如何检查Unicode字符在.Net中是否有变音符号?
我通过UnicodeCategory
枚举浏览,但没有发现任何可以帮助我在这里。
一种可能的方式是把它归到字母及其附加符号写几码点的形式。然后检查你是否有一个字母后跟口音。
改编自How do I remove diacritics (accents) from a string in .NET?,可以使用Normalize(NormalizationForm.FormD)
进行标准化并使用UnicodeCategory.NonSpacingMark
检查变音符号。
bool IsLetterWithDiacritics(char c)
{
var s = c.ToString().Normalize(NormalizationForm.FormD);
return (s.Length > 1) &&
char.IsLetter(s[0]) &&
s.Skip(1).All(c2 => CharUnicodeInfo.GetUnicodeCategory(c2) == UnicodeCategory.NonSpacingMark);
}
如果你需要一个真/假支票,你可以只正常化它FormD或不管它是,只是检查字符串比原来的更长。 – 2012-02-19 13:38:13
@JoakimJohansson如果有迹象表明分解在FormD,但不是重音字母等字形我也不会感到惊讶。但我不知道我的想法在那些方面表现得如何。 – CodesInChaos 2012-02-19 13:39:42
@JoakimJohansson算法认为具有变音符号的一大类字符是朝鲜语韩文字符。这些由几个部分组成,它们被分解,但没有变音符号。一些例子:'가','간',''''。再就是数学符号,例如:'≠','⊉','∄','∦'最后几个,我不知道在所有:'ஔ' – CodesInChaos 2012-02-19 13:55:58
字母eth(Ð)没有变音符号。在Unicode中,它是一个基本字符;中风不被视为变音符号。因此,你可能希望重新制定你的目标(并可能解释它将解决什么具体问题,因为可能有更好的方法)。 – 2012-02-19 14:11:54
分解是你想要做的最后一件事。特定字母与特定变音符号的组合是语言的强有力的选择。只需在前面建立频率表。但是有很多语言使用旁边没有变音符号。例如,你将无法分辨英语,荷兰语和意大利语之间的差异。你需要一本字典才能真正起作用。比方说,储存100个最常见的词将会有很长的路要走。 – 2012-02-19 14:13:16