colombo / language-detection
PHP 语言检测库。可从给定文本字符串中检测语言。
Requires
- php: ^7
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^6
README
构建状态 | 代码覆盖率 | 版本 | 总下载量 | 维护 | 最低PHP版本 | 许可证 |
---|---|---|---|---|---|---|
该库可以检测给定文本字符串的语言。它可以解析给定训练文本中的许多不同方言到一个N-gram序列,并构建一个用于检测阶段的JSON格式的数据库文件。然后它可以取一个给定的文本并使用训练阶段之前生成的数据库来检测它的语言。该库包含用于训练和检测110种语言文本的文本样本。
目录
使用Composer安装
注意:此库需要多字节字符串扩展才能运行。
$ composer require patrickschur/language-detection
基本用法
为了正确检测语言,输入文本的长度至少应该是一些句子。
use LanguageDetection\Language; $ld = new Language; $ld->detect('Mag het een onsje meer zijn?')->close();
结果
Array
(
"nl" => 0.66193548387097,
"af" => 0.51338709677419,
"br" => 0.49634408602151,
"nb" => 0.48849462365591,
"nn" => 0.48741935483871,
"fy" => 0.47822580645161,
"dk" => 0.47172043010753,
"sv" => 0.46408602150538,
"bi" => 0.46021505376344,
"de" => 0.45903225806452,
[...]
)
API
__construct(array $result = [], string $dirname = '')
您可以向构造函数传递一个语言数组。仅比较所需的句子与给定的语言。这可以显著提高性能。其他参数是可选的,是翻译文件所在的目录名称。
$ld = new Language(['de', 'en', 'nl']); // Compares the sentence only with "de", "en" and "nl" language models. $ld->detect('Das ist ein Test');
whitelist(string ...$whitelist)
提供一个白名单。返回所需的语言的列表。
$ld->detect('Mag het een onsje meer zijn?')->whitelist('de', 'nn', 'nl', 'af')->close();
结果
Array
(
"nl" => 0.66193548387097,
"af" => 0.51338709677419,
"nn" => 0.48741935483871,
"de" => 0.45903225806452
)
blacklist(string ...$blacklist)
提供一个黑名单。从结果中删除给定的语言。
$ld->detect('Mag het een onsje meer zijn?')->blacklist('dk', 'nb', 'de')->close();
结果
Array
(
"nl" => 0.66193548387097,
"af" => 0.51338709677419,
"br" => 0.49634408602151,
"nn" => 0.48741935483871,
"fy" => 0.47822580645161,
"sv" => 0.46408602150538,
"bi" => 0.46021505376344,
[...]
)
bestResults()
返回最佳结果。
$ld->detect('Mag het een onsje meer zijn?')->bestResults()->close();
结果
Array
(
"nl" => 0.66193548387097
)
limit(int $offset, int $length = null)
您可以指定要返回的记录数。例如,以下代码将返回前三个条目。
$ld->detect('Mag het een onsje meer zijn?')->limit(0, 3)->close();
结果
Array
(
"nl" => 0.66193548387097,
"af" => 0.51338709677419,
"br" => 0.49634408602151
)
close()
以数组的形式返回结果。
$ld->detect('This is an example!')->close();
结果
Array
(
"en" => 0.5889400921659,
"gd" => 0.55691244239631,
"ga" => 0.55376344086022,
"et" => 0.48294930875576,
"af" => 0.48218125960061,
[...]
)
setTokenizer(TokenizerInterface $tokenizer)
脚本使用分词器来获取句子中的所有单词。您可以定义自己的分词器来处理数字等。
$ld->setTokenizer(new class implements TokenizerInterface { public function tokenize(string $str): array { return preg_split('/[^a-z0-9]/u', $str, -1, PREG_SPLIT_NO_EMPTY); } });
这将只返回字母表中的字符(小写)和0到9之间的数字。
__toString()
返回结果中的顶级条目。注意开头的echo
。
echo $ld->detect('Das ist ein Test.');
结果
de
jsonSerialize()
将数据序列化为JSON。
$object = $ld->detect('Tere tulemast tagasi! Nägemist!'); json_encode($object, JSON_PRETTY_PRINT);
结果
{
"et": 0.5224748810153358,
"ch": 0.45817028027498674,
"bi": 0.4452670544685352,
"fi": 0.440983606557377,
"lt": 0.4382866208355367,
[...]
}
方法链
您还可以组合方法。以下示例将删除黑名单中指定的所有条目,并只返回前四个条目。
$ld->detect('Mag het een onsje meer zijn?')->blacklist('af', 'dk', 'sv')->limit(0, 4)->close();
结果
Array
(
"nl" => 0.66193548387097
"br" => 0.49634408602151
"nb" => 0.48849462365591
"nn" => 0.48741935483871
)
数组访问
您还可以直接将对象作为数组访问。
$object = $ld->detect(Das ist ein Test'); echo $object['de']; echo $object['en']; echo $object['xy']; // does not exists
结果
0.6623339658444
0.56859582542694
NULL
支持的语言
该库目前支持110种语言。要查看所有支持的语言概述,请参阅此处。
其他语言
该库是可训练的,这意味着您可以更改、删除并添加自己的语言文件。如果您的语言不受支持,请随时添加自己的语言文件。为此,在resources
中创建一个新的目录,并将您的训练文本添加到其中。
注意:训练文本应该是.txt文件。
示例
|- resources
|- ham
|- ham.txt
|- spam
|- spam.txt
如您所见,我们还可以用它来检测垃圾邮件或正常邮件。
如果您将翻译文件存储在resources
之外,您必须指定路径。
$t->learn('YOUR_PATH_HERE');
每次您更改翻译文件之一时,您必须首先为其生成语言配置文件。这可能需要几秒钟。
use LanguageDetection\Trainer; $t = new Trainer(); $t->learn();
在执行后删除这些几行,现在我们可以使用自己的训练文本对文本进行语言分类。
常见问题解答
如何提高检测阶段的效果?
为了提高检测阶段的效果,您必须使用更多的n-gram。但请注意,这将减慢脚本的运行速度。我发现当使用大约9,000个n-gram时(默认为310),检测阶段效果最好。要实现这一点,请查看下面的代码
$t = new Trainer(); $t->setMaxNgrams(9000); $t->learn();
首先,您必须对其进行训练。现在,您可以像以前一样对文本进行分类,但您必须指定您想要使用多少个n-gram。
$ld = new Language(); $ld->setMaxNgrams(9000); // "grille pain" is french and means "toaster" in english var_dump($ld->detect('grille pain')->bestResults());
结果
class LanguageDetection\LanguageResult#5 (1) {
private $result =>
array(2) {
'fr' =>
double(0.91307037037037)
'en' =>
double(0.90623333333333)
}
}
如果语言文件非常大,检测过程会变慢吗?
不会。训练类将只使用该语言的最好的310个n-gram。如果您不更改此数字或添加更多语言文件,这不会影响性能。只有创建N-gram是较慢的。然而,N-gram的创建只需要做一次。检测阶段只有在您尝试检测大量文本时才会受到影响。
总结:训练阶段将会变慢,但检测阶段保持不变。
贡献
请随时贡献。任何帮助都受欢迎。
许可证
本项目遵循MIT许可证的条款。