22

私は英語とドイツ語の2つの言語のドキュメントのセットを持っています。これらのドキュメントに関する使用可能なメタ情報はありません。プログラムはコンテンツのみを見ることができます。これに基づいて、プログラムはドキュメントが2つの言語のどちらで書かれているかを決定する必要があります。

数時間で実装できるこの問題の「標準」アルゴリズムはありますか?または、これを実行できる無料の.NETライブラリまたはツールキットですか?LingPipeについて知っていますが、

  1. Java
  2. 「セミコマーシャル」での使用は無料ではありません

この問題は驚くほど難しいようです。Google AJAX Language API (最初にこのサイトを検索して見つけた)をチェックしましたが、それは途方もなくひどいものでした。私が指摘したドイツ語の6つのWebページについては、1つの推測だけが正しかった。他の推測は、スウェーデン語、英語、デンマーク語、フランス語でした...

私が思いついた簡単なアプローチは、ストップワードのリストを使用することです。私のアプリは、Lucene.Netで分析するために、ドイツ語のドキュメントにこのようなリストをすでに使用しています。私のアプリがいずれかの言語からのストップワードの出現についてドキュメントをスキャンすると、出現回数が多い方が勝ちます。確かに非常に素朴なアプローチですが、それで十分かもしれません。残念ながら、興味深いトピックですが、自然言語処理の専門家になる時間がありません。

4

11 に答える 11

6

ストップ ワードのリストを使用する際の問題は、堅牢性の 1 つです。ストップ ワード リストは基本的に、単語ごとに 1 つのルールのセットです。ルールベースの方法は、統計的方法よりも目に見えないデータに対して堅牢ではない傾向があります。遭遇する問題には、各言語のストップ ワードが同数含まれているドキュメント、ストップ ワードのないドキュメント、間違った言語のストップ ワードが含まれているドキュメントなどがあります。指定しないでください。

Naive Bayes やその他の複雑な数学または機械学習アルゴリズムを自分で実装する必要がない 1 つのアプローチは、文字のバイグラムとトライグラムをカウントすることです (開始するデータが多いか少ないかによって異なりますが、バイグラムはより少ないトレーニング データで動作します)。既知のソース言語の少数のドキュメント (多いほど良い) でカウントを実行し、カウント数によって各言語の順序付きリストを作成します。たとえば、英語では「th」が最も一般的なバイグラムになります。順序付けされたリストを手にして、分類したいドキュメント内のバイグラムを数え、それらを順番に並べます。次に、それぞれを調べて、並べ替えられた未知のドキュメント リスト内の位置を、各トレーニング リスト内のランクと比較します。各バイグラムに各言語のスコアを次のように与えます。

1 / ABS(RankInUnknown - RankInLanguage + 1).

最終的にスコアが最も高い言語が勝者です。シンプルで、多くのコーディングを必要とせず、多くのトレーニング データも必要としません。さらに良いことに、継続してデータを追加し続けることができ、改善されます。さらに、ストップ ワードのリストを手動で作成する必要はなく、ドキュメントにストップ ワードがないという理由だけで失敗することもありません。

対称的なバイグラム数が等しいドキュメントでは、依然として混乱します。十分なトレーニング データを取得できる場合は、トライグラムを使用すると、この可能性が低くなります。ただし、トリグラムを使用すると、未知のドキュメントを長くする必要もあります。非常に短いドキュメントでは、1 文字 (ユニグラム) カウントにドロップダウンする必要がある場合があります。

これはすべて、エラーが発生するということです。銀の弾丸はありません。メソッドを組み合わせて、各メソッドに対する自信を最大限に高める言語を選択することが、最も賢明な方法かもしれません。

于 2009-09-07T00:29:18.203 に答える
6

テキスト内の各文字の出現回数を測定してみてください。英語とドイツ語のテキストについては、頻度と、おそらくそれらの分布が計算されます。これらのデータを取得したら、テキストの頻度分布がどの言語に属しているかを推測できます。

ベイジアン推論を使用して (特定のエラー確率で) 最も近い言語を決定する必要があります。または、そのようなタスクには他の統計的方法があるかもしれません。

于 2009-09-05T15:13:47.437 に答える
5

英語とドイツ語は、ä、ö、ü、および ß (eszett) を除いて、同じ文字セットを使用します。言語を決定するためにそれらの文字を探すことができます。

また、Grefenstetteのこのテキスト ( 2 つの言語識別スキームの比較) も参照できます。文字のトリグラムと短い単語を調べます。ドイツ語の en_、er_、_de の一般的なトライグラム。英語の一般的なトライグラム the_、he_、the...

Bob Carpenter のHow does LingPipe Perform Language ID?もあります。

于 2009-09-05T21:49:02.790 に答える
3

自分で問題を解決しようとしてプログラミングの筋を曲げたい場合は、次のことをお勧めします。ただし、使用したい場合はホイールが存在します。

Windows 7には、この機能が組み込まれています。「Extended Linguistic Services」(ELS)と呼ばれるコンポーネントには、スクリプトと自然言語を検出する機能があり、Windows7またはWindowsServer2008マシンのボックスに含まれています。そのようなマシンが利用可能かどうか、および「無料」と言うときの意味に応じて、それはあなたのためにそれを行います。いずれにせよ、これはグーグルやここで言及されている他のベンダーに代わるものです。

http://msdn.microsoft.com/en-us/library/dd317700(v=VS.85).aspx

また、.NETからこれにアクセスする場合は、ここにいくつかの情報があります。

http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx

お役に立てば幸いです。

于 2010-04-03T04:37:05.393 に答える
3

