wikimedia / textcat
TextCat语言猜测工具的PHP端口,请参阅http://odur.let.rug.nl/~vannoord/TextCat/。
Requires
- php: >=7.2.9
Requires (Dev)
- mediawiki/mediawiki-codesniffer: 38.0.0
- mediawiki/mediawiki-phan-config: 0.11.1
- mediawiki/minus-x: 1.1.1
- ockcyp/covers-validator: 1.3.3
- php-parallel-lint/php-console-highlighter: 0.5.0
- php-parallel-lint/php-parallel-lint: 1.3.1
- phpunit/phpunit: ^8.5
README
/\_/\
( . . )
=\_v_/=
PHP
这是一个TextCat语言猜测工具的PHP端口。
请参阅原始的Perl版本http://odur.let.rug.nl/~vannoord/TextCat/和更新的Perl版本https://github.com/Trey314159/TextCat。
内容
该包包含分类器类本身和一些工具,用于对文本进行分类和生成ngram数据库。由于以这种方式提取ngram更简单,代码现在假定文本编码为UTF-8。此外,现在几乎每个人都使用UTF-8,我,作为一个,欢迎我们的新UTF-8编码的统治者。
构建包
下载包后,您需要使用composer
构建它。运行以下命令安装所有开发相关依赖项
composer install
要安装启动所需的最小内容,请使用--no-dev
运行命令。
composer install --no-dev
Composer依赖项安装在与vendor/
目录中,并且对于TextCat的正常运行是必要的。
分类器
分类器是脚本catus.php
,它可以这样运行
echo "Bonjour tout le monde, ceci est un texte en français" | php catus.php -d LM
或者
php catus.php -d LM -l "Bonjour tout le monde, ceci est un texte en français"
输出将是检测到的语言列表,由OR
分隔,例如
fr OR ro
请注意,提供的语言模型集合中包括一个Oriya (ଓଡ଼ିଆ)语言模型,其语言代码为or
,因此可能的结果如or OR sco OR ro OR nl
。
生成器
要从一组文本生成语言模型数据库,请使用脚本felis.php
。它可以这样运行
php felis.php INPUTDIR OUTPUTDIR
它将从INPUTDIR
读取文本并将ngram文件生成在OUTPUTDIR
中。假设INPUTDIR
中的文件名称类似于LANGUAGE.txt
,例如english.txt
,german.txt
,klingon.txt
等。
如果您正在处理大量的语料库(例如,数百万个字符),您应该在TextCat.php
中将$minFreq
设置为一个合理的较小值,例如10
,以便在排序之前剪除非常长的低频ngram。这减少了生成语言模型所需的CPU和内存要求。在评估文本时,除非您的输入文本相当大,否则应将$minFreq
设置回0
。
转换器
提供了一个额外的脚本lm2php.php
,用于将TextCat Perl版本的模型格式转换为该版本使用的格式。它可以这样运行
php lm2php.php INPUTDIR OUTPUTDIR
INPUTDIR
中的Perl风格模型将转换为PHP风格模型,并写入同名到OUTPUTDIR
。
模型
该包在LM
目录中附带默认的语言模型数据库和在LM-query
目录中的基于查询的语言模型数据库。然而,模型性能将很大程度上取决于将要应用的文本语料库以及特定的修改(例如,首字母大写,变音符号等)。目前,库不以任何方式修改或规范训练文本或分类文本,因此对于特定应用,使用自定义语言模型可能更合适。
模型名称使用Wikipedia语言代码,这些代码通常但并不保证与ISO 639语言代码相同。(但请参阅下面的“错误的键盘/编码模型”)。
在检测语言时,您通常会得到更好的结果,当您能够限制使用的语言模型数量时,尤其是对于非常短的文章。例如,如果您的文本几乎不可能是爱尔兰盖尔语,那么只包含爱尔兰盖尔语语言模型(ga
)只会增加误识别的可能性。这对密切相关语言(例如,罗曼语族,或英语/en
和苏格兰语/sco
)尤其如此。
限制使用的语言模型数量通常也能提高性能。您可以将所需的语言模型复制到一个新目录中(并使用-d
与catus.php
),或在命令行中指定所需的语言(使用-c
与catus.php
)。
您还可以将多个目录中的模型组合起来(例如,要使用基于查询的模型,并回退到基于Wiki-Text的模型),使用逗号分隔的目录列表(使用-d
与catus.php
)。目录将按顺序扫描,并且只有找到的第一个具有特定名称的模型将被使用。
Wiki-Text 模型
LM
中的70多个语言模型基于从该语言随机选择的维基百科文章中提取的文本。所包含的语言是根据多种标准选择的,包括该语言的母语人士数量、该语言在各种维基项目中的查询数量(不仅仅是维基百科)、原始TextCat支持的语言列表以及该语言维基百科的大小(即用于抽取训练语料库的集合的大小)。
每种语言的训练语料库最初由约270万到280万个字符组成,不包括标记。然后对文本进行了轻微的预处理。所采取的预处理步骤包括:移除HTML标签。对行进行排序并使用uniq
(这样维基百科的特定之处——如“参考文献”、“另请参阅”和“本文是存根”——不会被过度代表,并且随机选择多次的文章将被减少到一份副本)。对于拉丁字符集的语料库,移除不包含拉丁字符的行。对于非拉丁字符集的语料库,移除只包含拉丁字符、数字和标点的行。基于字符集的过滤从各个语料库中移除了数十到数千行。对于多字符集语料库(例如,塞尔维亚-克罗地亚语/sh
、塞尔维亚/sr
、土库曼/tk
),没有进行基于字符集的过滤。训练语料库的最终大小从约180万到280万个字符。
这些模型尚未经过彻底测试,并按原样提供。我们可能会在未来添加新的模型或移除性能不佳的模型。
这些模型具有10,000个ngram。用于语言识别的最佳ngram数量取决于应用。对于较大的文本(例如,每个样本包含数百个单词),可能需要使用显著较小的ngram集。您可以通过更改TextCat.php
或felis.php
中的$maxNgrams
或使用-m
与catus.php
来设置要使用的数量。
Wiki查询模型
LM-query
中的30多个语言模型基于维基百科的查询数据,这些数据不如正式(例如,使用变音符号的语言中使用的变音符号较少),并且与一般文本的单词分布不同。考虑的原语言集是基于特定一周内所有维基项目中的查询数量。文本已经过预处理,并且根据与上述Wiki-Text模型类似的流程,从训练集中移除了许多查询。
一般来说,查询数据比Wiki-Text更混乱——包括垃圾文本和意外语言的查询——但至少对于英语维基百科,查询字符串的整体性能更好。
提供的最终模型集部分基于它们在英语维基百科查询(使用TextCat进行语言ID的第一个目标)上的性能。更多细节请参阅我们的初始报告。根据额外的性能评估,未来将添加更多语言。
这些模型包含10,000个ngram。用于语言识别的最佳ngram数量取决于应用。对于较大的文本(例如,每个样本包含数百个单词),可能需要显著较小的ngram集。对于在英语维基百科字符串上看到的短查询,模型大小为3000到9000个ngram效果最好,具体取决于其他参数设置。您可以通过更改TextCat.php
或felis.php
中的$maxNgrams
或使用catus.php
中的-m
来设置要使用的数量。
错误的键盘/编码模型
提供的五个模型基于“错误”的输入类型,要么使用错误的键盘,要么使用错误的编码。
当某人使用两个不同的键盘(例如,俄语西里尔文和美式英语)并使用激活错误的键盘时,会发生错误的键盘输入。这在俄罗斯和希伯来语维基百科上相对常见。看起来像是乱码——例如,jutvcrfz hfgcjlbz——但实际上如果按下另一个键盘上的相同键,则实际上是合理的文本——在这种情况下,богемская рапсодия("bohemian rapsody")。对于错误的键盘输入,字符之间的映射是一对一,因此现有的模型可以直接转换。
当文本使用一种字符编码(如UTF-8)编码,但被解释为不同的字符编码(例如Windows-1251)时,会发生错误的编码输入,这会导致类似РњРѕСЃРєРІР°的输出。由于字符映射是1对2(例如,М → Рњ),因此需要从错误编码的样本文本中重新生成模型。
提供的错误的键盘/编码模型有
en_cyr.lm
(在wiki-text和wiki查询版本中)——在俄罗斯西里尔文键盘上意外输入的英语。ru_lat.lm
(在wiki-text和wiki查询版本中)——在美式英语键盘上意外输入的俄语。ru_win1251.lm
(仅限wiki-text版本)——意外解释为Windows-1251编码的UTF-8俄语。
根据应用,en_cyr
和ru_lat
模型可以用于检测在错误的键盘上输入的非英语拉丁语或非俄语西里尔文输入。例如,在俄语西里尔文键盘上输入的法语或西班牙语比俄罗斯模型更接近en_cyr
模型。