各位早安~ 昨天我們介紹了在自然語言處理中必要的第一步,就是對對資料進行預處理,
並跟各位說了如何用正規表達處理我們資料中想留或不想留的東西,
我相信正規表達式可能對沒接觸過的朋友來說相對比較複雜一點,不過沒關係!熟能生巧,只要多多練習,一定會越來越上手滴~
那今天要來介紹的是另一個在資料預處理時也是不可缺少的步驟,那就是對資料進行「斷詞」(segmentation)
那什麼是斷詞勒?
其實說白一點,就是根據你的任務,將句子拆分成有意義的單位,將資料中的「詞」給分出來,
什麼意思呢?
假設今天我們有一個句子" He likes to eat apple "
,對我們人類來說,我們一眼就能看出這句話由He / likes / to / eat / apple
這五個詞組成。
但對電腦來說,原始資料只是一長串字元: He likes to eat apple
。
想一下另一個中文句子:結婚的和尚未結婚的人
這句話應該不只有一個意思吧xd, 他可以是
有沒有發現!因為語言通常是「帶有歧異的」,如果我們總是將整句話、整串資料餵給電腦,他會非常難消化,很難去抓取其中的資訊,也因此會影響到後續模型的訓練結果,所以一般我們幾乎都會先斷詞拉!
那中文跟英文在自然語言處理中處理斷詞的方法,使用的套件會不太一樣,英文我們同常會用NLTK
套件來幫忙
中文目前最常使用的是jieba
和 CKIP
。
英文相對比中文好斷詞,因為英文在詞跟詞中間通常會有空格去斷開,但中文不會有(中文真的是一個很複雜的語言🤯),所以中文在斷詞上一直是個值得研究的課題喔!
那就廢話不多說,先來看看英文斷詞我們會如何實作吧!
假設我們今天有一個句子sentence = "He likes to eat apples."
我們想根據空格,將這段文字進行斷詞,可以用nltk 中 的 word_tokenize
import nltk
from nltk.tokenize import word_tokenize
# 第一次使用需要先下載斷詞模型:
nltk.download('punkt')
print(word_tokenize(sentence))
輸出結果
['He', 'likes', 'to', 'eat', 'apples', '.']
word_tokenize
會自動把句子依照空白和標點拆開,
讓我們得到一個個英文單詞和標點符號。
可能有些人會問,那為何不用 split() 就好,有這個疑問的朋,可以試試看用NLTK 套件跟split() 斷"I'm pretty beautiful" 看看會發生什麼事🙂↕️
除了斷詞外,NLTK 還有非~~~常多的功能,畢竟他的全名就是 Natural Language Toolkit,是一個工具箱碼xd 所以裡面還有非常多的功能,像是他也可以算詞頻:
# 斷詞
words = word_tokenize(sentence)
# 計算詞頻
from nltk import FreqDist
freq = FreqDist(words)
print(freq.most_common())
輸出結果
[('He', 1), ('likes', 1), ('to', 1), ('eat', 1), ('apples', 1), ('.', 1)]
FreqDist()
會自動計算每個單字出現的次數,most_common()
會依出現次數排序並回傳結果。
如果只想看出現次數,也可以這樣取值:
print(freq['apples'])
print(freq['likes'])
輸出結果
1
1
大家也可以讀自己的檔案然後去玩玩看!
好拉今天就先介紹英文斷詞,明天我們會講中文斷詞常用的工具jieba 還有停用詞(stop words)是什麼!
我們就明天見拉~