昨天我們談到 Tokenization 跟 Segmentation 的差異,知道了拆文字有很多種方式:字、詞、子詞。
在中文裡,因為是以字(Character)為單位,又沒有空格,最常見的任務就是要把句子切成詞語(Word)。
今天會介紹三個常見的工具:
讓我們看看它們各自的表現差異!
我們先準備兩個句子作為測試文字:
text_1 "校長說胸前除了徽章別別別的"
text_2 = "啦啦隊隊長長痘痘"
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 全模式: ['校', '長', '說', '胸前', '除了', '徽章', '別', '別', '別', '的']
pip install -U ckiptagger
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 分詞結果: [['校長', '說', '胸', '前', '除了', '徽章', '別別', '別', '的'], ['啦啦隊隊長長', '痘痘']]
pip install spacy
python -m spacy download zh_core_web_sm
Doc
物件,裡面會包含:
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 | |
---|---|---|---|
校長說胸前除了徽章別別別的 | ['校長', '說', '胸前', '除了', '徽章', '別別', '別', '的'] |
['校長', '說', '胸', '前', '除了', '徽章', '別別', '別', '的'] |
['校長', '說胸', '前', '除了', '徽章', '別', '別別', '的'] |
啦啦隊隊長長痘痘 | ['啦', '啦', '隊隊', '長', '長', '痘痘'] |
['啦啦隊隊長長', '痘痘'] |
['啦', '啦', '隊', '隊長', '長痘', '痘'] |
總而言之,這兩句好像還是太為難它們了哈哈,中文真是博大精深
大家也可以想一些有趣的句子來測試看看這些斷詞工具的表現哦~