斷詞

jieba 是一個用於中文斷詞的 (Python) 套件。jiebaR 則是 jieba 的 R 版本。

使用 jiebaR 進行斷詞只須兩個步驟:

  1. 使用 worker() 初始化斷詞設定
  2. 使用 segment() 將文字斷詞

使用 data frame 建立語料庫

我們的目標是建立一個 data frame 儲存文本資料。在這個 data frame 中,每一個 row 代表一篇文章,每個變項 (column) 記錄著該篇文章的某個資訊。根據文本資料的來源,該 data frame 可能會有不同數量的變項,例如,「文章發表日期」、「作者」、「標題」、「主題」等。但最重要的是,此 data frame 至少需具備兩個變項 — 「文章 id」與「(斷完詞的) 文章內文」。下方使用一個簡單的例子 (3 篇文章) 說明如何建立這種 data frame。

tidytext framework

  • tidytext 套件是 R 生態圈中比較近期的 text mining 套件,它將 tidyverse 的想法運用到文本資料處理上,換言之,就是使用 data frame 的資料結構去表徵和處理文本資料。

  • 使用 tidytext 的方法處理文本資料有好有壞。
    • 好處是使用者能輕易地結合 dplyrggplot2 於文本分析中,因而能快速地視覺化文本資料。
    • 壞處是,在 tidytext framework 之下,文章的內部 (i.e. 詞彙與詞彙之間的) 結構會消失,因為它對於文本的想法是 bag-of-words

      tidytext 所倡導的儲存文本資料的格式是 one-token-per-document-per-row,亦即,在一個 data frame 中,每一橫列 (row) 是一篇文章中的一個 token。因此,若有兩篇文章,第一篇被斷成 38 個詞彙,第二篇被斷成 20 個詞彙,則共需要一個 58 列 (row) 的 data frame 來儲存這兩篇文章。

  • 一般而言,tidytext 的架構適合用於與詞頻有關的分析,例如,計算文章的 lexical diversity 或是透過情緒詞的詞頻進行情緒分析。

  • 透過 tidytext::unnest_tokens(),可以將 docs_df 中儲存之 (已斷詞) 文本資料,變成 tidytext format,i.e.,one-token-per-document-per-row 的 data frame:

    #> # A tibble: 139 x 2
    #>    doc_id word 
    #>     <int> <chr>
    #>  1      1 蝴蝶 
    #>  2      1 和   
    #>  3      1 蜜蜂 
    #>  4      1 們   
    #>  5      1 帶   
    #>  6      1 著   
    #>  7      1 花朵 
    #>  8      1 的   
    #>  9      1 蜜糖 
    #> 10      1 回來 
    #> # … with 129 more rows

詞頻表

quanteda framework

傳統 R 的 text mining 生態圈中,使用的是另一種 (高階) 資料結構儲存文本資料 — 語料庫 (corpus)。不同的套件有自己定義 corpus 的方式,且各自進行文本分析的流程與想法差異頗大。目前最流行、支援最多的兩個套件是 quantedatm。其中,quanteda 在中文支援以及說明與教學文件的完整度較高。

下方為 quanteda 套件的一些使用範例。欲比較完整地了解 quanteda,請閱讀 quanteda tutorials

  • 使用 quanteda 的好處在於它保留了文章的內部結構,例如,可以透過 quanteda::kwic() 去檢視特定詞彙或是片語出現的語境。與此同時,quanteda 也提供許多 bag-of-words 想法之下的函數。
  • quanteda 的缺點在於其內容龐雜,需要一些語料庫語言學的背景知識以及相當的時間摸索才能掌握。