分词背景介绍

       不管在平时的实验还是比赛中,NLP的绝大多数任务(情感分析、阅读理解、对话系统、文本分类、信息抽取、机器翻译等等)都需要在词的基础上进行。因此,中文分词作为这些任务的底层任务之一,一定程度上决定了这些任务的上限。通常我们在英文中使用空格分隔,但是在中文中就有很大的不同,其难点在中文的歧义现象以及一些新词汇的出现(如一些网络词汇)。本文将介绍当前主流的分词工具及其用法,并在icwb2数据集上做一个小实验,验证分词工具的性能,最后得出各分词工具的优缺点。

安装及介绍(jieba、hanlp、pkuseg、thulac、snownlp、nlpir)

       当下主流的分词工具一般分为jieba、hanlp、pkuseg、thulac、snownlp、nlpir几种,其运行环境通常划分为windows与linux,下面分别介绍。

windowst系统分词工具安装

  1. jieba
pip3 install jieba 

在安装速度极其慢的情况下,如果你未安装代理,最好使用pip的清华源,如果你想要更换安装源,请移步更换安装源如果你不想切换,可以添加参数(下同)

-i https://pypi.tuna.tsinghua.edu.cn/simple 
  1. hanlp
pip3 install hanlp

如安装出错,请移步windows hanlp安装问题
3. pkuseg

pip3 install pkuseg
  1. thulac
pip3 install thulac
  1. snownlp
pip3 install snownlp
  1. nlpir
pip3 install pynlpir

安装错误,请移步错误分析及其解决方案

Linux系统分词工具安装

  1. jieba
sudo pip3 install jieba 

在安装速度极其慢的情况下,如果你未安装代理,最好使用pip的清华源,如果你想要更换安装源,请移步更换安装源如果你不想切换,可以添加参数(下同)

-i https://pypi.tuna.tsinghua.edu.cn/simple 
  1. hanlp
sudo pip3 install hanlp
  1. pkuseg
sudo pip3 install pkuseg
  1. thulac
sudo pip3 install thulac
  1. snownlp
sudo pip3 install snownlp
  1. nlpir
sudo pip3 install pynlpir
安装错误,请移步[错误分析及其解决方案](https://blog.csdn.net/ykf173/article/details/105601612)。

使用方法介绍

  1. jieba
# encoding=utf-8
import jieba

jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for string in strs:
    seg_list = jieba.cut(string,use_paddle=True) # 使用paddle模式
    print("Paddle Mode: " + '/'.join(list(seg_list)))

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
  1. hanlp
import hanlp
han_tokenizer = hanlp.load('PKU_NAME_MERGED_SIX_MONTHS_CONVSEG')
sentences = ['萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。',
               '上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。',
               'HanLP支援臺灣正體、香港繁體,具有新詞辨識能力的中文斷詞系統']
print(tokenizer(sentences))
  1. pkuseg
# pkuseg分词
# pkuseg.pkuseg(model_name="default", user_dict="default", postag=False)
# model_name
# 模型路径。
# "default",默认参数,表示使用我们预训练好的混合领域模型(仅对pip下载的用户)。
# "news", 使用新闻领域模型。
# "web", 使用网络领域模型。
# "medicine", 使用医药领域模型。
# "tourism", 使用旅游领域模型。
# model_path, 从用户指定路径加载模型。
# user_dict
# 设置用户词典。
# "default", 默认参数,使用我们提供的词典。
# None, 不使用词典。
# dict_path, 在使用默认词典的同时会额外使用用户自定义词典,可以填自己的用户词典的路径,词典格式为一行一个词。
# postag
# 是否进行词性分析。
# False, 默认参数,只进行分词,不进行词性标注。
# True, 会在分词的同时进行词性标注。
import pkuseg
sentence = '萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。'
seg = pkuseg.pkuseg(postag=False)  # 以默认配置加载模型,不进行词性分析
sentence = seg.cut(sentence)  # 进行分词
print(' '.join(sentence))
  1. thulac
import thulac
sentence = '萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。'
#seg_only设置词性标注与否,deli设置分词以后以什么分隔
thu = thulac.thulac(seg_only=True, deli=' ')
text = thu.cut(sentence, text=True)
print('thulac分词:', sentence)
  1. snownlp
import snownlp
sentence = '萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。'
sentence = SnowNLP(sentence).words
print(' '.join(sentence))
  1. nlpir
# -*- coding: utf-8 -*-
import pynlpir
sentence = '萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。'
pynlpir.open()
#pos_tagging:是否进行词性标注
tag_seg = pynlpir.segment(sentence, pos_tagging=False)
print('pynlpir分词:',tag_seg)
tag_word = pynlpir.segment(sentence, pos_tagging=True)
print('pynlpir词性标注:',tag_word)
pynlpir.close()

数据集介绍

  使用The Second International Chinese Word Segmentation Bakeoff in SIGHAN 2005 Workshop (Emerson, 2005)提供的数据集icwb2-data. 提取码:yyke

icwb2 包含4个数据集,繁体中文数据集2个:AS, CityU; 简体中文数据集2个:PK, MSR.
icwb2数据集

评价指标

F1-Score
真实: 共同 创造 美好 的 新 世纪 —— 二○○一年 新年 贺词
预测: 共同 创造 美 好 的 新 世纪 —— 二○○一年 新年 贺词

Precision = 9 / 11 = 0.818
Recall = 9 / 10 = 0.9
F1 = 0.857

实验结果及比较

笔者从F1-score及时间效率两个方面进行了比较

表1:中文分词工具分词F1性能比较

在这里插入图片描述

表2:中文分词工具分词时间比较

在这里插入图片描述

时间表格中各单位秒(s),分(m),时(h)

结论

  从分词性能上来说,hanlp与pkuseg两大工具取得了极其优异的效果,但是耗费时间太多,因此作为NLP底层的分词工具,并不是可靠的工具。但是值得一提的是,这两个工具可以作为针对专业领域中文分词的分词工具。
  从时间与分词性能的综合角度来看,thulac与jieba分词工具性能虽然不是最好,但是其耗费的时间却是最少的。对于大多数以中文分词作为底层工作的NLP任务,这两个工具应该作为首选。

github项目地址

参考文献

[1]https://www.cnblogs.com/maxxu11/p/12615112.html
[2]https://chinesenlp.xyz/#/zh/docs/word_segmentation

Logo

更多推荐