文件探勘(Text Mining) — 把文字用數字表示

蘇靖軒 Jenson
企鵝也懂程式設計
5 min readMay 5, 2020

在正式介紹 Text Mining 的演算法前,我們先來談談如何把文字表示成數字

為什麼要用數字表示呢?因為電腦只能理解數字,不論在後續的演算法處理,亦或是近期火紅的深度學習,都必須使用數字來表示文字,讓電腦讀懂意涵,畢竟電腦還是看不懂文字的!

這裡用一個最簡單的例子來理解,如何把文字編碼成數字:

以下有三個句子 (已經做好斷詞處理)

1. 我 愛 吃 香蕉
2. 我 愛 吃 蘋果
3. 香蕉 好 吃

我們抓出上面兩個句子中不重複的詞,就是所謂的 bag-of-word (詞袋, BOW),就像把詞都丟到袋子裡一樣,我們就會得到有五個詞在我們的袋子裡 (這裡用Python的list表示)

["我", "愛", "吃", "香蕉", "蘋果", "好"]

其中所有的文檔裡面,總共只有六個單詞,因此每個單詞就可以用長度為6的一維向量(vector)去表示

  • 註:一維向量在Python用list來表示
# 長度為3的一維向量(vector)
vector = ["1", "2", "3"]

以下是每個文字的向量表示,也某種程度的把文字轉換成數字了

我:[1, 0, 0, 0, 0, 0]  # 因為“我”在詞袋中在第一個位置,因此擺上1
愛:[0, 1, 0, 0, 0, 0]
吃:[0, 0, 1, 0, 0, 0]
香蕉:[0, 0, 0, 1, 0, 0]
蘋果:[0, 0, 0, 0, 1, 0]
好:[0, 0, 0, 0, 0, 1]

假設現在有一個句子是 “吃蘋果”,經過斷詞後,這個句子就可以被編碼成

# 吃 蘋果
[[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0]]

以上的文字編碼方式稱為 One-Hot Encoding (獨熱編碼),是很簡單將文字轉換成數字的方式!

這時,敏銳的你發現到了,這只是給他一個編號而已呀,純粹代表這個詞有在文檔中出現過!好像也沒抽取到什麼特徵!

也許我們嘗試著找一些特徵,看看怎麼來編碼他…

也許…這個詞在文件中出現的次數,好像可以當作一個特徵呦!

這次我們採用 詞袋模型 (Bag-of-Word) 編碼

首先拿出剛剛的詞袋,並統計一下每個詞在所有句子中出現的次數,也就是計算詞頻(word frequecy, wf),然後把詞依照詞頻大小去排序,並給他一個索引(index)

  • 計算詞頻
{"我": 2, "愛": 2, "吃": 3, "香蕉": 2, "蘋果": 1, "好": 1}
  • 詞依照詞頻大小去排序,並給他一個索引(index),也就是給他一個流水號
{"吃": 0, "我": 1, "愛": 2, "香蕉": 3, "蘋果": 4, "好": 5}

其中這個索引(index),就表示向量陣列中的第index位置,並在這個index填上1,表示這個詞在句子中有出現

以”蘋果”這個詞為例,索引為4,因此在陣列中(向量長度與詞袋長度相同) index為4的地方填上1來表示這個詞

# 蘋果
[0, 0, 0, 0, 1, 0]

“蘋果好吃,我愛吃” 這句來說,句子會被編碼成

# 蘋果 好 吃 我 愛 吃
[2, 1, 1, 0, 1, 1]
''' 解析一下句子編碼怎麼運作的
輪次 詞 句子向量
0 [0, 0, 0 ,0, 0, 0] -> 準備好跟詞袋長度一樣的向量list,並都填上0
1 蘋果 [0, 0, 0, 0, 1, 0] -> "蘋果"的index=4
2 好 [0, 0, 0, 0, 1, 1]
3 吃 [1, 0, 0, 0, 1, 1]
4 我 [1, 1, 0, 0, 1, 1]
5 愛 [1, 1, 1, 0, 1, 1]
6 吃 [2, 1, 1, 0, 1, 1]
'''

這樣一來,我們好像就有稍微考慮到詞出現的頻率當作特徵,進而把句子進行編碼!不過當然還有很大的改進空間

先來稍微總結一下 One-Hot Encoding (獨熱編碼)詞袋模型 (Bag-of-Word) 編碼 的特點跟缺點

  1. One-Hot Encoding (獨熱編碼)

特點:

  • 詞向量的長度是詞袋的長度(不重複詞的數量)
  • 向量中出現的字為1,其餘都是0
  • 編碼後的文檔會是 稀疏矩陣 (sparse matrix) (即矩陣中會有很多0,可能會浪費很多記憶體跟計算資源)

缺點:

  • 編碼只能反應這個詞有在文檔中出現過
  • 編碼不能反映詞的重要程度

2. 詞袋模型 (Bag-of-Word) 編碼

特點:

  • 詞向量的長度是詞袋的長度(不重複詞的數量)
  • 目標是針對文檔進行編碼
  • 相較於 one-hot encoding,有考慮到詞的出現程度

缺點:

  • 忽略了詞的位置訊息。如”我吃蘋果”跟”蘋果吃我”,兩句的編碼會一樣,但是意思卻截然不同!
  • 只統計了出現程度,但不知道詞的重要程度。通常一個長篇的文檔中可能會出現很多”我”、”你”之類的常用詞,這樣就無法區分較少出現的”關鍵詞”在文檔中的重要程度

了解基本的文字的數字表示法後

接下來的文章會介紹許多文字中特徵抽取的演算法

喜歡的話請留下您的clap clap !!

--

--

蘇靖軒 Jenson
企鵝也懂程式設計

鵝肝前端佐後端風味醬汁,少許資料分析點綴,人生的擺盤,done