効率的な言語検出器 ( Nito-ELDまたはELD ) は、100% PHP で書かれた高速で正確な自然言語検出ソフトウェアであり、高速 C++ でコンパイルされた検出器に匹敵する速度と、これまでで最高の検出器の範囲内の精度を備えています。
依存関係はなく、簡単にインストールできます。必要なのはmb拡張子を付けた PHP だけです。
ELD は Javascript と Python でも利用できます (古いバージョン)。
インストール
使用方法
ベンチマーク
データベース
テスト
言語
ELD v2 から v3 への変更:
detect()-> language は
NULL
の代わりに未決定の文字列'und'
を返すようになりましたデータベースに互換性がなく、より大きい、中 v2 ≈ 小 v3
DynamicLangSubset() 関数が削除されました
関数 cleanText() は、enableTextCleanup() という名前になりました。
$コンポーザーにはnitotm/効率的な言語検出器が必要です
--prefer-dist
testing/ 、 misc/ & benchmark/を省略するか、 --prefer-source
使用してすべてを含めます
nitotm/efficient-language-detector:dev-main
をインストールして、最後の不安定な変更を試してください。
あるいは、ファイルをダウンロード/クローンしても問題なく動作します。
(小規模なDBインストールのみ準備中)
特に大規模なデータベースの場合は、ロード時間を短縮するために OPcache を使用することをお勧めします。
各データベースに対してopcache.interned_strings_buffer
、 opcache.memory_consumption
十分に高く設定する必要があります。
括弧内は推奨値。詳細については、データベースを確認してください。
php.iniの設定 | 小さい | 中くらい | 大きい | 特大 |
---|---|---|---|---|
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
detect()
UTF-8 文字列を期待し、 ISO 639-1コード (またはその他の選択された形式) を含むlanguage
プロパティを持つオブジェクト、または未定義の言語を表す'und'
を返します。
// require_once 'manual_loader.php';オートローダーを使用せずに ELD をロードするには。パスを更新します。use NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, OutputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1);// データベース ファイル: '小」、「中」、「大」、「特大」。メモリ要件を確認してください// 形式: 'ISO639_1'、'ISO639_2T'、'ISO639_1_BCP47'、'ISO639_2T_BCP47'、'FULL_TEXT'// 定数は必須ではありません。LanguageDetector('small', 'ISO639_1'); $eld->detect('Hola, cómo te llamas?');// object( language => string,scores() => array, isReliable() => bool )// ( language => 'es'、scores() => ['es' => 0.25, 'nl' => 0.05]、isReliable() => true )$eld->detect('Hola、como te llamas?') ->言語;// 'es'
langSubset()
1 回呼び出すと、サブセットが設定されます。最初の呼び出しは新しいデータベースを作成するため時間がかかります。データベース ファイルを保存する場合 (デフォルト)、次回同じサブセットを作成するときにそのファイルがロードされます。
追加のオーバーヘッドなしでサブセットを使用するには、 langSubset()
によって保存され返されたファイルを使用して検出器をインスタンス化するのが適切な方法です。以下で利用可能な言語を確認してください。
// ISO 639-1 コードと、異なる場合は選択した出力形式を常に受け入れます。// langSubset(langages: [], save: true, encode: true);保存されている場合はサブセット ファイル名を返します$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Object ( success => bool,messages => ?配列、エラー => ?文字列、ファイル => ?文字列 )// (成功 => true、言語 => ['en', 'es'...]、エラー => NULL、ファイル => ' small_6_mfss...' )// サブセットを削除します$eld->langSubset();// サブセットを使用する最良かつ最速の方法は、デフォルトのデータベースと同じようにロードすることです$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' );
//enableTextCleanup(True) の場合、detect() は URL、.com ドメイン、電子メール、英数字を削除します...// URL とドメインには言語のヒントが含まれており、精度に役立つ可能性があるため推奨されません$eld->enableTextCleanup(true) ); // デフォルトは false // 必要に応じて、ELD インスタンスの情報 (言語、データベース タイプなど) を取得できます。 $eld->info();
PHP には検出器があまりないため、 ELD をさまざまな検出器と比較しました。
URL | バージョン | 言語 |
---|---|---|
https://github.com/nitotm/efficient- language-detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | パイソン |
https://github.com/facebookresearch/fastText | 0.9.2 | C++ |
https://github.com/CLD2Owners/cld2 | 2015 年 8 月 21 日 | C++ |
https://github.com/patrickschur/ language-detection | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | JavaScript |
ベンチマーク:
Tatoeba : 20MB 、Tatoeba の短文、すべての候補者がサポートする 50 言語、それぞれ最大 10,000 行。
Tatoeba では、比較を可能な限り公平にするために、すべての検出器を 50 言語のサブセットに限定しました。
また、Tatoeba はELDトレーニング データセット (またはチューニング) の一部ではありませんが、高速テキスト用です。
ELD テスト: 10MB 、ELD でサポートされている 60 言語の文、各 1000 行。 60GB の ELD トレーニング データから抽出されました。
文章: 8MB 、 Linguaベンチマークからの文章、サポートされていない言語と壊れた文字のあるヨルバ語を除いたもの。
単語のペアは1.5MB 、単一の単語は870KB で、これも同じ 53 言語の Lingua からのものです。
リンガは54 言語、フランは 58 言語、パトリックシュールは54 言語で参加しています。
fasttext には組み込みのサブセット オプションがないため、その精度と速度の可能性を示すために 2 つのベンチマークを作成しました。fasttext-all はどのテストでもサブセットによって制限されません。
* Google のCLD2にもサブセット オプションがなく、そのオプションbestEffort = True
を使用してもサブセットを作成するのは困難です。通常は 1 つの言語のみを返すため、比較的不利な点があります。
時間は正規化されます: (総行数 * 時間) / 処理された行数
小さい | 中くらい | 大きい | 特大 | |
---|---|---|---|---|
長所 | 最低メモリ | 平衡化 | 最速 | 最も正確な |
短所 | 最も精度が低い | 最も遅い(しかし速い) | 高記憶力 | 最高のメモリ |
ファイルサイズ | 3MB | 10MB | 32MB | 71MB |
メモリ使用量 | 76MB | 280MB | 977MB | 2083MB |
キャッシュされたメモリ使用量 | 0.4MB + OP | 0.4MB + OP | 0.4MB + OP | 0.4MB + OP |
OPcache が使用したメモリ | 21MB | 69MB | 244MB | 539MB |
インターンで使用されるOPcache | 4MB | 10MB | 45MB | 98MB |
ロード時間 キャッシュなし | 0.14秒 | 0.5秒 | 1.5秒 | 3.4秒 |
ロード時間キャッシュ | 0.0002秒 | 0.0002秒 | 0.0002秒 | 0.0002秒 |
設定(推奨) | ||||
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... * | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
*バッファオーバーフローエラーによりサーバーの応答が遅れる可能性があるため、十分な量のinterned_strings_buffer
を使用することをお勧めします。
すべてのデータベースを使用するには、 opcache.interned_strings_buffer
少なくとも 160MB (170MB) 必要です。
メモリ量を選択するときは、 opcache.memory_consumption
にopcache.interned_strings_buffer
が含まれることに注意してください。
OPcache メモリが 230MB、interned_strings が 32MB、中型 DB が 69MB キャッシュされている場合、その他すべてに合計 (230 -32 -69) = 129MB の OPcache が必要になります。
また、メイン データベースに加えて言語のサブセット、または複数のサブセットを使用する場合、それらを即座にロードしたい場合は、それに応じてopcache.memory
増やしてください。すべてのデフォルトのデータベースを快適にキャッシュするには、1200MB に設定する必要があります。
デフォルトの Composer インストールにはこれらのファイルが含まれていない可能性があります。それらを含めるには--prefer-source
使用します。
Composer "autoload-dev" (root のみ) を使用した開発環境の場合、次のようにテストが実行されます。
新しい NitotmEldTestsTestsAutoload();
または、次のファイルを実行してテストを実行することもできます。
$ php 効率的な言語検出器/tests/tests.php # パスを更新します
精度ベンチマークを実行するには、 benchmark/bench.php
ファイルを実行します。
これらは、60 の言語を含むISO 639-1 コードです。未定を表すプラス'und'
これはデフォルトの ELD 言語形式です。 outputFormat: 'ISO639_1'
am、ar、az、be、bg、bn、ca、cs、da、de、el、en、es、et、eu、fa、fi、fr、gu、he、hi、hr、hu、hy、は、 it、ja、ka、kn、ko、ku、lo、lt、lv、ml、mr、ms、nl、no、or、pa、pl、pt、ro、ru、sk、sl、sq、sr、sv、タ、テ、th、tl、tr、uk、ur、vi、yo、zh
これらは、 Nito-ELDでサポートされている 60 の言語です。 outputFormat: 'FULL_TEXT'
アムハラ語、アラビア語、アゼルバイジャン語 (ラテン語)、ベラルーシ語、ブルガリア語、ベンガル語、カタロニア語、チェコ語、デンマーク語、ドイツ語、ギリシャ語、英語、スペイン語、エストニア語、バスク語、ペルシア語、フィンランド語、フランス語、グジャラート語、ヘブライ語、ヒンディー語、クロアチア語、ハンガリー語、アルメニア語、アイスランド語、イタリア語、日本語、グルジア語、カンナダ語、韓国語、クルド語 (アラビア語)、ラオス語、リトアニア語、ラトビア語、マラヤーラム語、マラーティー語、マレー語 (ラテン)、オランダ語、ノルウェー語、オリヤ語、パンジャブ語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、スロバキア語、スロベニア語、アルバニア語、セルビア語 (キリル)、スウェーデン語、タミル語、テルグ語、タイ語、タガログ語、トルコ語、ウクライナ語、ウルドゥー語、ベトナム語、ヨルバ語、中国語
ISO 639-1 コードと IETF BCP 47 スクリプト名タグ。 outputFormat: 'ISO639_1_BCP47'
am、ar、az-Latn、be、bg、bn、ca、cs、da、de、el、en、es、et、eu、fa、fi、fr、gu、he、hi、hr、hu、hy、 is、it、ja、ka、kn、ko、ku-アラブ、lo、lt、lv、ml、mr、ms-latn、nl、no、or、pa、pl、pt、ro、ru、sk、sl、 sq、sr-Cyrl、sv、ta、te、th、tl、tr、uk、ur、vi、yo、zh
ISO 639-2/Tコード (これも有効な639-3 ) outputFormat: 'ISO639_2T'
。 BCP 47 ISO639_2T_BCP47
でも利用可能
アム、アラ、アゼ、ベル、ブル、ベン、猫、セス、ダン、デウ、エル、イングランド、スパ、エスト、ユース、ファス、フィン、フラ、グジ、ヘブ、ヒン、フルブ、フン、ヘイ、イスル、 ita、jpn、kat、kan、kor、kur、lao、lit、lav、mal、mar、msa、nld、nor、ori、pan、pol、por、ron、rus、slk、slv、sqi、srp、swe、タム、テル、ター、ティーグル、トゥール、イギリス、ウルド、ヴィー、ヨール、ゾー
オープンソースの改善のために寄付したい場合、プライベートな変更のために私を雇いたい場合、代替データセットのトレーニングをリクエストしたい場合、または私に連絡したい場合は、次のリンクを使用してください: https://linktr.ee/nitotm