2012-02-19 2 views
5

私は自動言語検出のための発見的方法を開発しており、与えられた文字に分音記号(「ÐàäèîÊóëüòóðà」 - すべての文字に分音記号がある)があるかどうかを調べたいと思います。可能であれば、分音符号のタイプを得ることができれば最高です。Unicode文字に.Netの発音区別符号が含まれているかどうかを確認する方法?

私はUnicodeCategory列挙型を閲覧しましたが、ここで私を助けるものは見つかりませんでした。

+0

文字eth(Ð)には分音記号はありません。 Unicodeでは、基本文字です。ストロークは発音区別符号とはみなされません。したがって、あなたの目標を再定式化することができます(そして、より良いアプローチがあるかもしれないので、どのような特定の問題が解決するかを説明するかもしれません)。 –

+2

あなたがやりたい最後のことは分解です。特定の文字と特定の発音区別符との組み合わせは、その言語の強力なセレクタです。頻度表を前面に作成するだけです。しかし、多くの言語は発音区別記号の隣に使用しています。たとえば、英語、オランダ語、イタリア語の違いを知ることはできません。あなたはそれが本当に機能するように辞書が必要です。例えば、100の最も一般的な言葉を保存することは、長い道のりになります。 –

答えて

11

可能な方法の1つは、文字とその発音記号がいくつかのコードポイントとして書かれている形式に正規化することです。その後、アクセントが続く文字があるかどうかを確認します。

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などに正規化して、文字列が元の文字列よりも長いかどうかを確認するだけです。 –

+1

@JoakimJohansson FormDで分解する他のグリフがあっても、アクセント付きの文字ではない場合、私は驚いていません。しかし、私のアイデアがどれほどうまくいくかはわかりません。 – CodesInChaos

+2

@ JoakimJohanssonあなたのアルゴリズムが発音区別記号を持つとみなす1つの大きなクラスの文字は韓国語のハングル文字です。これらは分解されるいくつかの部分で構成されていますが、発音区別記号はありません。いくつかの例: '' ''、 '' ''、 '' ''。 '≠'、 '⊉'、'∄'、 '∦'のような数学的な記号があります。最後に私が知りません:' ஔ' – CodesInChaos