百度博客分享的多模匹配算法资料
1. 方法:
基于双数组实现Tried树
优点:
- 能节省大量空间占用
- 查询基于数组索引,速度非常快
- 不用像AC自动机一样还需构建fail指针,构建速度相对AC自动机要快,且可以快速删除或添加单词,保留一定的灵活性
缺点:
- 因为没有像AC自动机等算法进行穿线改进,故而全匹配算法需要回溯,性能有所下降
- 建树比非双数组结构的Tried树要慢
相关资料:
代码实现
https://github.com/Bond-H/dictmatch
1. 实现方法
纯Python实现,基于一个dict维护前缀树,性能不比AC自动机的实现差,同时节省大量空间占用
2. 性能评测
数据集 | 单词数 | 查询文本 |
---|---|---|
PKU | 5.5W | 1826448字 |
AS | 14.1W | 8368050字 |
Jieba | 58.4W | 4050566字 |
对比实现:
ahocorapy:纯Python实现的AC自动机
dmsearch:C++双数组实现的Tried树模型【上文百度博文中介绍的模型】
dictmatch:纯Python实现的基于单个dict的Tried树模型
词典装载性能(装载时间 秒)
数据集 | PKU | AS | jieba |
---|---|---|---|
单词数 | 5.5W | 14.1W | 58.4W |
ahocorapy | 3 | 20 | 354 |
dmsearch | 0.13 | 0.56 | 2.67 |
dictmatch | 0.05 | 0.14 | 0.60 |
词典查询性能(查询时间 秒)
数据集 | PKU | AS | jieba |
---|---|---|---|
ahocorapy | 1.0 | 5.4 | 9.27 |
dmsearch | 4.2 | 12.8 | 6.7 |
dictmatch | 1.4 | 6.7 | 3.5 |
内存占用
数据集 | PKU | AS | jieba |
---|---|---|---|
单词数 | 5.5W | 14.1W | 58.4W |
ahocorapy | 300M | 800M | 5G |
dmsearch | 1G | 1G | 2.5G |
dictmatch | 25M | 100M | 400M |