乐趣区

NLP十三中文分词工具的使用尝试

  本文将对三种中文分词工具进行使用尝试,这三种工具分别为哈工大的 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 年 ’, ‘,’, ‘ 埃达尔·阿勒坎 ’, ‘ 出生 ’, ‘ 在 ’, ‘ 土耳其 ’, ‘ 首都 ’, ‘ 安卡拉 ’, ‘,’, ‘ 但 ’, ‘ 他 ’, ‘ 的 ’, ‘ 求学 ’, ‘ 生涯 ’, ‘ 多 ’, ‘ 在 ’, ‘ 美国 ’, ‘ 度过 ’, ‘。’]

  接着,对以上的测试情况做一个简单的总结:

  1. 用户词典方面:LTP 和 pkuseg 的效果都很好,jieba 的表现不尽如人意,这主要是因为自定义的字典的词语里面含有标点符号,关于该问题的解决办法,可以参考网址:https://blog.csdn.net/weixin_42471956/article/details/80795534
  2. 从第二句话的效果来看,pkuseg 的分词效果应该是最好的,‘经’应该作为单个的词语切分出来,而 LTP 和 jieba 即使加了自定义词典,也没有效果,同理,‘F-35 战斗机’也是类似的情形。

  总的来说,三者的分词效果都很优秀,差距不是很大,但在自定义词典这块,无疑 pkuseg 的效果更加稳定些。笔者也会在以后的分词使用中多多考虑 pkuseg~
  有关 pkuseg 的介绍与使用,可以参考网址:https://github.com/lancopku/PKUSeg-python

注意:不妨了解下笔者的微信公众号:Python 爬虫与算法(微信号为:easy_web_scrape),欢迎大家关注~

退出移动版