nitotm / efficient-language-detector
快速准确的自然语言检测。由PHP编写的检测器。Nito-ELD,ELD。
Requires
- php: ^7.4 || ^8.0
- ext-mbstring: *
This package is not auto-updated.
Last update: 2024-09-10 13:02:44 UTC
README
高效语言检测器(《Nito-ELD》或《ELD》)是一种快速准确的自然语言检测软件,100%由PHP编写,速度与快速C++编译的检测器相当,准确度在目前最佳检测器范围内。
它没有依赖项,易于安装,只需要PHP带有 mb 扩展。
ELD还提供(旧版本)的JavaScript和Python版本。
从ELD v2到v3-beta的更改
- detect()->language现在对于未确定返回字符串
'und'
而不是NULL
- 数据库不兼容,并且更大,中等v2 ≈ 小型v3
- dynamicLangSubset()函数已删除
- 函数cleanText()现在命名为enableTextCleanup()
安装
$ composer require nitotm/efficient-language-detector
--prefer-dist
将省略tests/、misc/和benchmark/,或使用--prefer-source
来包含所有内容- 安装
nitotm/efficient-language-detector:dev-main
以尝试最新的不稳定更改 - 或者,下载/克隆文件也可以正常工作。
(仅小型数据库安装建设中)
配置
建议使用OPcache,特别是对于大型数据库,以减少加载时间。
我们需要为每个数据库设置足够的opcache.interned_strings_buffer
和opcache.memory_consumption
括号内为推荐值。更多信息请查看数据库。
如何使用?
detect()
期望一个UTF-8字符串,并返回一个包含language
属性的object,其中包含一个ISO 639-1代码(或其他选择的格式),或对于未确定的语言返回'und'
。
// require_once 'manual_loader.php'; To load ELD without autoloader. Update path. use Nitotm\Eld\{LanguageDetector, EldDataFile, EldFormat}; // LanguageDetector(databaseFile: ?string, outputFormat: ?string) $eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1); // Database files: 'small', 'medium', 'large', 'extralarge'. Check memory requirements // Formats: 'ISO639_1', 'ISO639_2T', 'ISO639_1_BCP47', 'ISO639_2T_BCP47' and 'FULL_TEXT' // Constants are not mandatory, LanguageDetector('small', 'ISO639_1'); will also work $eld->detect('Hola, cómo te llamas?'); // object( language => string, scores() => array<string, float>, isReliable() => bool ) // ( language => 'es', scores() => ['es' => 0.25, 'nl' => 0.05], isReliable() => true ) $eld->detect('Hola, cómo te llamas?')->language; // 'es'
语言子集
调用一次langSubset()
将设置子集。第一次调用需要更长时间,因为它会创建一个新的数据库。如果保存数据库文件(默认),则在下次执行相同的子集时将加载它。
为了使用没有额外开销的子集,正确的方式是用langSubset()
返回的文件保存实例化检测器。请查看下面的可用语言。
// It always accepts ISO 639-1 codes, as well as the selected output format if different. // langSubset(languages: [], save: true, encode: true); Will return subset file name if saved $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...' ) // to remove the subset $eld->langSubset(); // The best and fastest way to use a subset, is to load it just like a default database $eld_subset = new Nitotm\Eld\LanguageDetector('small_6_mfss5z1t');
其他函数
// if enableTextCleanup(True), detect() removes Urls, .com domains, emails, alphanumerical... // Not recommended, as urls & domains contain hints of a language, which might help accuracy $eld->enableTextCleanup(true); // Default is false // If needed, we can get info of the ELD instance: languages, database type, etc. $eld->info();
基准测试
我比较了《ELD》与其他不同类型的检测器,因为PHP中并不多。
基准测试
- Tatoeba:20MB,来自Tatoeba的简短句子,所有竞争者支持50种语言,每种语言最多10k行。
- 对于Tatoeba,我限制了所有检测器仅使用50种语言的子集,以尽可能公平地进行比较。
- Tatoeba不是《ELD》训练数据集的一部分(也非调整),但它对fasttext是。
- ELD测试:10MB,来自ELD支持的60种语言的句子,每种语言1000行。从60GB的ELD训练数据中提取。
- 句子:8MB,来自Lingua基准测试,减去不受支持的语言和Yoruba,因为其字符已损坏。
- 单词对 1.5MB和单个单词 870KB,也来自Lingua,相同的53种语言。
- 语言参与54种语言,Franc参与58种,patrickschur参与54种。
- fasttext没有内置子集选项,因此为了展示其准确性和速度潜力,我进行了两次基准测试,fasttext-all在任何测试中都不受任何子集的限制
- * Google的CLD2也缺少子集选项,即使使用其选项
bestEffort = True
,也难以制作子集,通常只返回一种语言,因此它具有比较劣势。 - 时间已归一化:(总行数 * 时间) / 处理行数
数据库
- * 我建议使用足够的
interned_strings_buffer
,因为buffers overflow错误可能会延迟服务器响应。
要使用所有数据库,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
来包括它们。
- 对于dev环境中的composer "autoload-dev"(仅限根),以下将执行测试
new Nitotm\Eld\Tests\TestsAutoload();
- 或者,您也可以运行以下文件执行测试
$ php efficient-language-detector/tests/tests.php # Update path
- 要运行准确度基准测试,请运行
benchmark/bench.php
文件。
语言
- 这些是包含60种语言的ISO 639-1 codes。另外,还有
'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, or, 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'
Amharic, Arabic, Azerbaijani (Latin), Belarusian, Bulgarian, Bengali, Catalan, Czech, Danish, German, Greek, English, Spanish, Estonian, Basque, Persian, Finnish, French, Gujarati, Hebrew, Hindi, Croatian, Hungarian, Armenian, Icelandic, Italian, Japanese, Georgian, Kannada, Korean, Kurdish (Arabic), Lao, Lithuanian, Latvian, Malayalam, Marathi, Malay (Latin), Dutch, Norwegian, Oriya, Punjabi, Polish, Portuguese, Romanian, Russian, Slovak, Slovene, Albanian, Serbian (Cyrillic), Swedish, Tamil, Telugu, Thai, Tagalog, Turkish, Ukrainian, Urdu, Vietnamese, Yoruba, Chinese
- ISO 639-1 codes with IETF BCP 47 script name tag.
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, 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 codes (which are also valid 639-3)
outputFormat: 'ISO639_2T'
. Also available with BCP 47ISO639_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