NLP(十三)中文分詞工具的使用嘗試

  本文將對三種中文分詞工具進行使用嘗試,這三種工具分別爲哈工大的LTP,結巴分詞以及北大的pkuseg。
  首先咱們先準備好環境,即須要安裝三個模塊:pyltp, jieba, pkuseg以及LTP的分詞模型文件cws.model。在用戶字典中添加如下5個詞語:python


少安
賀鳳英
F-35戰鬥機
埃達爾·阿勒坎

  測試的Python代碼以下:git

# -*- 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 對於第一句話,輸出結果以下:github

原文: 儘管玉亭成家之後,他老婆賀鳳英那些年把少安媽欺負上一回又一回,怕老婆的玉亭連一聲也不敢吭,但少安他媽不計較他。

ltp: ['儘管', '玉亭', '成家', '之後', ',', '他', '老婆', '賀鳳英', '那些', '年', '把', '少安', '媽', '欺負', '上', '一', '回', '又', '一', '回', ',', '怕', '老婆', '的', '玉亭', '連', '一', '聲', '也', '不', '敢', '吭', ',', '但', '少安', '他媽', '不', '計較', '他', '。']web

jieba: ['儘管', '玉亭', '成家', '之後', ',', '他', '老婆', '賀鳳英', '那些', '年', '把', '少安', '媽', '欺負', '上', '一回', '又', '一回', ',', '怕老婆', '的', '玉亭', '連', '一聲', '也', '不敢', '吭', ',', '但少安', '他媽', '不', '計較', '他', '。']算法

pkuseg: ['儘管', '玉亭', '成家', '之後', ',', '他', '老婆', '賀鳳英', '那些', '年', '把', '少安', '媽', '欺負', '上', '一', '回', '又', '一', '回', ',', '怕', '老婆', '的', '玉亭', '連', '一', '聲', '也', '不', '敢', '吭', ',', '但', '少安', '他媽', '不', '計較', '他', '。']微信

  對於第二句話,輸出結果以下:工具

原文: 據此前報道,以色列於去年5月成爲世界上第一個在實戰中使用F-35戰鬥機的國家。

ltp: ['據', '此前', '報道', ',', '以色列', '於', '去年', '5月', '成爲', '世界', '上', '第一', '個', '在', '實戰', '中', '使用', 'F-35', '戰鬥機', '的', '國家', '。']測試

jieba: ['據此', '前', '報道', ',', '以色列', '於', '去年', '5', '月', '成爲', '世界', '上', '第一個', '在', '實戰', '中', '使用', 'F', '-', '35', '戰鬥機', '的', '國家', '。'].net

pkuseg: ['據', '此前', '報道', ',', '以色列', '於', '去年', '5月', '成爲', '世界', '上', '第一', '個', '在', '實戰', '中', '使用', 'F-35戰鬥機', '的', '國家', '。']code

  對於第三句話,輸出結果以下:

原文: 小船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), 歡迎你們關注~
相關文章
相關標籤/搜索