iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
自我挑戰組

NLP 新手的 30 天入門養成計畫系列 第 4

[Day 4] - 掌握文本前處理基本功:斷詞 & 去除停用詞

  • 分享至 

  • xImage
  •  

今天是介紹文本前處理的第二篇,我們要來聊聊非常重要的斷詞 ( Tokenization )。

我們平常書寫文章都是用一串完整的句子,譬如:

I recently watched a popular Korean drama called “The Glory”.

句子的本質就是由許多有意義的單詞排列組合而成,用來表達更明確的意圖,然而對於電腦而言卻做不到這件事,因為句子這種型態的資料太複雜了,需要對每一個單詞的意思、詞性以及語法結構甚至上下文都先解析過,才能通盤了解。

既然沒辦法直接讓電腦直接看懂句子的話,那我們就退一步,先讓電腦從看懂單詞開始,也因此才需要介紹斷詞。

Tokenization

從語言的角度來看,單詞 ( word ) 可以說是擁有語意的最小單位,字元 ( character ) 當然更小,但是它並不能單獨有意義的存在,所以我們還是會選擇將句子切割成單詞讓電腦可以處理。

在 NLP 中,我們把這些被切割出來的最小單位叫做詞條 ( token ),而把句子切成很多個 tokens 的動作叫做斷詞 ( Tokenization ):

Tokenization is the process of breaking down a piece of text into small units called tokens. A token may be a word, part of a word or just characters like punctuation.

不過,不要覺得斷詞就很簡單,我們來舉一個例子:

  1. I recently watched a popular Korean drama called “The Glory”.
  2. 我最近看了一部很受歡迎的韓劇《黑暗榮耀》。

最直觀的作法就是利用 python 的 split() 切割,然而英文可以這樣做,中文卻不行,正如同我們在 Day2 提到的例子,我 / 最 / 近 的切割方式是不對的,我 / 最近 才符合中文用法。

因此,在開發斷詞器 ( tokenizer ) 需要考量的部分還有很多,不過已經有很多現成好用的斷詞工具,比方說 NLTK、Spcay 等等,我們先用 Spacy 在 Colab 上做一個簡單的練習:

!pip install -U spacy
!python -m spacy download en_core_web_sm
import spacy

nlp = spacy.load('en_core_web_sm')
sentence = nlp("I recently watched a popular Korean drama called “The Glory”.")
print([token.text for token in sentence])
['I', 'recently', 'watched', 'a', 'popular', 'Korean', 'drama', 'called', '“', 'The', 'Glory', '”', '.']

昨天的新聞也同樣可以用 Spacy 做斷詞哦!

對於中文來說,我們比較常聽到的大概就是 jieba 或是中研院開發的 CKIP,以 jieba 為例:

!pip install git+https://github.com/APCLab/jieba-tw.git
import jieba

temp = "我最近看了一部很受歡迎的韓劇《黑暗榮耀》。"
seg_list = jieba.cut(temp, cut_all = False)
print(list(seg_list))
['我', '最近', '看', '了', '一部', '很', '受', '歡迎', '的', '韓劇', '《', '黑暗', '榮耀', '》', '。']

可以看到中文的斷詞相較於英文麻煩了一些,不過 jieba 的表現依然相當不錯。

Remove Stop Words

當我們對一個完整的句子做完斷詞之後,下一步可以去除停用詞 ( Stop Words )。

停用詞的意思就是句子中不太重要,且刪去後不影響閱讀的單詞,比方說 atheis 等等。

我們拿昨天的處理後的新聞來對比一下吧,這是原本的文章:

"""taipei taiwan news  taiwans badminton duo on sunday aug 4 captured the countrys first olympic gold in the paris olympics and are the first taiwanese shuttlers to win backtoback olympic golds in the mens badminton doubles finals lee yang  and wang chilin ..."""

然後,我們用 Spacy 去除停用詞,因為原本字串有多餘的空格,所以額外寫了一行處理:

import spacy

nlp = spacy.load("en_core_web_sm")
content = " ".join(content.split())
doc = nlp(content)
content = [token.text for token in doc if not token.is_stop]
result = " ".join(content)
print(result)

這是去除停用詞後的結果:

"""taipei taiwan news taiwans badminton duo sunday aug 4 captured countrys olympic gold paris olympics taiwanese shuttlers win backtoback olympic golds mens badminton doubles finals lee yang wang chilin"""

仔細閱讀後會發現,移除停用詞之後的文本篇幅縮水了一些,有一些像是 onthe 之類的單詞被移除了,然而整體並不影響閱讀。

那麼為什麼要這樣做呢?

Remove stop words 的目的是就要去除雜訊,這個概念和之前提到移除標點符號的想法類似,因為在一篇文章中,這些沒有意義的單詞佔據了很高的比例,而我們真正關注的只是那些數量不多但非常重要的關鍵字,比方說 parisolympicsgold 等等。

另一個優點是,在移除停用詞之後,文章篇幅也變小了,有利於後續進行其他 NLP 任務的時候工作量不會太重,能夠更有效率的處理更重要的單詞。

今天就先到這邊吧,明天還有其他也值得聊聊的文本前處理方式要介紹!

推薦文章
What is Tokenization in Natural Language Processing (NLP)?
What are Stop words in NLP and Why we should remove them? - Wisdom ML


上一篇
[Day 3] - 掌握文本前處理基本功:爬蟲 & 字串處理
下一篇
[Day 5] - 掌握文本前處理基本功:詞幹提取 & 詞形還原
系列文
NLP 新手的 30 天入門養成計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言