源码: Github - pkuseg-python

作者: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. 默认模型在不同领域的测试效果

考虑到很多用户在尝试分词工具的时候,大多数时候会使用工具包自带模型测试.

为了直接对比“初始”性能, 比较了各个工具包的默认模型在不同领域的测试效果. 请注意,这样的比较只是为了说明默认情况下的效果,并不一定是公平的.

DefaultMSRACTB8PKUWEIBOAll Average
jieba81.4579.5881.8383.5681.61
THULAC85.5587.8492.2986.6588.08
pkuseg87.2991.7792.6893.4391.29

其中,All Average显示的是在所有测试集上F-score的平均.

4.2. 细领域训练及测试结果

以下是在不同数据集上的对比结果:

MSRAPrecisionRecallF-score
jieba87.0189.8888.42
THULAC95.6095.9195.71
pkuseg96.9496.8196.88
WEIBOPrecisionRecallF-score
jieba87.7987.5487.66
THULAC93.4092.4092.87
pkuseg93.7894.6594.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

Last modification:March 8th, 2019 at 04:05 pm