作者:Ruixuan Luo (罗睿轩), Jingjing Xu(许晶晶), Xuancheng Ren(任宣丞), Yi Zhang(张艺), Bingzhen Wei(位冰镇), Xu Sun (孙栩)
北大开源的多领域中文分词工具.
目前工具包支持新闻领域分词、网络领域分词、旅游领域分词、医药领域分词、混合领域分词.
1. 主要技术
pkuseg-python 主要基于经典的 CRF 模型,辅以 ADF训练方法(Sun, et al., 2012)和精调的特征,实现更快的训练速度、更高的测试效果和更好的泛化能力:
[1] - 在CRF模型中,特征选取对分词结果和分词性能有着不小的影响,获得一套效果好、泛化能力较强、分词速度适中的特征往往需要耗费大量时间. 该开源代码中包含了这样一套精调的特征,在领域内的训练和测试表明,pkuseg 使用的特征可以有效提升不同语料的测试集上的效果.
[2] - ADF训练方法则可以加快训练速度和收敛效果,为DIY用户、希望自己训练模型的用户提供较好的训练体验.
2. 主要亮点
[1] - 多领域分词
不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型. 根据待分词文本的领域特点,用户可以自由地选择不同的模型.
目前支持了新闻领域,网络领域,医药领域,旅游领域,以及混合领域的分词预训练模型. 在使用中,如果用户明确待分词的领域,可加载对应的模型进行分词. 如果用户无法确定具体领域,推荐使用在混合领域上训练的通用模型.
各领域分词样例如:
# 医药领域分词示例:
医生 工具 通常 包括 病历 管理 、 药品 信息 查询 、 临床 指南 、 前沿 的 医学 资讯 .
医联 平台 : 包括 挂号 预约 查看 院内 信息 化验单 等 , 目前 出现 与 微信 、 支付宝 结合的 趋势 .
甲状腺功能减退症 简称 甲减 , 是 甲状腺 制造 的 甲状腺激素 过少 而 引发 的疾病 .
# 旅游领域分词示例:
在 这里 可以 俯瞰 维多利亚港 的 香港岛 , 九龙 半岛 两岸 , 美景 无敌 .
以往 去 香港 都 是 去 旺角 尖沙咀 中环 等等 闹市 地区 .
初 至 重庆 , 我 就 来到 了 洪崖洞 , 在 这里 , 旧时 城墙 、 吊脚楼 仿 若 镶嵌 在 现代 钢筋 水泥 城市 间 的 一 枚 朴玉 .
首都 机场 提供 了 手机 值机 、 自助 值机 、 自助 行李 托运 、 自助 通关 等 多种 便捷 举措 .
# 网络领域分词示例:
视频 中 , 胡可 负责 录制 , 沙溢 则 带 着 安吉 和 小鱼儿 坐在 沙发 上 唱 着 《 学猫 叫 》 , 小鱼儿 还 争 着 要 坐在 C位 , 一家人 其乐融融
【 这是 我 的 世界 , 你 还 未 见 过 】 欢迎 来 参加 我 的 演唱会 听点 音乐
被 全家 套路 的 小鱼儿 也 太 可怜 了 : 我 要求 C位 ! ! 我 不要 唱 “ 喵喵喵 ” 结果 七 秒 记忆 又 继续 唱 了 起来 哈哈 哈哈 哈哈 哈哈
# 新闻领域分词示例:
乌克兰 一直 想 加入 北约 , 并 不断 的 按照 西方 国家 的 要求 “ 改造 ” 自己 , 据 乌克兰 之 声 2月20日 报道 称 , 乌克兰 政府 正式 通过 最新 《 宪法 修正案 》 , 正式 确定 乌克兰 将 加入 北约 作为 重要 国家 方针 , 该 法 强调 , " 这项 法律 将 于 发布 次日 起 生效 " .
美国广播公司 网站 2月20日 报道 称 , 特朗普 19日 在 推特 上 写 道 : “ 正如 我 预测 的 那样 , 主要 由 开放 边界 的 民主党 人和 激进 左派 主导 的 16个 州 已经 在 第九巡回法院 提起 诉讼 . ” 他 不 忘 讽刺 加州 : “ 加州 已 在 失控 的 高铁 项目 上 浪费 了 数十亿美元 , 完全 没有 完成 的 希望 .
[2] - 更高的分词准确率
相比于其他的分词工具包,当使用相同的训练数据和测试数据,pkuseg可以取得更高的分词准确率.
[3] - 支持用户自训练模型
支持用户使用全新的标注数据进行训练.
[4] - 支持词性标注
3. 编译安装
# 自带默认模型
pip3 install pkuseg -i https://pypi.tuna.tsinghua.edu.cn/simple # 安装
# 建议升级到最新版本
pip3 install -U pkuseg -i https://pypi.tuna.tsinghua.edu.cn/simple # 升级
模型下载路径:
4. 各分词工具包性能对比
选择jieba、THULAC等国内代表分词工具包与pkuseg做性能比较.
选择Linux作为测试环境,在新闻数据(MSRA)、混合型文本(CTB8)、网络文本(WEIBO)数据上对不同工具包进行了准确率测试.
使用了第二届国际汉语分词评测比赛提供的分词评价脚本. 其中MSRA与WEIBO使用标准训练集测试集划分,CTB8采用随机划分. 对于不同的分词工具包,训练测试数据的划分都是一致的;即所有的分词工具包都在相同的训练集上训练,在相同的测试集上测试. 对于所有数据集,pkuseg使用了不使用词典的训练和测试接口.
以下是pkuseg训练和测试代码示例:
pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models')
pkuseg.test('msr_test.raw', 'output.txt', user_dict=None)
4.1. 默认模型在不同领域的测试效果
考虑到很多用户在尝试分词工具的时候,大多数时候会使用工具包自带模型测试.
为了直接对比“初始”性能, 比较了各个工具包的默认模型在不同领域的测试效果. 请注意,这样的比较只是为了说明默认情况下的效果,并不一定是公平的.
Default | MSRA | CTB8 | PKU | All Average | |
---|---|---|---|---|---|
jieba | 81.45 | 79.58 | 81.83 | 83.56 | 81.61 |
THULAC | 85.55 | 87.84 | 92.29 | 86.65 | 88.08 |
pkuseg | 87.29 | 91.77 | 92.68 | 93.43 | 91.29 |
其中,All Average
显示的是在所有测试集上F-score的平均.
4.2. 细领域训练及测试结果
以下是在不同数据集上的对比结果:
MSRA | Precision | Recall | F-score |
---|---|---|---|
jieba | 87.01 | 89.88 | 88.42 |
THULAC | 95.60 | 95.91 | 95.71 |
pkuseg | 96.94 | 96.81 | 96.88 |
Precision | Recall | F-score | |
---|---|---|---|
jieba | 87.79 | 87.54 | 87.66 |
THULAC | 93.40 | 92.40 | 92.87 |
pkuseg | 93.78 | 94.65 | 94.21 |
5. 使用说明
代码示例仅适用于python3.
5.1. 默认分词(推荐)
import pkuseg
seg = pkuseg.pkuseg() # 以默认配置加载模型
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
5.2. 细领域分词
在使用中,如果用户明确待分词的领域,可加载对应的模型进行分词. 如果用户无法确定具体领域,推荐使用在混合领域上训练的通用模型.
import pkuseg
seg = pkuseg.pkuseg(model_name='medicine') # 会自动下载所对应的细领域模型
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
5.3. 分词同时标注词性
各词性标签的详细含义:
n 名词
t 时间词
s 处所词
f 方位词
m 数词
q 量词
b 区别词
r 代词
v 动词
a 形容词
z 状态词
d 副词
p 介词
c 连词
u 助词
y 语气词
e 叹词
o 拟声词
i 成语
l 习惯用语
j 简称
h 前接成分
k 后接成分
g 语素
x 非语素字
w 标点符号
nr 人名
ns 地名
nt 机构名称
nx 外文字符
nz 其它专名
vd 副动词
vn 名动词
vx 形式动词
ad 副形词
an 名形词
import pkuseg
seg = pkuseg.pkuseg(postag=True) # 开启词性标注功能
text = seg.cut('我爱北京天安门') # 进行分词和词性标注
print(text)
5.4. 对文件分词
import pkuseg
# 对input.txt的文件分词输出到output.txt中
# 开20个进程
pkuseg.test('input.txt', 'output.txt', nthread=20)
5.5. 额外使用用户自定义词典
import pkuseg
# 给定用户词典为当前目录下的"my_dict.txt"
# 每一行为一个词
seg = pkuseg.pkuseg(user_dict='my_dict.txt')
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
5.6. 使用自训练模型分词
以CTB8模型为例:
import pkuseg
# 假设已下载好ctb8的模型并放在了'./ctb8'目录下,
# 通过设置model_name加载该模型
seg = pkuseg.pkuseg(model_name='./ctb8')
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
5.7. 训练新模型
模型随机初始化:
import pkuseg
# 训练文件为'msr_training.utf8'
# 测试文件为'msr_test_gold.utf8'
# 训练好的模型存到'./models'目录下
# 训练模式下会保存最后一轮模型作为最终模型
# 目前仅支持utf-8编码,训练集和测试集要求所有单词以单个或多个空格分开
pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models')
5.8. fine-tune 模型训练
从预加载的模型继续训练:
import pkuseg
# 训练文件为'train.txt'
# 测试文件为'test.txt'
# 加载'./pretrained'目录下的模型,训练好的模型保存在'./models',训练10轮
pkuseg.train('train.txt', 'test.txt', './models',
train_iter=10, init_model='./pretrained')
6. 参数说明
6.1. 模型配置
pkuseg.pkuseg(model_name = "default",
user_dict = "default",
postag = False)
[1] - model_name: 模型路径
"default",默认参数,表示使用我们预训练好的混合领域模型(仅对pip下载的用户).
"news", 使用新闻领域模型.
"web", 使用网络领域模型.
"medicine", 使用医药领域模型.
"tourism", 使用旅游领域模型.
model_path, 从用户指定路径加载模型.
[2] - user_dict: 设置用户词典
"default", 默认参数,使用我们提供的词典.
None, 不使用词典.
dict_path, 在使用默认词典的同时会额外使用用户自定义词典,可以填自己的用户词典的路径,词典格式为一行一个词.
[3] - postag: 是否进行词性分析
False, 默认参数,只进行分词,不进行词性标注.
True, 会在分词的同时进行词性标注.
6.2. 对文件进行分词
pkuseg.test(readFile,
outputFile,
model_name = "default",
user_dict = "default",
postag = False,
nthread = 10)
[1] - readFile: 输入文件路径
[2] - outputFile: 输出文件路径
[3] - model_name: 模型路径
[4] - user_dict: 设置用户词典
[5] - postag: 设置是否开启词性分析功能
[6] - nthread: 测试时开的进程数
6.3. 模型训练
pkuseg.train(trainFile,
testFile,
savedir,
train_iter = 20,
init_model = None)
[1] - trainFile: 训练文件路径
[2] - testFile: 测试文件路径
[3] - savedir: 训练模型的保存路径
[4] - train_iter: 训练轮数
[5] - init_model: 初始化模型,默认为None表示使用默认初始化,用户可以填自己想要初始化的模型的路径如init_model='./models/'
6.4. 多进程分词
当将以上代码示例置于文件中运行时,如涉及多进程功能,请务必使用if __name__ == '__main__'
保护全局语句,如:mp.py
文件:
import pkuseg
if __name__ == '__main__':
pkuseg.test('input.txt', 'output.txt', nthread=20)
pkuseg.train('msr_training.utf8',
'msr_test_gold.utf8',
'./models',
nthread=20)
运行:
python3 mp.py
在Windows平台上,请当文件足够大时再使用多进程分词功能,详见关于多进程速度问题.
7. 预训练模型
采用pip安装,在使用细领域分词功能时,只需要设置model_name字段为对应的领域即可,会自动下载对应的细领域模型.
以下是对预训练模型的说明:
- news: 在MSRA(新闻语料)上训练的模型.
- web: 在微博(网络文本语料)上训练的模型.
- medicine: 在医药领域上训练的模型.
- tourism: 在旅游领域上训练的模型.
- mixed: 混合数据集训练的通用模型. 随pip包附带的是此模型.
欢迎更多用户可以分享自己训练好的细分领域模型.
8. 相关论文
[1] - Fast Online Training with Frequency-Adaptive Learning Rates for Chinese Word Segmentation and New Word Detection. ACL. 253–262. 2012