標準的な手順は、提案されたアルゴリズムの品質をテスト データ (つまりコーパス) で測定することだと思います。アルゴリズムで達成する正しい分析のパーセンテージを定義し、手動で分類した多数のドキュメントに対して実行します。

特定のアルゴリズムについては、ストップ ワードのリストを使用するのは問題ないようです。動作することが報告されている別のアプローチは、ベイジアン フィルター( SpamBayesなど) を使用することです。ハムとスパムにトレーニングするのではなく、英語とドイツ語にトレーニングします。コーパスの一部を使用し、それをスパムベイで実行してから、完全なデータでテストします。

于 2009-09-05T14:59:11.250 に答える
3

言語の検出は、概念的にはそれほど難しくありません。関連する質問に対する私の回答と、同じ質問に対する他の回答をご覧ください。

自分で書いてみたい場合は、半日で単純な検出器を作成できるはずです。次のアルゴリズムに似たものを仕事で使用していますが、驚くほどうまく機能します。私がリンクした投稿のpython実装チュートリアルも読んでください。

手順:

  1. 2 つの言語の 2 つのコーパスを取得し、文字レベルのバイグラム、トライグラム、および空白で区切られたトークン (単語) を抽出します。それらの周波数を追跡します。このステップでは、両方の言語の「言語モデル」を構築します。

  2. テキストの一部を指定して、char バイグラム、トライグラム、空白で区切られたトークン、および各コーパスの対応する「相対頻度」を識別します。モデルに特定の「機能」(char バイグラム/トライグラムまたはトークン) がない場合は、その「生カウント」を 1 として扱い、それを使用して「相対頻度」を計算します。

  3. 特定の言語の相対度数の積が、その言語の「スコア」になります。これは、文がその言語に属する確率の非常に単純な概算です。

  4. スコアの高い言語が勝ちます。

注 1: 言語モデルで発生しない機能については、「raw カウント」を 1 として扱います。これは、実際にはその特徴の値は非常に小さいためですが、コーパスが有限であるため、まだ遭遇していない可能性があります。カウントをゼロにすると、製品全体もゼロになります。これを避けるために、コーパスでは出現回数が 1 であると仮定します。これは、アドワン スムージングと呼ばれます。他にも高度なスムージング手法があります。

注 2: 多数の分数を乗算するため、簡単にゼロになる可能性があります。これを回避するには、対数空間で作業し、この方程式を使用してスコアを計算します。

                a X b =  exp(log(a)+log(b))

注 3: 私が説明したアルゴリズムは、「ナイーブ ベイズ アルゴリズム」の「非常に単純な」バージョンです。

于 2010-04-03T03:38:00.197 に答える
2

2 つの言語のストップ ワード アプローチは迅速であり、たとえば、ドイツ語の "das" と英語の "the" など、他の言語にはないものに重みを付けることで、より迅速になります。「排他的な単語」を使用すると、このアプローチをより大きな言語グループにも確実に拡張するのに役立ちます。

于 2009-09-05T14:59:08.537 に答える
1

選択できる言語が2つ(英語とドイツ語)しかない場合、問題は数桁簡単になりませんか?この場合、ストップワードのリストのアプローチで十分かもしれません。

リストに言語を追加した場合は、明らかに書き直しを検討する必要があります。

于 2009-09-05T14:55:24.027 に答える
1

まず最初に、現在のソリューションのテストを設定し、目的の精度レベルに達しているかどうかを確認する必要があります。特定のドメインでの成功は、標準的な手順に従うことよりも重要です。

方法を改善する必要がある場合は、英語とドイツ語の大規模なコーパスの希少性によってストップ ワードを重み付けしてみてください。または、マルコフ モデルベイジアン分類器のトレーニングなど、より複雑な手法を使用することもできます。任意のアルゴリズムを拡張して、高次のn-gram (たとえば、2 つまたは 3 つの単語シーケンス) またはテキスト内の他の特徴を調べることができます。

于 2009-09-05T15:22:59.697 に答える
1

Google Language Detection API を使用できます。

これを使用する小さなプログラムを次に示します。

baseUrl = "http://ajax.googleapis.com/ajax/services/language/detect"

def detect(text):
    import json,urllib
    """Returns the W3C language code of a natural language"""

    params = urllib.urlencode({'v': '1.0' , "q":text[0:3000]}) # only use first 3000 characters                    
    resp = json.load(urllib.urlopen(baseUrl + "?" + params))
    try:
        retText = resp['responseData']['language']
    except:
        raise
    return retText


def test():
    print "Type some text to detect its language:"
    while True:
        text = raw_input('#>  ')
        retText = detect(text)
        print retText


if __name__=='__main__':
    import sys
    try:
        test()
    except KeyboardInterrupt:
        print "\n"
        sys.exit(0)

その他の参考資料:

Google が API (およびデモ) を発表: http://googleblog.blogspot.com/2008/03/new-google-ajax-language-api-tools-for.html

Python ラッパー: http://code.activestate.com/recipes/576890-python-wrapper-for-google-ajax-language-api/

別の Python スクリプト: http://www.halotis.com/2009/09/15/google-translate-api-python-script/

RFC 1766 は W3C 言語を定義します

現在の言語コードは、http://www.iana.org/assignments/language-subtag-registry から 入手してください。

于 2010-04-02T05:29:31.463 に答える
0

Apache Tikaを試しましたか? 指定されたテキストの言語を判別できます。

http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/07/02/using-the-tika-java-library-in-your-net-application-with-ikvm

私は.Netの経験がありませんが、そのリンクが役立つかもしれません. 環境でjarを実行できる場合は、これを試してください:

 java -jar tika-app-1.0.jar -l http://www.admin.ch/

出力:

de

それが役立つことを願っています。

于 2012-03-20T09:30:53.587 に答える