2012-05-09 13 views
0

私はカスタム検索エンジンを開発しており、各単語を適切な言語固有の語幹に渡す必要があります。UTF8バッファから各単語の単語境界と言語を検出します。

私は最近、UTF8バッファの印象的な言語検出を提供するコンパクト言語検出器(CLD)http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.htmlを発見しました。

CLDは特定のバッファの言語を検出するのに最適ですが、バッファから単語の境界を抽出するだけでなく、これらの単語のそれぞれについて言語を検出する必要があります。

アイデア?

+0

正規表現 '\ b'で特殊文字。 – kirilloid

答えて

0

基本的には次んICU使用して言語検出エンジンをIを開発しました:ICU BreakIteratorと英語を使って

  1. 出会う基本的な「言葉」(Locale::getEnglish())に#1から単語をフィード
  2. ルールを今度は私に「真」の言語(複数可)を与え、私のエンジンは、あなたの入力がUTF-8であることから、あなたはUTextを取っsetText()方法を使用することができ、あなたの目的のためのスコア

によって並べ替え*(ここにリンクされている例に注意してください。ほぼ正確に必要ですが、UTF-8をトラバースするように設定できるC++ APIを使用することもできます)。

+0

BreakIteratorの問題点は、アジア言語では正しく動作しないことです。アジア言語では、そのドキュメントに明示されています。また、ICUの言語検出の信頼性は、(私の研究から、私が残念ながら分かち合うことはできない)希望より少し悪いです。 –

+0

私はあなたの記事を読んで逃した。私が上に投稿した答えは、言語検出器にフィードするための「単語」抽出のための前処理ステップとして優れています(私の場合は、n-gramエンジンを使用します)。限り、CJKの境界を解析する、それは非常に、非常に複雑です:) – NuSkooler

2

幸運:)

は正直なところ、これは高度なNLPのトピックであり、確実に行うために非常に困難です。

まずは、多くの言語で単語境界を検出することはできません。特に、表意文字言語(中国語、日本語、...)では、トークン化のために十分に訓練された学習アルゴリズムが必要です。
誰かがそれをしたという噂がありますが(Basis Technologyを参照)、これはライセンス料を払う余裕がある場合にのみ役立ちます。

BTW。多くの単語はほとんど同じ言語で書かれているため、信頼できる言語の検出はできません。さらに悪いことに、アルゴリズム(通常はnグラムベースの検出器)は、何かを(正しいか間違って)検出するために数オクテットが必要になります。

私が言ったように、幸運。もし私があなただったら、私の戦略を再考したいと思った;)

+0

Dyda:Luceneとの経験はありますか?私はLuceneがCompositeBreakIteratorと呼ばれる多言語のテキストのためのブレイクインブレーカーを持っていることに気付きました。それは信頼できますか? – Manoj

+0

@Manoj:正に、私はApache Luceneと遊んでいません。私が知っていることは、あなたが入力したテキストを正規化する必要があることです。そうしないと、予測できない結果が得られます。また、私たちのチームの一人は、検索の信頼性について懸念を表明しましたが、有効かどうかは言えません。真剣な調査が必要です。 –

+0

@PawełDyda私はdevenagariスクリプトのための簡単な言語検出器を書いた。アイデアは 'UTF8'エンコードされたデータだけを受け取り、各キャラクタを繰り返してデコードしてコードポイントを取得することでした。コードポイントとUnicode文字の範囲を一致させ、それが属する言語範囲を特定します。反復しながら、私は参加者と非参加者を無視する。すべての文字が同じ言語範囲にある場合は、言語を報告します。異なる範囲にあるコードポイントを取得すると、反復が停止します。これはこれまでのところうまくいきます。私はこの方法をすべての非公式言語に使用できるのだろうかと疑問に思っていましたか? –

関連する問題