NLP 自然語言處理 1-詞袋模型(Bag of Words)&TF-IDF

康韡瀚
Nov 28, 2022

--

為什麼需要將文字轉換成數字表達?

現今的資料分析方法,不能接受object型式的數據,若將純文字輸入製模型中,模型並無法處理及運算,需要透過資料前處理的方式處理,一般而言類別型資料可以透過Target Encoding、One-Hot-Encoding的方式將類別型資料轉換成數值資料。那文字資料又如何轉換成模型可以接受的資料呢?因此下文要介紹目前常見的方式,詞袋模型(Bag of Words Model, 簡稱BoW)。

詞袋模型(Bag of Words Model, 簡稱BoW)

Bag of Words,是自然語言最基礎且歷史悠久的模型之一,概念也很簡單,不需要透過太複雜的計算。Bag of Words的原理是將所有字詞整理出來,以沒有先後排列順序的方式,丟進一個集合(詞袋)中,形成一個詞彙庫,後續使用此種詞彙庫大概有以下三種方法:

(1) 將詞彙庫中所有字列出,並計算出現次數,概念如下圖:

Derek Liao

例如詞庫中有:(我:1,中午:2,去:2,學餐:1,吃:1,咖哩飯:1)

我中午吃咖哩飯。(斷詞)=>我/中午/吃/咖哩飯

(此句中沒有去還有學餐兩個字因此以0表示)

(2) 對詞彙庫所有字做One-Hot-Encoding

將所有字丟進去詞庫後,只要有在詞庫出現都標記為1

例如詞庫中有:(我,中午,去,學餐,吃,咖哩飯)

我中午吃咖哩飯。(斷詞)=>我/中午/吃/咖哩飯

(此句中沒有去還有學餐兩個字因此以0表示)

通過上述的方法,都可以將文字轉成數字向量,但是這樣的方法真的好用嗎?真的可以表達文字本身的意思嗎?答案是否定的

Bag of Words的缺點

容易遇到維度詛咒

上述句子,由於詞庫中只有六個詞,因此每一句話維度是1*6矩陣,但是若有10000個字,且文本中有10000句話呢?這樣會形成10000*10000矩陣,電腦的記憶體應該會十分悲劇的出現memory error。

向量表達過於稀疏

上述例子中可以看到,都會把詞袋中所有句子的字表現出來,文本沒有出現的字以0表示,但是文本總字數太多,且單一文本的長度不一,會造成向量中有大量的0出現,導致效率低落。例如:詞袋中有10000個字,但是有一個文本只有我/愛/西瓜,三個詞就會只有3個位置不是0,共有9997個0,這樣計算超級沒有效率!!!!

無法展現語意

前文提及Bag of Words的原理是將所有字詞整理出來,以沒有先後排列順序的方式,因此詞袋中排列的順序沒有任何意義,詞與詞之間的順序是被打亂的,兩個不同意思的句子可能會因為透過詞袋法的轉換後產生相同文字向量,例如 樂天桃園贏中信兄弟,中信兄弟贏樂天桃園,兩個截然不同意思的句子,卻因為包含相同的字,導致出現相同的文字向量。

TF-IDF

TF-IDF是一個常見的文字資料前處理方法,全名為Term Frequency-Inverse Document Frequency),顧名思義此法與詞頻有密切的關係。TF-IDF是一個用於資料檢索與文字探勘的加權技術,是一種簡單的統計方法,用來評估單詞在一份文件或是詞庫中的重要程度,常用於特徵提取,或者刪除贅字。

TF是處理每一個「文件」中所有「詞」的問題。
IDF是處理每一個「詞」在所有「文件」中的問題。

TF (Term Frequency,詞頻)

詞頻越高,該詞在特定文件中出現頻率越高

文本透過Tokenization技術,將每個單詞從文本中拆分開來列成矩陣,並算出所有單詞在文本中的出現次數。下圖的j是第j份文件,i是第j份文件中所有使用的單詞中的第i個單詞,n(i,j)是該單詞的出現次數,分母為所有文件j中文件中所有詞出現次數總和(總字數)。由上述方法就可以簡單算出每個詞在每個文件中出現的比率。

圖片來自Tommy Huang的medium

IDF (Inverse Document Frequency,逆向檔案頻率)

詞在所有文件出現的頻率越高,越不具代表性

出現頻率越高真的代表該詞越重要嗎?答案是否定的,中文與英文中常有大量的字本身不具有意義,但是出現頻繁,例如:的、is 、a、the。因此除了詞頻之外,還要透過逆向檔案頻率,過濾在每一份文件中都出現頻繁的字。

IDF的計算方法為:log( 總文件數量 / 包含該詞彙的文件數量 )

下圖的D是所有文件總數,若該data只有一份文件,也可以是總詞彙數,由公式可以看出,若一個詞在越多文件出現,IDF越小,代表這個詞就是上述提及的出現頻繁卻不具意義的字。

若一個文字data有100份文件,apple出現在10份文件中,apple的IDF就是log(100/10)

圖片來自Tommy Huang的medium

TF-IDF

圖片來自維基百科

TF-IDF除了考慮詞頻以外還考慮逆向檔案頻率,避免無意義的詞視為重要詞

例如’蘋果’在文件j中出現頻繁,TF會很高,但是’蘋果’在所有文件出現次數不高,IDF會很高,因此TF-IDF就會很高。

例如’的’在文j中出現頻繁TF會很高,但是’的’在所有文件出現次數也很高,IDF會很低,因此TF-IDF就不會很高。

圖片來自Tommy Huang的medium

綜合上述,TF-IDF如何應用在特徵提取呢?假設一份data有100份文件,總詞彙量有10000個,就會有一個100*10000的矩陣,但是這矩陣十分龐大,且具有稀疏性,因此可以透過TF-IDF保留一定的詞彙,達到矩陣縮小的目地。

下篇文章會介紹Word embedding解決Bag of Words不能展現語意的問題。

--

--