pkuseg 多领域中文分词工具

 

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. 编译安装

  • 目前仅支持python3
  • 新版本发布:2019-1-23
    • 修改了词典处理方法,扩充了词典,分词效果有提升
    • 效率进行了优化,测试速度较之前版本提升9倍左右
    • 增加了在大规模混合数据集训练的通用模型,并将其设为默认使用模型
  • 新版本发布:2019-1-30
    • 支持fine-tune训练(从预加载的模型继续训练),支持设定训练轮数
  • 新版本发布:2019-2-20
    • 支持词性标注,增加了医疗、旅游细领域模型
  • 为了获得好的效果和速度,强烈建议大家通过pip install更新到目前的最新版本

1、通过PyPI安装(自带模型文件):

  pip3 install pkuseg

  之后通过import pkuseg来引用
  建议更新到最新版本以获得更好的开箱体验
    pip3 install -U pkuseg
2、如果PyPI官方源下载速度不理想,建议使用镜像源,比如:
  初次安装
  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pkuseg
  更新
  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U pkuseg
注意:安装方式一和二目前仅支持linux,mac,windows 64 位的python3.5,python 3.6,python 3.7版本。
 
3、如果不使用pip安装方式,选择从GitHub下载,可运行以下命令安装
  python setup.py build_ext -i
GitHub的代码并不包括预训练模型,因此需要用户自行下载或训练模型,预训练模型可详见release。使用时需设定"model_name"为模型文件。

4. 各分词工具包性能对比

我们选择jieba、THULAC等国内代表分词工具包与pkuseg做性能比较。

考虑到jieba分词和THULAC工具包等并没有提供细领域的预训练模型,为了便于比较,我们重新使用它们提供的训练接口在细领域的数据集上进行训练,用训练得到的模型进行中文分词。

我们选择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)

细领域训练及测试结果

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

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

DefaultMSRACTB8PKUWEIBOAll 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. 细领域训练及测试结果

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

MSRAPrecisionRecallF-score
jieba 87.01 89.88 88.42
THULAC 95.60 95.91 95.71
pkuseg 96.94 96.81 96.88
WEIBOPrecisionRecallF-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. 分词同时进行词性标注,各词性标签的详细含义可参考 tags.txt

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
seg = pkuseg.pkuseg(user_dict='my_dict.txt')  # 给定用户词典为当前目录下的"my_dict.txt"
text = seg.cut('我爱北京天安门')                # 进行分词
print(text)
5.6. 额外使用用户自定义词典
import pkuseg
seg = pkuseg.pkuseg(model_name='./ctb8')  # 假设用户已经下载好了ctb8的模型并放在了'./ctb8'目录下,通过设置model_name加载该模型
text = seg.cut('我爱北京天安门')            # 进行分词
print(text)
5.7:训练新模型 (模型随机初始化)
import pkuseg
 
# 训练文件为'train.txt'
# 测试文件为'test.txt'
# 加载'./pretrained'目录下的模型,训练好的模型保存在'./models',训练10轮
pkuseg.train('train.txt''test.txt''./models', train_iter=10, init_model='./pretrained')
 

参数说明

模型配置

 

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, 会在分词的同时进行词性标注。
 
对文件进行分词
 
pkuseg.test(readFile, outputFile, model_name = "default", user_dict = "default", postag = False, nthread = 10)
    readFile        输入文件路径。
    outputFile      输出文件路径。
    model_name      模型路径。同pkuseg.pkuseg
    user_dict       设置用户词典。同pkuseg.pkuseg
    postag          设置是否开启词性分析功能。同pkuseg.pkuseg
    nthread         测试时开的进程数。
 
模型训练
pkuseg.train(trainFile, testFile, savedir, train_iter = 20, init_model = None)
    trainFile       训练文件路径。
    testFile        测试文件路径。
    savedir         训练模型的保存路径。
    train_iter      训练轮数。
    init_model      初始化模型,默认为None表示使用默认初始化,用户可以填自己想要初始化的模型的路径如init_model='./models/'
 

多进程分词

 

当将以上代码示例置于文件中运行时,如涉及多进程功能,请务必使用if __name__ == '__main__'保护全局语句,如:
mp.py文件

1
2
3
4
5
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

详见无法使用多进程分词和训练功能,提示RuntimeError和BrokenPipeError

在Windows平台上,请当文件足够大时再使用多进程分词功能,详见关于多进程速度问题

预训练模型

从pip安装的用户在使用细领域分词功能时,只需要设置model_name字段为对应的领域即可,会自动下载对应的细领域模型。

从github下载的用户则需要自己下载对应的预训练模型,并设置model_name字段为预训练模型路径。预训练模型可以在release部分下载。以下是对预训练模型的说明:

  • news: 在MSRA(新闻语料)上训练的模型。

  • web: 在微博(网络文本语料)上训练的模型。

  • medicine: 在医药领域上训练的模型。

  • tourism: 在旅游领域上训练的模型。

  • mixed: 混合数据集训练的通用模型。随pip包附带的是此模型。

欢迎更多用户可以分享自己训练好的细分领域模型

 

版本历史

  • v0.0.11(2019-01-09)
    • 修订默认配置:CTB8作为默认模型,不使用词典
  • v0.0.14(2019-01-23)
    • 修改了词典处理方法,扩充了词典,分词效果有提升
    • 效率进行了优化,测试速度较之前版本提升9倍左右
    • 增加了在大规模混合数据集训练的通用模型,并将其设为默认使用模型
  • v0.0.15(2019-01-30)
    • 支持fine-tune训练(从预加载的模型继续训练),支持设定训练轮数
  • v0.0.18(2019-02-20)
    • 支持词性标注,增加了医疗、旅游两个细领域模型

开源协议

  1. 本代码采用MIT许可证。
  2. 欢迎对该工具包提出任何宝贵意见和建议,请发邮件至jingjingxu@pku.edu.cn

 

posted @ 2019-07-03 08:44  李罡  Views(2035)  Comments(0Edit  收藏  举报