| 建立状态 | 代码覆盖范围 | 版本 | 总下载 | 最小php版本 | 执照 |
|---|---|---|---|---|---|
该库可以检测给定文本字符串的语言。它可以将许多不同字体中的训练文本解析为一系列n-grams,并在PHP中构建一个数据库文件,以在检测阶段使用。然后,它可以使用给定的文本并使用先前在培训阶段生成的数据库来检测其语言。该库带有用于培训和检测110种语言的文本的文本样本。
注意:此库需要多型字符串扩展才能工作。
$ composer require patrickschur/language-detection3.yz升级到4.yz ?重要的是:仅适用于使用自己的翻译文件的自定义目录的人。
从版本4.yz开始,我们已经更新了资源文件。出于绩效原因,我们现在将PHP而不是JSON用作格式。这意味着想要使用4.yz并使用3.yz的人必须将其JSON文件升级到PHP。要升级您的资源文件,您必须再次生成语言配置文件。然后不再需要JSON文件。
您可以使用以下命令在Linux下删除不必要的JSON文件。
rm resources/ * / * .json为了正确检测语言,输入文本的长度至少应为一些句子。
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,
[...]
)
__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-grams(默认为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 LanguageDetectionLanguageResult#5 (1) {
private $result =>
array(2) {
'fr' =>
double(0.91307037037037)
'en' =>
double(0.90623333333333)
}
}
不,不是。培训师类只能使用该语言的最佳310 n克。如果您不更改此数字或添加更多语言文件,则不会影响性能。只有创建n-grams才较慢。但是,n-gram的创建必须仅完成一次。仅当您试图检测大量文本时,检测阶段才会受到影响。
摘要:训练阶段将较慢,但检测阶段保持不变。
随时做出贡献。欢迎任何帮助。
该项目是根据MIT许可证的条款获得许可的。