2012-02-19 21 views
5

我开发自动语言检测启发式,想找出给定的信中是否有变音符号(如“ÐàäèîÊóëüòóðà” - 所有的字母都变音符号)。如果可能的话,如果我也可以得到变音符的类型,那将是最好的。如何检查Unicode字符在.Net中是否有变音符号?

我通过UnicodeCategory枚举浏览,但没有发现任何可以帮助我在这里。

+0

字母eth(Ð)没有变音符号。在Unicode中,它是一个基本字符;中风不被视为变音符号。因此,你可能希望重新制定你的目标(并可能解释它将解决什么具体问题,因为可能有更好的方法)。 – 2012-02-19 14:11:54

+2

分解是你想要做的最后一件事。特定字母与特定变音符号的组合是语言的强有力的选择。只需在前面建立频率表。但是有很多语言使用旁边没有变音符号。例如,你将无法分辨英语,荷兰语和意大利语之间的差异。你需要一本字典才能真正起作用。比方说,储存100个最常见的词将会有很长的路要走。 – 2012-02-19 14:13:16

回答

11

一种可能的方式是把它归到字母及其附加符号写几码点的形式。然后检查你是否有一个字母后跟口音。

改编自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); 
} 
+3

如果你需要一个真/假支票,你可以只正常化它FormD或不管它是,只是检查字符串比原来的更长。 – 2012-02-19 13:38:13

+1

@JoakimJohansson如果有迹象表明分解在FormD,但不是重音字母等字形我也不会感到惊讶。但我不知道我的想法在那些方面表现得如何。 – CodesInChaos 2012-02-19 13:39:42

+2

@JoakimJohansson算法认为具有变音符号的一大类字符是朝鲜语韩文字符。这些由几个部分组成,它们被分解,但没有变音符号。一些例子:'가','간',''''。再就是数学符号,例如:'≠','⊉','∄','∦'最后几个,我不知道在所有:'ஔ' – CodesInChaos 2012-02-19 13:55:58

相关问题