
そのタスクは単純です。これは、テキストが書かれている言語を教えてくれます。これは、テキスト分類やスペルチェックなどの自然言語処理アプリケーションの言語データの前処理ステップとして非常に便利です。たとえば、他のユースケースには、電子メールの言語に基づいて、地理的に配置された適切なカスタマーサービス部門への電子メールをルーティングすることが含まれる場合があります。
言語の検出は、多くの場合、大規模な機械学習フレームワークまたは自然言語処理アプリケーションの一部として行われます。これらのシステムの本格的な機能を必要としない場合、またはそれらのロープを学びたくない場合、小さな柔軟なライブラリが便利です。
これまでのところ、このタスクのGOエコシステムにおける他の唯一の包括的なオープンソースライブラリは、 Whatlanggoです。残念ながら、2つの大きな欠点があります。
Linguaは、これらの問題を排除することを目指しています。彼女はほとんど構成を必要とせず、単一の単語やフレーズでさえ、長いテキストと短いテキストの両方でかなり正確な結果をもたらします。彼女はルールベースと統計的方法の両方を利用しますが、単語の辞書は使用しません。彼女は、外部APIまたはサービスへの接続も必要ありません。ライブラリがダウンロードされると、完全にオフラインで使用できます。
他の言語検出ライブラリと比較して、 Linguaの焦点は量よりも品質、つまり、新しい言語を追加する前に、最初に小さな言語セットの検出を正しく取得することです。現在、次の75の言語がサポートされています。
Linguaは、サポートされている各言語で利用可能ないくつかのバンドルされたテストデータの精度統計を報告できます。各言語のテストデータは3つの部分に分割されます。
言語モデルとテストデータの両方は、ドイツのライプツィヒ大学が提供したWortschatz Corporaの個別の文書から作成されています。さまざまなニュースWebサイトからクロールされたデータがトレーニングに使用されており、各コーパスは100万文を構成しています。テストのために、任意に選択したWebサイトで作られたコーパスが使用されており、それぞれ1万件の文で構成されています。各テストコーパスから、それぞれ1000単語のランダムなアンソートサブセット、1000ワードのペア、1000文が抽出されています。
生成されたテストデータを考えると、 LinguaとWhatlanggoの検出結果をLinguaのサポートされている75の言語のデータを実行していることを比較しました。さらに、GOCLD3バインディングの助けを借りてGoogleのCLD3を比較して追加しました。 CLD3またはWhatlanggoによってサポートされていない言語は、検出プロセス中に単に無視されます。
次の各セクションには、2つのプロットが含まれています。バープロットには、サポートされている各言語の詳細な精度結果が表示されます。ボックスプロットは、各分類器の精度値の分布を示しています。ボックス自体は、データの中央50%が内部にある領域を表しています。色付きのボックス内では、水平線が分布の中央値をマークします。
以下の表は、平均、中央値、標準偏差を含む各言語および分類器の詳細な統計を示しています。
| 言語 | 平均 | 単一の単語 | 単語のペア | 文 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| リングア (高精度モード) | リングア (低精度モード) | CLD3 | whatlang | リングア (高精度モード) | リングア (低精度モード) | CLD3 | whatlang | リングア (高精度モード) | リングア (低精度モード) | CLD3 | whatlang | リングア (高精度モード) | リングア (低精度モード) | CLD3 | whatlang | |
| アフリカーンス | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| アルバニア語 | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| アラビア語 | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| アルメニア人 | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| アゼルバイジャン | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| バスク | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| ベラルーシ人 | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| ベンガル語 | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| ボクマル | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| ボスニア人 | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| ブルガリア | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| カタロニア | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| 中国語 | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| クロアチア語 | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| チェコ | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| デンマーク語 | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| オランダ語 | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| 英語 | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| エスペラント | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| エストニアン | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| フィンランド語 | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| フランス語 | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| ガンダ | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| ジョージアン | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| ドイツ語 | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| ギリシャ語 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| グジャラート語 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ヘブライ語 | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| ヒンディー語 | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| ハンガリー | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| アイスランド語 | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| インドネシア語 | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| アイルランド | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| イタリア語 | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| 日本語 | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| カザフ | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| 韓国語 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| ラテン | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| ラトビアン | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| リトアニアン | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| マケドニア語 | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| マレー | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| マオリ | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| マラーティー | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| モンゴル人 | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Nynorsk | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| ペルシャ語 | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| 研磨 | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| ポルトガル語 | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| パンジャブ | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ルーマニア人 | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| ロシア | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| セルビア人 | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| ショナ | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| スロバキア | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| スロベニア | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| ソマリア | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| ソソー | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| スペイン語 | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| スワヒリ | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| スウェーデン語 | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| タガログ | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| タミル語 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| テルグ語 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| タイ | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| ツンガ | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| ツワナ | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| トルコ語 | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ウクライナ人 | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| ウルドゥー語 | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| ベトナム人 | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| ウェールズ | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| ヨルバ | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| ズールー | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| 平均 | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| 中央値 | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| 標準偏差 | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
すべての言語検出器は、一部のトレーニングコーパスのキャラクター分布で訓練された確率的N-GRAMモデルを使用します。ほとんどのライブラリは、複数の文で構成される長いテキストフラグメントの言語を検出するのに満足できるサイズ3(Trigrams)のNグラムのみを使用しています。ただし、短いフレーズや単一の単語の場合、トリグラムでは十分ではありません。入力テキストが短いほど、N-Gramsが少なくなります。このような少数のNグラムから推定される確率は信頼できません。これが、 Linguaがサイズ1のn-gramsを最大5で使用している理由であり、その結果、正しい言語のはるかに正確な予測が生じます。
2番目の重要な違いは、 Linguaがこのような統計モデルだけでなく、ルールベースのエンジンも使用することです。このエンジンは、最初に入力テキストのアルファベットを決定し、1つ以上の言語でユニークな文字を検索します。この方法で正確に1つの言語を確実に選択できる場合、統計モデルはもう必要ありません。いずれにせよ、ルールベースのエンジンは、入力テキストの条件を満たさない言語を除外します。その場合にのみ、2番目のステップでは、確率的N-GRAMモデルが考慮されます。これは理にかなっています。これは、言語モデルのロードが少ないため、メモリ消費量が少なく、ランタイムパフォーマンスが向上するためです。
一般に、それぞれのAPIメソッドを使用して、分類プロセスで考慮される言語のセットを制限することを常に良い考えです。特定の言語が入力テキストで発生することはないことを事前に知っている場合は、分類プロセスに参加しないようにしてください。ルールベースのエンジンのフィルタリングメカニズムは非常に優れていますが、入力テキストに関する独自の知識に基づいたフィルタリングが常に望ましいです。
上記の精度の結果を再現したい場合は、分類子とすべての言語の両方のテストレポートを生成できます。
cd cmd
go run accuracy_reporter.go
GOCLD3が正常に実行されるには、Googleのプロトコルバッファーの正確なバージョン3.17.3をインストールする必要があります。各検出器と言語について、テストレポートファイルが/accuracy-reportsに書き込まれます。例として、 Linguaドイツのレポートの現在の出力は次のとおりです。
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
Linguaには、少なくともGOバージョン1.18が必要です。
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
ソースコードには、広範な単体テストスイートが添付されています。テストを実行するには、単に言う:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}デフォルトでは、 Linguaは特定の入力テキストの最も可能性の高い言語を返します。ただし、複数の言語で同じように綴られている特定の単語があります。たとえば、プロローグという言葉は、有効な英語とフランス語の両方の言葉です。 Linguaは、指定されたコンテキストで間違っている可能性のある英語またはフランス語のいずれかを出力します。そのようなケースの場合、各可能な言語の対数が満たさなければならないでしょう、および要約された可能性が満たさなければならない最小相対距離を指定することが可能です。次のように述べることができます。
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
}言語確率間の距離は、入力テキストの長さに依存していることに注意してください。入力テキストが長いほど、言語間の距離が大きくなります。したがって、非常に短いテキストフレーズを分類したい場合は、最小相対距離を高すぎないように設定しないでください。それ以外の場合は、上記の例のように、ほとんどの場合Unknownが返されます。これは、言語検出が確実に不可能な場合のリターン値です。この値は、言語検出器を構築する際に入力言語のセットに含まれることを意図していません。含めると、入力言語のセットから自動的に削除されます。
最も可能性の高い言語について知ることはいいことですが、計算された可能性はどれほど信頼できますか?そして、最も可能性の高い言語と比較して、他の審査された言語はどれほど少ないでしょうか?これらの質問にも答えることができます:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
}上記の例では、 ConfidenceValue値のスライスが返されます。各値は0.0〜1.0の間の確率です。すべての言語の確率は1.0に合計されます。言語がルールエンジンによって明確に識別されている場合、この言語の値1.0は常に返されます。他の言語は0.0の値を受け取ります。
1つの特定の言語のみの信頼値を返す方法もあります。
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04このメソッドが計算する値は、0.0〜1.0の数です。言語がルールエンジンによって明確に識別されている場合、値1.0は常に返されます。与えられた言語がこの検出器インスタンスによってサポートされていない場合、値0.0は常に返されます。
デフォルトでは、 LinguaはLazy-Loadingを使用して、ルールベースのフィルターエンジンによって関連すると見なされる需要のある言語モデルのみをロードします。たとえば、Webサービスの場合、すべての言語モデルをメモリにプリロードして、サービスの応答を待っている間に予期しない遅延を回避することがかなり有益です。熱心なロードモードを有効にしたい場合は、次のように行うことができます。
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () LanguageDetectorの複数のインスタンスは、インスタンスによって非同期にアクセスされる同じ言語モデルをメモリ内で共有します。
Linguaの高い検出精度は、他の言語検出器よりも著しく遅くなるという犠牲を払っています。大規模な言語モデルは、かなりの量のメモリも消費します。これらの要件は、リソースを低く走るシステムでは実行不可能な場合があります。ほとんど長いテキストを分類するか、リソースを保存する必要がある場合は、言語モデルの小さなサブセットのみをメモリにロードする低精度モードを有効にできます。
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()このアプローチの欠点は、120文字未満で構成される短いテキストの検出精度が大幅に低下することです。ただし、120文字より長いテキストの検出精度は、ほとんど影響を受けません。
高精度モード(デフォルト)では、言語検出器は、すべての言語モデルがロードされている場合、約1,800 MBのメモリを消費します。低精度モードでは、メモリ消費量は約110 MBに減少します。目標は、後のリリースでメモリの消費をさらに減らすことです。
メモリのフットプリントが小さく、パフォーマンスが高速化するための代替案は、言語検出器を構築するときに言語のセットを削減することです。ほとんどの場合、サポートされているすべての言語から検出器を構築することはお勧めできません。分類したいテキストについての知識がある場合、ほとんどの場合、特定の言語を不可能または発生する可能性が低いと除外できます。
他のほとんどの言語検出器とは対照的に、 Linguaは混合言語テキストで複数の言語を検出できます。この機能はかなり合理的な結果をもたらす可能性がありますが、まだ実験状態にあるため、検出結果は入力テキストに大きく依存しています。各言語に複数の長い単語を使用して、高精度モードで最適に機能します。フレーズとその言葉が短いほど、結果はそれほど正確ではありません。言語検出器を構築するときに言語のセットを削減すると、テキストで発生する言語がそれぞれの言語検出器インスタンスによってサポートされる言語に等しい場合、このタスクの精度を向上させることもできます。
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
}上記の例では、 DetectionResultのスライスが返されます。スライス内の各エントリは、それぞれのサブストリングの開始インデックスとエンドインデックスを提供する連続した単一言語テキストセクションについて説明します。
たとえば、あなたの言語データがラテン語で間違いなく書かれていないことを事前に知っている分類タスクがあるかもしれません。決定プロセスから特定の言語を除外する場合、または関連する言語を明示的に含める場合、そのような場合、検出精度はより良くなる可能性があります。
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )計画された問題を見てください。
Linguaへの貢献は非常に高く評価されています。 Libraryに新しい言語を追加する方法については、 CONTRIBUTING.mdの指示をお読みください。