iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
AI & Data

讓電腦聽懂人話:30 天 NLP 入門系列 第 7

Day 7|斷詞(下):中文斷詞工具實作(jieba、CKIP Tagger、spaCy)

  • 分享至 

  • xImage
  •  

引言

昨天我們談到 Tokenization 跟 Segmentation 的差異,知道了拆文字有很多種方式:字、詞、子詞。
在中文裡,因為是以字(Character)為單位,又沒有空格,最常見的任務就是要把句子切成詞語(Word)。

今天會介紹三個常見的工具:

  1. jieba:Python 生態圈最常見的中文斷詞工具
  2. CKIP Tagger:中研院的斷詞系統,精準度高,專門為繁體中文設計
  3. spaCy:國際上常用的 NLP 套件,也能處理中文,但效果要看使用的模型

讓我們看看它們各自的表現差異!

實作練習

我們先準備兩個句子作為測試文字:

text_1 "校長說胸前除了徽章別別別的"
text_2 = "啦啦隊隊長長痘痘"

1. jieba

  • 安裝jieba套件
  • jieba.lcut()是回傳「列表」(list)的形式
import jieba
output = jieba.lcut(text_1)
print("jieba 分詞結果:", output)
# === Output 1 ====
jieba 分詞結果: ['校長', '說', '胸前', '除了', '徽章', '別別', '別', '的']

# === Output 2 ====
jieba 分詞結果: ['啦', '啦', '隊隊', '長', '長', '痘痘']
  • jieba.cut()是回傳「生成器」(generator)的形式
  • 如果要看列表的結果要用list()
  • 可以分成兩種模式
    • 精確模式:切出最精確、最合理的詞
    • 全模式:切出句子中所有可能的詞
# 精確模式
tokens = jieba.cut(text_1, cut_all=False)
print("jieba 精確模式:", list(tokens))

# 全模式
tokens_all = jieba.cut(text_1, cut_all=True)
print("jieba 全模式:", list(tokens_all))
# === Output ===
jieba 精確模式: ['校長', '說', '胸前', '除了', '徽章', '別別', '別', '的']
jieba 全模式: ['校', '長', '說', '胸前', '除了', '徽章', '別', '別', '別', '的']

2. CKIP Tagger

  • 先安裝 ckiptagger
pip install -U ckiptagger
  • 從 ckiptagger 套件匯入需要的模組
    • data_utils: 下載模型資料的工具
    • WS: Word Segmentation 模組
  • 下載 CKIP 斷詞需要的模型檔案,並初始化斷詞物件
  • CKIP Tagger 規定要輸入一個「list of sentences」,所以可以把要斷詞的句子一起丟進去
from ckiptagger import data_utils, WS

data_utils.download_data_gdown("./")
ws = WS("./data") 

text_list = [text_1, text_2]

output = ws(text_list)
print("CKIP Tagger 分詞結果:", output)
# === Output ===
CKIP Tagger 分詞結果: [['校長', '說', '胸', '前', '除了', '徽章', '別別', '別', '的'], ['啦啦隊隊長長', '痘痘']]

3. spaCy

  • 安裝 spaCy
  • 下載中文小型模型(zh_core_web_sm)
pip install spacy
python -m spacy download zh_core_web_sm
  • 模型處理過後會是一個特殊的Doc 物件,裡面會包含:
    • 斷詞後的 tokens
    • 詞性標註 (POS)
    • 命名實體 (Name Entity)
import spacy
model = spacy.load("zh_core_web_sm")

doc = model(text_1)
print(type(doc))

tokens = [token.text for token in doc]
print("spaCy 分詞結果:", tokens)
# === Output 1===
<class 'spacy.tokens.doc.Doc'>
spaCy 分詞結果: ['校長', '說胸', '前', '除了', '徽章', '別', '別別', '的']

# === Output 2===
<class 'spacy.tokens.doc.Doc'>
spaCy 分詞結果: ['啦', '啦', '隊', '隊長', '長痘', '痘']

結語

最後我們用下面的表格來比對一下不同工具在這兩句話的斷詞表現:

jieba CKIP Tagger spaCy
校長說胸前除了徽章別別別的 ['校長', '說', '胸前', '除了', '徽章', '別別', '別', '的'] ['校長', '說', '胸', '前', '除了', '徽章', '別別', '別', '的'] ['校長', '說胸', '前', '除了', '徽章', '別', '別別', '的']
啦啦隊隊長長痘痘 ['啦', '啦', '隊隊', '長', '長', '痘痘'] ['啦啦隊隊長長', '痘痘'] ['啦', '啦', '隊', '隊長', '長痘', '痘']
  • jieba:操作簡易而且斷詞效果還不錯,但還是有斷錯的地方。
  • CKIP Tagger:第一句斷得比較精,但第二句不太會斷反而就不斷了。
  • spaCy:第一句斷錯了前兩個沒斷錯的,雖然在中文斷詞上並不是強項,但表現尚可。

總而言之,這兩句好像還是太為難它們了哈哈,中文真是博大精深
大家也可以想一些有趣的句子來測試看看這些斷詞工具的表現哦~

References


上一篇
Day 6|斷詞(上):Tokenization / Segmentation?
下一篇
Day 8|詞性標註(POS Tagging)概念與實作(jieba、CKIP Tagger、spaCy)
系列文
讓電腦聽懂人話:30 天 NLP 入門8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言