应用于Hugo的Algolia中文分词器

Posted by Naah on Monday, Oct 01,2018 18:49:57

因为使用Hugo进行搭建博客,由于静态化博客使用的是Algolia提供的索引服务。 而node.js中的插件hugo-algolia只能提供英文的分词效果,不支持中文分词。 所以只能自己造轮子,给自己写个分词器。

1 Java版本

GitHub地址

1.1 版本特点

  • 优点:速度快
  • 缺点:需要安装java环境

1.2 分词插件

该版本分词器使用了HanLP分词器

经过个人针对JAVA平台主流的中文分词器测试,HanLP是JAVA平台中portable分词效果最好,速度最快的中文分词器且功能强大(虽然我暂时用不上)

1.3 开发思路

  1. 通过线程池建立CPU核心数量的线程
  2. 将每个md文档作为一个任务进行多线程并发计算
  3. 使用CountDownLatch对线程任务进行协调
  4. 所有任务完成后将中文分词结果与英文分词结果放在Set中去重
  5. 通过fastjson进行序列化为json
  6. 将序列化的结果写入algolia.json

2 Go版本

GitHub地址

2.1 版本特点

  • 优点:移植性,下载后即可使用(目前提供mac版本,windwos可以下载源码自行打包)
  • 缺点:目前使用go版本的jieba分词器,速度和质量不太理想

2.2 分词插件

该版本分词器使用了Go版本的Jieba分词器

Go平台的中文分词器比较稀少,我主要测试了jieba分词器和sego分词器,go平台下的jieba分词器是portable分词的最优选,但是质量和速度距离java平台的HanLP差了很远。按理说go的执行效率是高于java的,希望作者后续可优化

2.3 开发思路

  1. 由于对go的语法不是很熟,所以对线程的处理为new新线程
  2. 将每个md文档创建一个新的线程进行异步处理
  3. 使用WaitGroup对线程任务进行协调
  4. 所有任务完成后将中文分词结果与英文分词结果放在Set中去重
  5. 通过encoding/json进行序列化为json
  6. 将序列化的结果写入algolia.json

2.4 GO语言吐槽

  1. 虽然效率高,移植性好,但是这个语法也太反人类了
  2. 语法中没有泛型的设计,使用interface代替,每次都要强转
  3. 使用名称进行权限控制,大写字母开头public,小写字母开头private
  4. 原生库支持不好,没提供set数据结构,没提供线程池
  5. 打包后文件太大。由于移植性好,就要付出代价,那就是依赖的库都要一起打包,需要加壳压缩