9

文字列に英語のテキストが含まれているかどうかを教えてくれる既存の Java ライブラリはありますか (たとえば、フランス語とイタリア語のテキストを区別できるようにする必要があります。関数は、フランス語とイタリア語の場合は false を返し、英語の場合は true を返す必要があります)。 ?

4

6 に答える 6

10

さまざまな手法があり、堅牢な手法はさまざまな手法を組み合わせたものです。

  • テキスト内のn文字のグループ(たとえば、3 文字またはトライグラムのグループ) の頻度を調べて、テスト対象の言語で見つかった頻度と類似しているかどうかを確認します。
  • 特定の言語で頻繁に使用される単語のインスタンスが、テキストに見られる頻度と一致するかどうかを調べます (これは、より長いテキストでうまく機能する傾向があります) 。
  • テキストには、特定の言語に強く絞り込む文字が含まれていますか? (たとえば、テキストに逆さまの疑問符が含まれている場合は、スペイン語である可能性が高くなります)
  • 特定の言語を示すテキスト内の特定の機能を「大まかに解析」できますか?たとえば、次の正規表現との一致が含まれている場合、これをその言語がフランス語であるという強力な手がかりと見なすことができます:

    \bvous\s+\p{L}+ez\b

手始めに、英語、フランス語、イタリア語の頻出トライグラムと単語数を以下に示します (一部のコードからコピーして貼り付けたものです。これらを解析する演習として残します)。

  Locale.ENGLISH,
      "he_=38426;the=38122;nd_=20901;ed_=20519;and=18417;ing=16248;to_=15295;ng_=15281;er_=15192;at_=14219",
      "the=11209;and=6631;to=5763;of=5561;a=5487;in=3421;was=3214;his=2313;that=2311;he=2115",
  Locale.FRENCH,
      "es_=38676;de_=28820;ent=21451;nt_=21072;e_d=18764;le_=17051;ion=15803;s_d=15491;e_l=14888;la_=14260",
      "de=10726;la=5581;le=3954;" + ((char)224) + "=3930;et=3563;des=3295;les=3277;du=2667;en=2505;un=1588",
  Locale.ITALIAN,
      "re_=7275;la_=7251;to_=7208;_di=7170;_e_=7031;_co=5919;che=5876;he_=5622;no_=5546;di_=5460",
      "di=7014;e=4045;il=3313;che=3006;la=2943;a=2541;in=2434;per=2165;del=2013;un=1945",

(トリグラム数は 100 万文字あたり、単語数は 100 万単語あたりです。「_」文字は単語の境界を表します。)

私が思い出したように、数値は Oxford Handbook of Computational Linguists に引用されており、新聞記事のサンプルに基づいています。これらの言語のテキストのコーパスがあれば、同様の図を自分で簡単に導き出すことができます。

上記を適用する本当に手っ取り早い方法が必要な場合は、次を試してください。

  • テキスト内の 3 文字の各シーケンスを考慮してください (単語の境界を「_」に置き換えます)
  • 特定の言語で頻繁に使用されるトライグラムの 1 つに一致するトライグラムごとに、その言語の「スコア」を 1 増やします (より洗練された方法として、リスト内の位置に応じて重み付けすることができます)。
  • 最後に、その言語が最高スコアの言語であると仮定します
  • オプションで、一般的な単語に対して同じことを行います (スコアを結合します)

明らかに、これは洗練されたものになりますが、本質的に「英語かどうか」に関心があるため、この単純なソリューションで十分であることがわかるかもしれません。

于 2009-01-10T16:58:06.273 に答える
2

Apache Tika を試しましたか。言語を検出するための優れた API を備えており、それぞれのプロファイルをロードすることで異なる言語をサポートすることもできます。

于 2013-09-23T03:48:21.480 に答える
1

各単語を英語、フランス語、またはイタリア語の辞書と比較してみてください。複数の辞書に掲載されている単語もありますが、注意してください。

于 2009-01-10T16:25:59.567 に答える
1

この概念について説明している興味深いブログ記事を次に示します。例は Scala にありますが、同じ一般的な概念を Java に適用できるはずです。

于 2009-01-10T16:26:28.660 に答える
1

個々の文字や単語を見ている場合、これは難しい問題です。ただし、ドキュメント全体を操作しているため、いくつかの希望があるかもしれません. 残念ながら、これを行うための既存のライブラリを知りません。

一般に、言語ごとにかなり包括的な単語リストが必要になります。次に、ドキュメント内の各単語を調べます。ある言語の辞書にある場合は、その言語に「投票」してください。いくつかの単語は複数の言語で表示され、ある言語のドキュメントが別の言語からの借用語を使用することもありますが、ドキュメントが 1 つの言語への非常に明確な傾向が見られるまでにそれほど長くはかからないでしょう。

英語に最適な単語リストのいくつかは、Scrabbleプレーヤーが使用するものです。これらのリストは、おそらく他の言語にも存在します。生のリストは Google で見つけるのが難しい場合がありますが、公開されています。

于 2009-01-10T16:32:21.020 に答える
0

これを行う「良い」方法はありません。このトピックでは、すべての答えが非常に複雑になる可能性があります。明らかな部分は、英語ではなくフランス語とイタリア語の文字をチェックしてから false を返すことです。

しかし、単語がフランス語で特殊文字がない場合はどうなるでしょうか? あなたが文全体を持っているという考えで遊んでください。辞書から各単語を一致させることができ、文に英語のポイントよりもフランス語のポイントが多い場合、それは英語ではありません. これにより、フランス語、イタリア語、英語に共通する単語が使用できなくなります。

幸運を。

于 2009-01-10T15:58:45.160 に答える