iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
AI & Data

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

Day 8|詞性標註(POS Tagging)概念與實作(jieba、CKIP Tagger、spaCy)

  • 分享至 

  • xImage
  •  

引言

詞性標註 Part-of-Speech (POS) tagging 是 NLP 中非常基礎和重要的任務。POS tagging 的目的是為每個詞語標上它的語法類別,讓電腦可以理解一句話的語法結構。
可以想成我們先用斷詞,把一句話切成一小塊一小塊,然後在 POS tagging 的階段,為每一小塊賦予意義。


圖片來源:https://medium.com/programming-with-data/9-%E8%A9%9E%E6%80%A7%E6%A8%99%E8%A8%BB-part-of-speech-tagging-dab799fdf75d

POS tagging 的實際應用場景有:

  • 語法分析:幫助電腦理解句子的結構,例如:誰是主詞、誰是受詞
  • 信息提取:只抓取名詞、動詞或形容詞,可以快速抽出關鍵資訊
  • 下游應用:在問答系統、情感分析、機器翻譯等任務中,詞性標註是理解語意的重要基礎

今天的實作一樣會用 jieba、CKIP Tagger、spaCy,如果想知道這些工具在斷詞的用法可以參考前一篇 傳送門🚪

實作練習

我們今天使用的測試句子是:

text = "我愛寫論文,研究使我快樂"

這句話的小陷阱是在「研究」這兩個字。它可以當動詞用,但在這個句子裡是名詞,做後半段句子中的主語。我們就來看看下面這三個工具的表現如何吧~

1. jieba

  • 安裝 jieba 套件中的 posseg 功能
import jieba.posseg as pseg
output = pseg.cut(text)
print("jieba 詞性標註結果:")
for word, pos in output:
    print(f"{word} → {pos}")
# === Output ===
jieba 詞性標註結果:
我 → r
愛 → v
寫論 → v
文 → n
, → x
研究 → vn
使 → v
我 → r
快樂 → a
  • 把「寫論」切在一起,應該是「寫 (v) + 論文 (n)」
  • 「研究」標成 vn(動名詞),兼顧兩種詞性
  • 詞性標註類別比較粗糙

https://ithelp.ithome.com.tw/upload/images/20250920/20178719XnsnVF8AM4.png
圖片來源:https://github.com/fxsjy/jieba

2. CKIP Tagger

  • 需要使用到 ckiptagger 套件中的兩個模組:
    • WS: Word Segmentation 模組
    • POS: POS Tagging 模組
  • 先進行斷詞,在對斷完詞的結果做詞性標註
from ckiptagger import WS, POS
ws = WS("./data")
pos = POS("./data")

text_list = [text]

# 斷詞
output_ws = ws(text_list)
# POS 標註
output_pos = pos(output_ws)

print("CKIP Tagger 詞性標註結果:")
for word, pos in zip(output_ws, output_pos):
    for w, p in zip(word, pos):
        print(f"{w} → {p}")

可以參考 ckiplab/ckiptagger: POS Tags 去對照 tag 的意思

# === Output ===
CKIP Tagger 詞性標註結果:
我 → Nh
愛 → VL
寫 → VC
論文 → Na
, → COMMACATEGORY
研究 → VE
使 → VL
我 → Nh
快樂 → VH
  • 詞性標記細緻,動詞就有很多不同類別:
    • 「愛」(VL, 狀態謂賓動詞)
    • 「寫」(VC, 動作及物動詞)
    • 「研究」(VE, 動作句賓動詞) ,但「研究」應該是名詞
    • 「快樂」(VH, 狀態不及物動詞)

3. spaCy

  • 使用中文模型: zh_core_web_sm
import spacy
model = spacy.load("zh_core_web_sm")
doc = model(text)
print("spaCy 詞性標註結果:")
for token in doc:
    print(f"{token.text} → {token.pos_}")
# === Output ===
spaCy 詞性標註結果:
我 → PRON
愛寫 → VERB
論文 → NOUN
, → PUNCT
研究 → NOUN
使 → VERB
我 → PRON
快 → ADV
樂 → VERB
  • 「愛寫」被合併成一個動詞不太自然
  • 「研究」標為 NOUN(名詞)有符合語境
  • 「快」、「樂」被拆開

結語

透過今天的實作,我們看到中文詞性標註有存在著一些挑戰:

  • 分詞問題:如「寫論文」或「愛寫」,不同工具切法不同。
  • 多義詞問題:如「研究」既可以是動詞,也可以是名詞,詞性判斷依語境而不同。
  • 複合詞問題:如「快樂」會被拆開來標記。

今天使用的三個工具 jieba、CKIP、spaCy 也各自有一些限制跟不同的標註風格。理解它們差異與局限性也能讓我們在後續應用時,更知道要如何選擇適合的工具。

那麼「主題二:語料處理」的內容,就到今天告一段落啦!!
接下來我們會前進下一個主題:特徵與表示,來看看文字要怎麼轉換成電腦所理解的形式哦~

References


上一篇
Day 7|斷詞(下):中文斷詞工具實作(jieba、CKIP Tagger、spaCy)
系列文
讓電腦聽懂人話:30 天 NLP 入門8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言