高效语言检测器( 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::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, cómo te llamas?') ->语言;// 'es'
调用langSubset()
一次,将设置子集。第一次调用需要更长的时间,因为它创建一个新数据库,如果保存数据库文件(默认),下次我们创建相同的子集时将加载它。
要使用子集而不产生额外开销,正确的方法是使用langSubset()
保存和返回的文件实例化检测器。检查下面的可用语言。
// 它始终接受 ISO 639-1 代码,以及所选的输出格式(如果不同)。// langSubset(languages: [], save: true,encode: true);如果保存,将返回子集文件名$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->info();
我将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