synida / hunspell-php-wrapper
HunSpell 的 PHP 包装器,支持多线程和自定义词典。
Requires
- php: ^7.0 || ^8.0
- ext-intl: *
- ext-json: *
- composer/composer: ^1.10.23 || ^2.1.9
Requires (Dev)
Suggests
- php: ^7.2
- ext-parallel: *
README
hunspell-php-wrapper
这个库是一个简单的 Hunspell 拼写检查包装器,支持多线程拼写检查和简单的词典编辑器。
需求
Hunspell - 没有它您将无法使用此库。
如果您希望使用此模块的多线程模式,那么您还需要以下内容
- PHP ^7.2 || ^8.0
- 启用 ZTS 的 PHP
- parallel 扩展 - 您可能需要从源代码编译它
安装
composer require synida/hunspell-php-wrapper
在安装过程中,脚本将检测 CPU 线程数和 PC。同样,每个线程的最小单词数将被计算出来,这将确定从哪个单词数量开始使用额外的线程才有意义(基于全局平均 91% 的准确率)
如果已安装,此安装脚本将使用并行模块,否则线程数将设置为 1。
您可以为本地的 Hunspell 安装自己的词典。
性能信息
在单线程模式下,Hunspell 的处理时间可能需要大约 30 秒 - 配置中的默认 PHP 请求超时限制 - 对于大约 15-16k 个单词长度的文本,准确率率为 91%。
在多线程模式下,CPU 数量的加倍将导致处理时间略微减少,因此您环境中的 CPU 越多,处理速度就越快。
拼写检查器
基本用法
$results = (new HunSpell(
// encoding
'en_GB.utf8',
// dictionary file name without extension
'en_GB',
// response type
HunSpell::JSON_RESPONSE,
// max threads - ignored if the parallel module is dissabled
1,
// optimal minimum thread words - ignored if the thread number is 1
Configuration::MIN_WORD_PER_THREAD
))->suggest();
支持的输出格式:array
、json
输出具有优化的尺寸,如果您不确定属性键的含义,可以在 HunSpell
类中找到键常量
高级用法
并行扩展不能在 Web(PHP CGI)环境中使用,因此包装器只能与 PHP CLI 一起使用,不能直接在 Web 环境中使用
然而,如果您在一个守护进程(例如 supervisor)中运行 PHP 脚本,那么您可以通过 UDP 端口或 Unix 套接字在脚本(由 PHP CLI 运行)和您的 Web 环境(PHP CGI)之间进行通信,因此您可以在 Web 环境中使用多线程功能。为了优化性能,建议在最小最优线程单词数下使用单线程执行,该数应与后台脚本和 Web 应用之间的通信时间(应进行测量)进行调整。
须知事项
平均单词计算其建议所需的时间大约是检查正确单词所需时间的 10 倍。
创建单独的线程需要时间。使用每线程最优最小单词数将几乎不会增加拼写检查时间,如果检查的文本非常短。尽管在较长的文本中性能会提高。这里的短文本是指非常接近 Configuration::MIN_WORD_PER_THREAD * n
线程(如果您是计算它或在 composer 安装期间,这意味着并行是在那之前安装的)。
词典编辑器
每个词典都有两个文件;一个 .dic
文件和一个 .aff
文件。.dic 文件的第一行是一个数字,表示词典包含的单词数量。其余的是词典中的单词。.aff 文件是词典的规则集,描述了语言规则。
hunspell 可以同时使用一个词典,在两个较小的词典上执行拼写检查两次然后合并结果,比在一个较大的词典上执行它要慢得多。
可以通过使用 hunspell -D
命令来检查 hunspell 的默认词典路径。
词典编辑器基本用法
[注意]:文件和单词操作需要读写文件权限。
创建词典文件(.dic
/.aff
/.tpl
)
(new DictionaryEditor())->create($path);
删除词典文件(.dic
/.aff
/.tpl
)
(new DictionaryEditor())->delete($path);
向词典/模板中添加新单词
$dictionaryEditor = new DictionaryEditor();
if (!$dictionaryEditor->addWord($path, $word)) {
echo $dictionaryEditor->getMessage();
}
[注意]:将单词添加到词典模板(.tpl
)不会像词典那样添加到模板的第一行中的单词数量,这是正确功能所必需的
[注意]:如果单词已在词典或模板中存在,则不会再次添加该单词,也不会生成异常,但 DictionaryEditor 类的消息属性将被设置
从词典/模板中删除单词
$dictionaryEditor = new DictionaryEditor();
if (!$dictionaryEditor->deleteWord($path, $word)) {
echo $dictionaryEditor->getMessage();
}
编辑词典/模板中的单词
$dictionaryEditor = new DictionaryEditor();
if (!$dictionaryEditor->editWord($path, $word, $modifiedWord)) {
echo $dictionaryEditor->getMessage();
}
[注意]:目标单词不能是已经存在的词典单词
列出单词
(new DictionaryEditor())->listWords($path);
高级用法
使用一个词典比在多个词典上执行 hunspell 要快得多。编辑语言词典有时不是一个好主意,因为添加/编辑的单词将在你升级时消失。与其直接编辑词典,不如使用模板,在那里存储你的单词,并从中生成词典。例如,如果你想升级语言词典(upgraded_en_GB.dic
),那么你可以保留一个语言词典(en_GB.dic
)和一个用于升级的模板(custom_words.tpl
)。当你更改模板文件时,你可以相对快速地更改缓存文件/文件中的目标单词 - 如 upgraded_en_GB.dic
文件 - 一样。这种实现可以通过多级扩展。
如果您希望将词典文件存储在项目文件夹中,您可以在 Hunspell 的源代码中更改默认文件夹路径(hunspell-master/src/tools/hunspell.cxx
),并重新编译它。