作者:黃天元,復旦大學博士在讀,熱愛數據科學與R,熱衷推廣R在業界的應用。郵箱:[email protected]. 歡迎合作與交流。

R有很多自然語言處理的包,但是大多是針對英文的。中文來做NLP的包,經過長期探索,認為目前要做中文的NLP,首推jiebaR包。本文主要講如何對中文進行分詞,分詞的概念就是把一個句子分成詞語。如果在英文中,詞語之間都有空格,因此分詞非常簡單。但是中文都連在一起,因此必須用一定的演算法來分開。 舉例:

  1. 英文:「R is my favorite programming language.」
  2. 中文:「R語言是我最喜愛的編程語言。」

現在,我們利用jiebaR包對這句話進行分詞。

快速入門

首先,載入必要的包。

library(pacman)

p_load(jiebaR)

然後,我們馬上對句子進行分詞。

en = "R is my favorite programming language."

cn = "R語言是我最喜愛的編程語言"worker() -> wksegment(en,wk)

## [1] "R" "is" "my" "favorite" "programming"

## [6] "language"

看出來了吧,英文分詞根本沒有難度,可以直接用空格分開所有組分。下面來看中文:

segment(cn,wk)

## [1] "R" "語言" "是" "我" "最" "喜愛" "的"

## [7] "編程語言"

美中不足的地方是,「R」和「語言」分了開來。

自定義詞典

不過有的時候,如果沒有自定義詞典,有的詞是無論如何分不對的。打個比方,如果「爸爸去哪兒」是一個詞,但是分詞的時候一般很難分出來。此外,我們的「R語言」也被分為了兩部分。這樣分詞是不對的,為了讓這種情況不再發生,我們必須自定義詞典。首先,要看詞典在哪裡。

show_dictpath()

## [1] "F:/R-3.5.2/library/jiebaRD/dict"

來到這個路徑下,然後對「user.dict.utf8」這個文件進行更改。使用記事本打開,然後在最後補上詞條,也就是「R語言」。現在再來進行分詞(不過我們要重新定義worker才能更新):

worker() -> wk

segment(cn,wk)

## [1] "R語言" "是" "我" "最" "喜愛" "的"

## [7] "編程語言"

這次R語言已經變成了一個片語。 事實上,中文一直在變化,想要用一個演算法就永遠解決分詞的問題,是不存在的(我從來沒有更改過分詞的模式,因為默認的情況已經足夠解決大多數問題)。但是我們可以定期更新我們詞庫,從而讓分詞的效果能夠維持在比較高的水平。

獲取更多的詞典

所以我們知道我們想要更多的詞典,得到海量能夠跟得上時代發展的詞。有什麼辦法?我認為能夠得到大量新詞的地方,有兩個:1.搜索引擎;2.輸入法。搜狗輸入法在搜狗詞胞庫中提供了大量的詞典(pinyin.sogou.com/dict/),大家可以自由下載。不過下載的文件格式是以「.scel」為後綴的,雙擊一般就給我們的輸入法補充了一個詞庫,但是沒法讓我們的jiebaR直接利用。幸好jiebaR的作者為我們提供了轉格式工具,能夠把scel文件直接轉化為.utf8格式的文本文件,從而直接對這些詞進行利用。具體內容可以參照github.com/qinwf/cidian,這裡給出懶人載入的版本。

p_load(devtools,stringi,pbapply,Rcpp,RcppProgress)

install_github("qinwf/cidian")

那麼,大家就可以愉快地使用一個簡單的函數來進行轉格式了:

decode_scel(scel = "細胞詞庫路徑", output = "輸出文件路徑", cpp = TRUE)

關於更多個性化的用法,大家可以去官網查詢。

小結

我認為至此,中文分詞已經足夠好用。我相信大神永遠能夠對演算法進行革新,從而讓分詞更加準確。可惜我本人沒學習過分詞演算法,沒有辦法在演算法的層面來做一些事情。但是想辦法得到自己想要得到的目標關鍵詞詞庫,還是相對簡單的,這樣一來我們已經解決了大部分垂直領域的問題。


推薦閱讀:
相关文章