JamSpell
JamSpell 是一个拼写检查库,具有以下功能:
- 准确 - 它考虑到单词周围的上下文以进行更好的纠正
- 快速 - 每秒接近5000个单词
- 多语言 - 它用 C++ 编写,可通过 swig 绑定支持多种语言
JamSpellPro
jamspell.com - 查看新版本的 Jamspell,具有以下功能:
- 改进的准确性(catboost 梯度提升决策树候选排序模型)
- 拆分合并的单词
- 许多语言的预训练模型(小,中,大):
en, ru, de, fr, it, es, tr, uk, pl, nl, pt, hi, no
- 运行时添加单词/句子的能力
- 微调/额外训练
- 大型模型训练的内存优化
- 支持静态字典
- 内置
Java, C#, Ruby
支持 - 支持 Windows
内容
基准测试
错误率 | Top 7 错误率 | 修正率 | Top 7 修正率 | 损坏率 | 速度 (单词/秒) | |
JamSpell | 3.25% | 1.27% | 79.53% | 84.10% | 0.64% | 4854 |
Norvig | 7.62% | 5.00% | 46.58% | 66.51% | 0.69% | 395 |
Hunspell | 13.10% | 10.33% | 47.52% | 68.56% | 7.14% | 163 |
Dummy | 13.14% | 13.14% | 0.00% | 0.00% | 0.00% | - |
模型在30万维基百科句子+30万新闻句子(英语)上训练了。 95%用于训练,5%用于评估。错误模型用于生成有错误的文本。JamSpell 纠正器与 Norvig 的纠正器、Hunspell 和一个简单的纠正器(无纠正)进行了比较。
我们使用以下指标:
- 错误率 - 拼写检查处理后仍有错误的单词百分比
- Top 7 错误率 - 未出现在前7名候选项中的单词百分比
- 修正率 - 拼写检查器修正的错误单词百分比
- Top 7 修正率 - 被前7名候选项之一修正的错误单词百分比
- 损坏率 - 被拼写检查器损坏的无错误单词百分比
- 速度 - 每秒处理的单词数
为了确保我们的模型在维基百科+新闻上不过度拟合,我们在“福尔摩斯探案集”文本上进行了检查:
错误率 | Top 7 错误率 | 修正率 | Top 7 修正率 | 损坏率 | 速度 (单词/秒) | |
JamSpell | 3.56% | 1.27% | 72.03% | 79.73% | 0.50% | 5524 |
Norvig | 7.60% | 5.30% | 35.43% | 56.06% | 0.45% | 647 |
Hunspell | 9.36% | 6.44% | 39.61% | 65.77% | 2.95% | 284 |
Dummy | 11.16% | 11.16% | 0.00% | 0.00% | 0.00% | - |
有关重现更多详细信息,请参见 "Train" 部分。
用法
Python
-
安装
swig3
(通常在您的发行版包管理器中) -
安装
jamspell
:
pip install jamspell
import jamspell
corrector = jamspell.TSpellCorrector()
corrector.LoadLangModel('en.bin')
corrector.FixFragment('I am the begt spell cherken!')
# u'I am the best spell checker!'
corrector.GetCandidates(['i', 'am', 'the', 'begt', 'spell', 'cherken'], 3)
# (u'best', u'beat', u'belt', u'bet', u'bent', ... )
corrector.GetCandidates(['i', 'am', 'the', 'begt', 'spell', 'cherken'], 5)
# (u'checker', u'chicken', u'checked', u'wherein', u'coherent', ...)
C++
-
将
jamspell
和contrib
目录添加到您的项目中 -
使用:
#include <jamspell/spell_corrector.hpp>
int main(int argc, const char** argv) {
NJamSpell::TSpellCorrector corrector;
corrector.LoadLangModel("model.bin");
corrector.FixFragment(L"I am the begt spell cherken!");
// "I am the best spell checker!"
corrector.GetCandidates({L"i", L"am", L"the", L"begt", L"spell", L"cherken"}, 3);
// "best", "beat", "belt", "bet", "bent", ... )
corrector.GetCandidates({L"i", L"am", L"the", L"begt", L"spell", L"cherken"}, 3);
// "checker", "chicken", "checked", "wherein", "coherent", ... )
return 0;
}
其他语言
您可以使用 swig 教程 生成其他语言的扩展。swig 的接口文件是 jamspell.i
。欢迎提交带有构建脚本的拉取请求。
HTTP API
-
安装
cmake
-
克隆并构建 jamspell(它包含 http 服务器):
git clone https://github.com/bakwc/JamSpell.git
cd JamSpell
mkdir build
cd build
cmake ..
make
./web_server/web_server en.bin localhost 8080
- GET 请求示例:
$ curl "http://localhost:8080/fix?text=I am the begt spell cherken"
I am the best spell checker
- POST 请求示例
$ curl -d "I am the begt spell cherken" http://localhost:8080/fix
I am the best spell checker
- 候选示例
curl "http://localhost:8080/candidates?text=I am the begt spell cherken"
# 或
curl -d "I am the begt spell cherken" http://localhost:8080/candidates
{
"results": [
{
"candidates": [
"best",
"beat",
"belt",
"bet",
"bent",
"beet",
"beit"
],
"len": 4,
"pos_from": 9
},
{
"candidates": [
"checker",
"chicken",
"checked",
"wherein",
"coherent",
"cheered",
"cherokee"
],
"len": 7,
"pos_from": 20
}
]
}
这里的 pos_from
- 错误拼写单词的首字母位置,len
- 错误拼写单词的长度
训练
要训练自定义模型,您需要:
-
安装
cmake
-
克隆并构建 jamspell:
git clone https://github.com/bakwc/JamSpell.git
cd JamSpell
mkdir build
cd build
cmake ..
make
-
准备一个包含训练句子的 utf-8 文本文件(例如
sherlockholmes.txt
)和另一个包含语言字母表的文件(例如alphabet_en.txt
) -
训练模型:
./main/jamspell train ../test_data/alphabet_en.txt ../test_data/sherlockholmes.txt model_sherlock.bin
- 要评估拼写检查器,您可以使用
evaluate/evaluate.py
脚本:
python evaluate/evaluate.py -a alphabet_file.txt -jsp your_model.bin -mx 50000 your_test_data.txt
- 您可以使用
evaluate/generate_dataset.py
生成训练/测试数据。它支持 txt 文件、Leipzig Corpora Collection 格式和 fb2 书籍。
下载模型
这里有一些简单的模型。它们在30万新闻+30万维基百科句子上训练了。我们强烈建议您至少在几百万句子上训练您自己的模型,以获得更好的质量。请参阅上面的Train部分。