さまざまな言語の文を表す文字列(文字のコレクション)がいくつかあります。たとえば、次のようになります。
こんにちは、ジョージです。
Das brotistgut。
...など。
それぞれに英語の文章である可能性を示すスコア(0 .. 1から)を割り当てたいと思います。これを行うための受け入れられたアルゴリズム(またはPythonライブラリ)はありますか?
注:英語の文の文法が完璧であるかどうかは気にしません。
このタスクには、ベイズ分類器が適しています。
>>> from reverend.thomas import Bayes
>>> g = Bayes() # guesser
>>> g.train('french','La souris est rentrée dans son trou.')
>>> g.train('english','my tailor is rich.')
>>> g.train('french','Je ne sais pas si je viendrai demain.')
>>> g.train('english','I do not plan to update my website soon.')
>>> print g.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]
>>> print g.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]
答えが受け入れられたことは知っていますが、通常、言語 ID は文字 n グラム モデルで行われ、Raymond が示唆するようなバッグ オブ ワード モデルではありません。これは、分類子で n-gram 機能を使用することと同じではありません (実際、分類子を使用することは通常行われていないか、少なくとも従来の意味では必要ではありません)。この理由は、多くの場合、言語の識別にはほんの数文字で十分な場合があるためです。一方、bag-of-words ベースの分類子 (さらには bag-of-ngram) では、同じ単語またはフレーズを使用する必要があります。トレーニング。一方、文字ベースのモデルは、ほとんどトレーニングがなく、識別を行うためのデータがほとんどない状態で使用できます。
仕組みは次のとおりです。文字列は、それに含まれる一連の文字 (スペースや句読点を含む) と見なされます。これらの文字シーケンスの n-gram 言語モデルを構築します。n=3 で十分なはずですが、n=5 または n=6 を使用するとより正確になります (適切な平滑化を行う必要があるという代償を払って、またはこれをどのように行うかによっては、簡単ではない場合があります)!フランス語と英語の 2 つの言語について、n=3 の文字 n-gram モデルがあるとします。このモデルでは、文字列の確率:
c = c_1、c_2 ... c_n
各 c_i は文字(スペース、句読点などを含む) です。
p(c) = p(c_1) * p(c_2 | c_1) * p(c_3|c_2,c_1)...p(c_n|c_n-1,c_n-2)
フランス語と英語のモデルがある場合、これが翻訳されるのは、各言語のこの分布に対する一連のパラメーターです。これらは実際には、与えられた c_i の条件付き確率 (c_i-1,c_i-2) を示す単なる表であり、最尤推定量は次のとおりです。
count(c_i-2, c_i-1, c) / count(c_i-2, c_i-1)
確率が 0 になるという問題があるため、言語モデリングでは基本的に最尤推定は行われませんが、上記の尤度関数はパラメーター推定で大きな役割を果たします (平滑化が必要なだけです)。
したがって、文字列cがどの言語に含まれているかを判断するために行うことは、関心のある言語用にトレーニングした言語モデルの下でその確率を評価し、その文字列が最も高い確率を割り当てたモデルからのものであると判断することだけです(これは、クラス、つまり言語で均一な事前分布を持つベイジアン分類器と同等ですが、想定される分布は単純ベイズ/多項式ではなく、n-gram モデルの分布です)。
言語モデリングについて読むべき場所はたくさんあります。非常に優れたチュートリアルがJosh Goodman の叙事詩にあります (現在は少し古くなっていますが、アイデアは変更されておらず、目的には十分すぎるほどです)。ウィキペディアのページを見ると、ユニグラム モデルが多項分布と同等であることがわかります。
最後に、言語モデルの Python 実装を探している場合、おそらく最も広く使用されているのはNLTKです。