中文分词工具评估

栏目: Java · 发布时间: 5年前

内容简介:最近我们分享了一些关于分词的事情,对于琳琅满目的分词工具,我们到底该选择哪个呢?这里有一个Java开源项目

中文分词 <a href='https://www.codercto.com/tool.html'>工具</a> 评估

最近我们分享了一些关于分词的事情,对于琳琅满目的分词工具,我们到底该选择哪个呢?

这里有一个 Java 开源项目 cws_evaluation ,对中文分词做了评比,但有几点不足:(1). 只有java版本,但是机器学习主要是基于 python 的 (2).效果指标为行完美率和字完美率,该指标不妥,特别是句子越长,越无意义,(3). 每种分词工具评测的算法太多了,这里仅评比了默认的分词算法。

基于此,我做了一个java和python版本中文分词工具评比项目 chinese-segmentation-evaluation

项目简介

测试了java和python常见中文分词工具的效果和效率

java

Requirement

java8

步骤

  1. git clone https://github.com/tiandiweizun/nlp-evaluation.git
  2. cd nlp-evaluation/java
  3. (windows)   .\gradlew.bat build    (linux)   ./gradlew build
  4. java -Dfile.encoding=utf-8 -jar build/libs/nlp-evaluation-java-1.0.0.jar

说明

  1. java -jar nlp-evaluation-java-1.0.0.jar 有3个参数,可以执行 java -jar nlp-evaluation-java-1.0.0.jar -h 查看
    -i 分词文件,默认为data/seg.data_big文件,每行一个句子,每个词用空格分开,可以指定自己的测试集
    -o 分词结果存储路径,默认不存储
    -n 最大读取分词文件行数
    -c 需要评估的分词器名称,用英文逗号隔开,默认HanLP,jieba,thulac,示例: -c=HanLP
  2. 由于 斯坦福分词 效果一般,速度极慢,且模型巨大,在打包的时候已经排除(不影响在IDE里面测试), 打包如果要包含斯坦福分词,修改build.gradle,注释掉exclude(dependency('edu.stanford.nlp:stanford-corenlp'))
  3. 由于 WordAnsjJcsegMMSeg4j 存在bug(把词语拼接起来和原始句子不一样),在代码里面已经注释掉了,不进行测试。
  4. 依赖的库均存在于maven中心仓库,像庖丁、复旦分词等找不到的,这里没有测试

测试效果

总行数:2533709 总字符数:28374490

segmentor precision recall f1 speed(字符/ms)_windows speed(字符/ms)_linux
HanLP 0.900433 0.910614 0.905495 1034.470451 797.596346
jieba 0.852657 0.803263 0.827223 1774.181830 980.865943
thulac 0.884405 0.901930 0.893082 1449.749131 939.832732

经过多次测试发现,thulac在 linux 上速度不是特别稳定,最快与jiba差不多

开发者

  • 建议使用idea打开或者导入java目录,把data目录拷贝到java目录,直接可以运行SegEvaluation调试。
  • 可以打开stanford和其他分词器
  • 评测自定义分词器:继承Seg类并实现segment方法,添加到evaluators即可。

python

Requirement

Python:3
其他参见 requirements.txt

步骤

1. git clone https://github.com/tiandiweizun/nlp-evaluation.git
2. cd nlp-evaluation
3. pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
4. cd python/indi.tiandi.nlp.evaluation
5. python3 SegEvaluation.py

说明

  1. python3 SegEvaluation.py 有3个参数,可以执行 python3 SegEvaluation.py -h 查看
    -i 分词文件,默认为data/seg.data_big文件,每行一个句子,每个词用空格分开,可以指定自己的测试集
    -o 分词结果存储路径,默认不存储
    -n 最大读取分词文件行数,由于python速度太慢,建议设置
    -c 需要评估的分词器名称,用英文逗号隔开,默认pkuseg,jieba_fast,thulac
  2. pynlpir 存在bug(把词语拼接起来和原始句子不一样), pyltp 在windows上不易安装,这里都没有进行测试,比较慢的也没有测试

测试效果

总行数:2533709 总字符数:28374490

segmentor precision recall f1 speed(字符/ms)_windows speed(字符/ms)_linux
pkuseg 0.890170 0.886405 0.888284 34.077104 19.826954
jieba 0.855293 0.808204 0.831082 169.651694 104.554222
jieba_fast 0.855299 0.808182 0.831073 408.241520 203.815985
thulac 0.848839 0.883031 0.865597 28.831738 16.565779
pyltp 0.894885 0.908761 0.901770 --------- 52.371131
snownlp 0.811029 0.864835 0.837069 --------- 1.947430

开发者

  • 建议使用pycharm打开python目录,即可运行
  • 如果需要使用pynlpir,需要修改pynlpir_path的安装目录
  • 如果需要使用pyltp,需要修改ltp_data_dir的模型分词目录
  • 评测自定义分词器:只要实现segment方法和向evaluators追加即可。

总结

  • 性能:java 远高于python,至少差了一个数量级。
  • 效果:对于jieba和thulac,在python和java上表现的不同,需要更多的时间去寻找原因,且java的thulac4j非官方提供。
  • 数据:默认数据集来源于 cws_evaluation ,该项目为评估中文分词的性能与效果,对于效果该项目采用的是行完美率这个指标,但是对于长句,这个指标会变的不合适,如果不同算法的错误率不一样,但是如果有一个错的词,会导致整个句子都是错的,不能很好的区分算法的precision

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法学

算法学

哈雷尔 / 霍红卫 / 高等教育 / 2007-6 / 39.00元

本书主要论述计算机科学的基本概念、思想、方法和结果。全书内容由 5个部分组成。“预备知识”部分包括算法学中的基本概念、算法结构、算法所操纵的数据以及描述算法所用的程序设计语言。“方法和分析”部分包括算法设计的方法、算法的正确性和效率、评价算法的方法。“局限性和健壮性”部分包括可执行算法的固有局限性以及实现这些算法的计算机的固有局限性、不可计算性和不可判定性、算法学的通用性及其健壮性。此外,还讨论了......一起来看看 《算法学》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具