高效語言檢測器( Nito-ELD或ELD )是一款快速、準確的自然語言檢測軟體,100% 以PHP 編寫,速度可與快速C++ 編譯的檢測器相媲美,準確度在迄今為止最好的檢測器範圍內。
它沒有依賴項,安裝簡單,只需要有mb副檔名的 PHP。
ELD 也可用於 Javascript 和 Python(已過時的版本)。
安裝
如何使用
基準測試
資料庫
測試
語言
從 ELD v2 到 v3 的變更:
檢測()->語言現在返回字串
'und'
表示未確定而不是NULL
資料庫不相容,大中型v2 ≈ 小v3
刪除了dynamicLangSubset()函數
函數 cleanText() 現在命名為enableTextCleanup()
$ 作曲家需要 nitotm/高效語言偵測器
--prefer-dist
將省略測試/ 、雜項/和基準/ ,或使用--prefer-source
包含所有內容
安裝nitotm/efficient-language-detector:dev-main
嘗試最後的不穩定更改
或者,下載/克隆文件也可以正常工作。
(僅正在建置中的小型資料庫安裝)
建議使用 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 字串並傳回一個具有language
屬性的對象,其中包含ISO 639-1代碼(或其他選定的格式),或'und'
表示未確定的語言。
// require_once 'manual_loader.php';無需自動加載器即可加載 ELD。更新path.use NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, outputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::0639_1);小」、「中」、「大」、「超大」。檢查記憶體需求//格式:'ISO639_1','ISO639_2T','ISO639_1_BCP47','ISO639_2T_BCP47'和'FULL_TEXT'//常數不是強制性的,LanguageDetector('small','ISO639_1','ISO);也可以工作$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, cómo te llamas?') ->語言;// 'es'
呼叫langSubset()
一次,將設定子集。第一次呼叫需要更長的時間,因為它會建立一個新資料庫,如果儲存資料庫檔案(預設),下次我們建立相同的子集時會載入它。
要使用子集而不產生額外開銷,正確的方法是使用langSubset()
保存和傳回的檔案實例化偵測器。檢查下面的可用語言。
// 它總是接受 ISO 639-1 程式碼,以及所選的輸出格式(如果不同)。若儲存,將傳回子集檔案名稱$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Object ( success => bool , languages => ?array, error => ?string, file => ?string )// ( success => true, languages => ['en', 'es'...], error => NULL, file = > ' small_6_mfss...' )// 刪除子集$eld->langSubset();// 使用子集的最好最快的方法是像預設資料庫一樣載入它$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' ) ;
// 如果enableTextCleanup(True),則detector() 刪除URL、.com 網域、電子郵件、字母數字...// 不推薦,因為url 和網域包含語言提示,這可能有助於準確度$eld- >enableTextCleanup(true ); // 預設為 false // 如果需要,我們可以取得 ELD 實例的資訊:語言、資料庫類型等。
我將ELD與不同種類的偵測器進行了比較,因為 PHP 中的偵測器並不多。
網址 | 版本 | 語言 |
---|---|---|
https://github.com/nitotm/efficient-language- detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | Python |
https://github.com/facebookresearch/fastText | 0.9.2 | C++ |
https://github.com/CLD2Owners/cld2 | 2015 年 8 月 21 日 | C++ |
https://github.com/patrickschur/語言偵測 | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | JavaScript |
基準:
Tatoeba : 20MB ,來自 Tatoeba 的短句,所有競爭者都支援 50 種語言,每種語言最多 10k 行。
對於 Tatoeba,我將所有偵測器限制為 50 種語言子集,使比較盡可能公平。
此外,Tatoeba 不是ELD訓練資料集(也不是調整)的一部分,但它適用於fasttext
ELD測試: 10MB ,ELD支援的60種語言的句子,每個1000行。從 60GB ELD 訓練資料中提取。
句子: 8MB ,來自Lingua基準的句子,減去不支援的語言和字符損壞的約魯巴語。
字對1.5MB和單字870KB ,也來自 Lingua,相同 53 種語言。
Lingua參與了 54 種語言, Franc參與了 58 種語言, patrickschur參與了 54 種語言。
fasttext沒有內建子集選項,因此為了展示其準確性和速度潛力,我做了兩個基準測試,fasttext-all 在任何測試中都不受任何子集的限制
* Google 的CLD2也缺少子集選項,即使使用其選項bestEffort = True
也很難產生子集,因為通常只傳回一種語言,因此具有相對劣勢。
時間標準化:(總行數 * 時間)/處理的行數
小的 | 中等的 | 大的 | 特大號 | |
---|---|---|---|---|
優點 | 最低記憶體 | 平衡 | 最快 | 最準確 |
缺點 | 最不準確 | 最慢(但很快) | 高記憶力 | 最高記憶體 |
文件大小 | 3MB | 10MB | 32MB | 71MB |
記憶體使用情況 | 76MB | 280MB | 977MB | 2083MB |
快取記憶體使用情況 | 0.4 MB + OP | 0.4 MB + OP | 0.4 MB + OP | 0.4 MB + OP |
OPcache 使用的記憶體 | 21MB | 69MB | 244MB | 539MB |
OPcache 使用 interned | 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 effective-language- detector/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、is、 it、ja、ka、kn、ko、ku、lo、lt、lv、ml、mr、ms、nl、no、或、pa、pl、pt、ro、ru、sk、sl、sq、sr、sv、 ta、te、th、tl、tr、uk、ur、vi、yo、zh
這些是Nito-ELD支援的 60 種語言。 outputFormat: 'FULL_TEXT'
阿姆哈拉語、阿拉伯語、亞塞拜然語(拉丁語)、白俄羅斯語、保加利亞語、孟加拉語、加泰隆尼亞語、捷克語、丹麥語、德語、希臘語、英語、西班牙語、愛沙尼亞語、巴斯克語、波斯語、芬蘭語、法語、古吉拉特語、希伯來語、印地語、克羅埃西亞語、匈牙利語、亞美尼亞語, 冰島語, 義大利語, 日語, 格魯吉亞語, 卡納達語, 韓語, 庫德語(阿拉伯語), 寮語, 立陶宛語, 拉脫維亞語, 馬拉雅拉姆語, 馬拉地語, 馬來語(拉丁語), 荷蘭語, 挪威語, 奧裡亞語, 旁遮普語, 波蘭語, 葡萄牙語, 羅馬尼亞語, 俄語, 斯洛伐克語, 斯洛維尼亞語, 阿爾巴尼亞語, 塞爾維亞語(西里爾語), 瑞典語, 泰米爾語, 泰盧固語, 泰國語, 他加祿語, 泰國語, 泰盧固語語, 土耳其語, 烏克蘭語, 烏爾都語, 越南語, 約魯巴語, 中文
帶有 IETF BCP 47 腳本名稱標籤的ISO 639-1 程式碼。 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-Arab、lo、lt、lv、ml、mr、ms-Latn、nl、no、或、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
amh、ara、aze、bel、bul、ben、cat、ces、dan、deu、ell、eng、spa、est、eus、fas、fin、fra、guj、heb、hin、hrv、hun、hye、isl、 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、 tam、tel、tha、tgl、tur、ukr、urd、vie、yor、zho
如果您希望為開源改進捐款、僱用我進行私人修改、請求替代資料集培訓或與我聯繫,請使用以下連結:https://linktr.ee/nitotm