文字探勘 Python

自 序

Chapter 01 Python 簡介


1-1 何謂程式設計
1-2 Python 程式設計的特點
1-3 選擇 Python 作為第一種程式語言的理由
1-4 安裝Python 與環境設定
1-5 安裝編輯器:Visual Studio Code
1-6 建置Anaconda 開發環境

Chapter 02 資料型態
2-1 Python 處理的資料類型
2-2 數值型態
2-3 字串型態
2-4 變數
2-5 數值和字串間型態的轉換

Chapter 03 流程控制
3-1 流程控制的構成要素
3-2 條件分岐
3-3 input 函式
3-4 條件運算式的組成
3-5 多向的條件分岐

Chapter 04 串列與迴圈
4-1 串列的意義與操作
4-2 for 迴圈
4-3 for 迴圈和if 敘述的組合運用
4-4 range() 函式
4-5 亂數的運用
4-6 break 及continue 命令
4-7 while 迴圈
4-8 進階串列操作

Chapter 05 元組、字典與集合
5-1 元組
5-2 字典
5-3 集合

Chapter 06 函式
6-1 函式的意義
6-2 函式的參數
6-3 函式與變數的作用範圍

Chapter 07 錯誤與例外
7-1 錯誤的型態
7-2 例外
7-3 例外處理
7-4 錯誤的種類

Chapter 08 網頁爬蟲的簡單範例
8-1 網頁爬蟲(Web Scraping)
8-2 網路爬蟲的執行步驟
8-3 向網路伺服器發送請求服務的訊息
8-4 解析網頁資訊
8-5 BeautifulSoup 的運用:於自由時報電子報網站進行爬蟲

Chapter 09 向伺服器發送請求的方式
9-1 網頁爬蟲的基本步驟
9-2 送出簡單的GET 請求
9-3 送出帶有參數的GET 請求
9-4 送出帶有參數的GET 請求至Ajax 網頁
9-5 送出帶有Cookie 的GET 請求
9-6 送出帶有Headers 的GET 請求
9-7 以form 形式發送POST 請求
9-8 送出帶有登入Cookie 的POST 請求
9-9 模擬登入

Chapter 10 萃取有用資訊
10-1 網頁萃取的工作內容
10-2 本章所使用的範例網頁
10-3 走訪DOM 文件樹
10-4 搜尋DOM 文件樹
10-5 CSS 選擇器

Chapter 11 爬取「PChome 24h 購物」的商品資料
11-1 PChome 24h 購物網站
11-2 確認標的網站的URL 網址
11-3 送出 HTTP 請求,取得頁面資料(JSON 格式)
11-4 解析結果頁面資料,獲取商品資訊
11-5 將商品詳細資料,存入Excel 檔案中
11-6 建立主程式

Chapter 12 爬取「Google 學術搜尋」的論文資料
12-1 確認標的網站的URL 網址
12-2 送出HTTP 請求,取得搜尋結果頁面資料
12-3 取得各分頁的連結url
12-4 解析分頁資料,獲取分頁內的論文資料
12-5 彙總所有分頁的論文資料
12-6 將論文詳細資料,存入Excel 檔案中
12-7 建立主程式
12-8 執行爬蟲程式
12-9 使用平行處理技術
12-10 有關爬取Google 學術搜尋的結語

Chapter 13 爬取「PTT 八卦版」的PO 文資料
13-1 確認標的網站的URL 網址
13-2 送出HTTP 請求,取得頁面資料
13-3 取得八卦版目前總頁數
13-4 取得各分頁的連結url
13-5 取得各分頁中的PO 文標題
13-6 彙總所有分頁的PO 文標題
13-7 取得每篇PO 文之發言內容
13-8 彙整所有PO 文的相關資訊
13-9 將PO 文的詳細資料,存入Excel 檔案中
13-10 建立主程式

Chapter 14 書籍比價爬蟲
14-1 確認標的網站的URL 網址
14-2 送出HTTP 請求,取得頁面資料
14-3 取得搜尋結果的總頁數
14-4 取得各分頁的連結
14-5 取得每本書的詳細資料
14-6 取得每本書於誠品、金石堂的價格
14-7 取得分頁中各書籍的其它基本資料與比價資料
14-8 彙整所有書籍資料
14-9 將書籍比價資料,存入Excel 檔案中
14-10 建立主程式

Chapter 15 製作文字雲
15-1 簡介
15-2 建立主程式
15-3 取得所有PO 文的發言內容
15-4 繪製文字雲
15-5 繪製長條圖

在正式介紹 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 !!