本文将对三种中文分词工具进行使用尝试,这三种工具分别为哈工大的 LTP,结巴分词以及北大的 pkuseg。
首先我们先准备好环境,即需要安装三个模块:pyltp, jieba, pkuseg 以及 LTP 的分词模型文件cws.model
。在用户字典中添加以下 5 个词语:
经
少安
贺凤英
F-35 战斗机
埃达尔·阿勒坎
测试的 Python 代码如下:
# -*- coding: utf-8 -*-
import os
import jieba
import pkuseg
from pyltp import Segmentor
lexicon = ['经', '少安', '贺凤英', 'F-35 战斗机', '埃达尔·阿勒坎'] # 自定义词典
# 哈工大 LTP 分词
def ltp_segment(sent):
# 加载文件
cws_model_path = os.path.join('data/cws.model') # 分词模型路径,模型名称为 `cws.model`
lexicon_path = os.path.join('data/lexicon.txt') # 参数 lexicon 是自定义词典的文件路径
segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)
words = list(segmentor.segment(sent))
segmentor.release()
return words
# 结巴分词
def jieba_cut(sent):
for word in lexicon:
jieba.add_word(word)
return list(jieba.cut(sent))
# pkuseg 分词
def pkuseg_cut(sent):
seg = pkuseg.pkuseg(user_dict=lexicon)
words = seg.cut(sent)
return words
sent = '尽管玉亭成家以后,他老婆贺凤英那些年把少安妈欺负上一回又一回,怕老婆的玉亭连一声也不敢吭,但少安他妈不计较他。'
#sent = '据此前报道,以色列于去年 5 月成为世界上第一个在实战中使用 F -35 战斗机的国家。'
#sent = '小船 4 月 8 日经长江前往小鸟岛。'
#sent = '1958 年,埃达尔·阿勒坎出生在土耳其首都安卡拉,但他的求学生涯多在美国度过。'
print('ltp:', ltp_segment(sent))
print('jieba:', jieba_cut(sent))
print('pkuseg:', pkuseg_cut(sent))
&emsp 对于第一句话,输出结果如下:
原文: 尽管玉亭成家以后,他老婆贺凤英那些年把少安妈欺负上一回又一回,怕老婆的玉亭连一声也不敢吭,但少安他妈不计较他。
ltp: [‘ 尽管 ’, ‘ 玉亭 ’, ‘ 成家 ’, ‘ 以后 ’, ‘,’, ‘ 他 ’, ‘ 老婆 ’, ‘ 贺凤英 ’, ‘ 那些 ’, ‘ 年 ’, ‘ 把 ’, ‘ 少安 ’, ‘ 妈 ’, ‘ 欺负 ’, ‘ 上 ’, ‘ 一 ’, ‘ 回 ’, ‘ 又 ’, ‘ 一 ’, ‘ 回 ’, ‘,’, ‘ 怕 ’, ‘ 老婆 ’, ‘ 的 ’, ‘ 玉亭 ’, ‘ 连 ’, ‘ 一 ’, ‘ 声 ’, ‘ 也 ’, ‘ 不 ’, ‘ 敢 ’, ‘ 吭 ’, ‘,’, ‘ 但 ’, ‘ 少安 ’, ‘ 他妈 ’, ‘ 不 ’, ‘ 计较 ’, ‘ 他 ’, ‘。’]
jieba: [‘ 尽管 ’, ‘ 玉亭 ’, ‘ 成家 ’, ‘ 以后 ’, ‘,’, ‘ 他 ’, ‘ 老婆 ’, ‘ 贺凤英 ’, ‘ 那些 ’, ‘ 年 ’, ‘ 把 ’, ‘ 少安 ’, ‘ 妈 ’, ‘ 欺负 ’, ‘ 上 ’, ‘ 一回 ’, ‘ 又 ’, ‘ 一回 ’, ‘,’, ‘ 怕老婆 ’, ‘ 的 ’, ‘ 玉亭 ’, ‘ 连 ’, ‘ 一声 ’, ‘ 也 ’, ‘ 不敢 ’, ‘ 吭 ’, ‘,’, ‘ 但少安 ’, ‘ 他妈 ’, ‘ 不 ’, ‘ 计较 ’, ‘ 他 ’, ‘。’]
pkuseg: [‘ 尽管 ’, ‘ 玉亭 ’, ‘ 成家 ’, ‘ 以后 ’, ‘,’, ‘ 他 ’, ‘ 老婆 ’, ‘ 贺凤英 ’, ‘ 那些 ’, ‘ 年 ’, ‘ 把 ’, ‘ 少安 ’, ‘ 妈 ’, ‘ 欺负 ’, ‘ 上 ’, ‘ 一 ’, ‘ 回 ’, ‘ 又 ’, ‘ 一 ’, ‘ 回 ’, ‘,’, ‘ 怕 ’, ‘ 老婆 ’, ‘ 的 ’, ‘ 玉亭 ’, ‘ 连 ’, ‘ 一 ’, ‘ 声 ’, ‘ 也 ’, ‘ 不 ’, ‘ 敢 ’, ‘ 吭 ’, ‘,’, ‘ 但 ’, ‘ 少安 ’, ‘ 他妈 ’, ‘ 不 ’, ‘ 计较 ’, ‘ 他 ’, ‘。’]
对于第二句话,输出结果如下:
原文: 据此前报道,以色列于去年 5 月成为世界上第一个在实战中使用 F -35 战斗机的国家。
ltp: [‘ 据 ’, ‘ 此前 ’, ‘ 报道 ’, ‘,’, ‘ 以色列 ’, ‘ 于 ’, ‘ 去年 ’, ‘5 月 ’, ‘ 成为 ’, ‘ 世界 ’, ‘ 上 ’, ‘ 第一 ’, ‘ 个 ’, ‘ 在 ’, ‘ 实战 ’, ‘ 中 ’, ‘ 使用 ’, ‘F-35’, ‘ 战斗机 ’, ‘ 的 ’, ‘ 国家 ’, ‘。’]
jieba: [‘ 据此 ’, ‘ 前 ’, ‘ 报道 ’, ‘,’, ‘ 以色列 ’, ‘ 于 ’, ‘ 去年 ’, ‘5’, ‘ 月 ’, ‘ 成为 ’, ‘ 世界 ’, ‘ 上 ’, ‘ 第一个 ’, ‘ 在 ’, ‘ 实战 ’, ‘ 中 ’, ‘ 使用 ’, ‘F’, ‘-‘, ’35’, ‘ 战斗机 ’, ‘ 的 ’, ‘ 国家 ’, ‘。’]
pkuseg: [‘ 据 ’, ‘ 此前 ’, ‘ 报道 ’, ‘,’, ‘ 以色列 ’, ‘ 于 ’, ‘ 去年 ’, ‘5 月 ’, ‘ 成为 ’, ‘ 世界 ’, ‘ 上 ’, ‘ 第一 ’, ‘ 个 ’, ‘ 在 ’, ‘ 实战 ’, ‘ 中 ’, ‘ 使用 ’, ‘F-35 战斗机 ’, ‘ 的 ’, ‘ 国家 ’, ‘。’]
对于第三句话,输出结果如下:
原文: 小船 4 月 8 日经长江前往小鸟岛。
ltp: [‘ 小船 ’, ‘4 月 ’, ‘8 日 ’, ‘ 经长江 ’, ‘ 前往 ’, ‘ 小鸟岛 ’, ‘。’]
jieba: [‘ 小船 ’, ‘4’, ‘ 月 ’, ‘8’, ‘ 日经 ’, ‘ 长江 ’, ‘ 前往 ’, ‘ 小 ’, ‘ 鸟岛 ’, ‘。’]
pkuseg: [‘ 小船 ’, ‘4 月 ’, ‘8 日 ’, ‘ 经 ’, ‘ 长江 ’, ‘ 前往 ’, ‘ 小鸟 ’, ‘ 岛 ’, ‘。’]
对于第四句话,输出结果如下:
原文: 1958 年,埃达尔·阿勒坎出生在土耳其首都安卡拉,但他的求学生涯多在美国度过。
ltp: [‘1958 年 ’, ‘,’, ‘ 埃达尔·阿勒坎 ’, ‘ 出生 ’, ‘ 在 ’, ‘ 土耳其 ’, ‘ 首都 ’, ‘ 安卡拉 ’, ‘,’, ‘ 但 ’, ‘ 他 ’, ‘ 的 ’, ‘ 求学 ’, ‘ 生涯 ’, ‘ 多 ’, ‘ 在 ’, ‘ 美国 ’, ‘ 度过 ’, ‘。’]
jieba: [‘1958’, ‘ 年 ’, ‘,’, ‘ 埃 ’, ‘ 达尔 ’, ‘·’, ‘ 阿勒 ’, ‘ 坎 ’, ‘ 出生 ’, ‘ 在 ’, ‘ 土耳其 ’, ‘ 首都 ’, ‘ 安卡拉 ’, ‘,’, ‘ 但 ’, ‘ 他 ’, ‘ 的 ’, ‘ 求学 ’, ‘ 生涯 ’, ‘ 多 ’, ‘ 在 ’, ‘ 美国 ’, ‘ 度过 ’, ‘。’]
pkuseg: [‘1958 年 ’, ‘,’, ‘ 埃达尔·阿勒坎 ’, ‘ 出生 ’, ‘ 在 ’, ‘ 土耳其 ’, ‘ 首都 ’, ‘ 安卡拉 ’, ‘,’, ‘ 但 ’, ‘ 他 ’, ‘ 的 ’, ‘ 求学 ’, ‘ 生涯 ’, ‘ 多 ’, ‘ 在 ’, ‘ 美国 ’, ‘ 度过 ’, ‘。’]
接着,对以上的测试情况做一个简单的总结:
- 用户词典方面:LTP 和 pkuseg 的效果都很好,jieba 的表现不尽如人意,这主要是因为自定义的字典的词语里面含有标点符号,关于该问题的解决办法,可以参考网址:https://blog.csdn.net/weixin_42471956/article/details/80795534
- 从第二句话的效果来看,pkuseg 的分词效果应该是最好的,‘经’应该作为单个的词语切分出来,而 LTP 和 jieba 即使加了自定义词典,也没有效果,同理,‘F-35 战斗机’也是类似的情形。
总的来说,三者的分词效果都很优秀,差距不是很大,但在自定义词典这块,无疑 pkuseg 的效果更加稳定些。笔者也会在以后的分词使用中多多考虑 pkuseg~
有关 pkuseg 的介绍与使用,可以参考网址:https://github.com/lancopku/PKUSeg-python
注意:不妨了解下笔者的微信公众号:Python 爬虫与算法(微信号为:easy_web_scrape),欢迎大家关注~