R語言自然語言處理:中文分詞
作者:黃天元,復旦大學博士在讀,熱愛數據科學與R,熱衷推廣R在業界的應用。郵箱:[email protected]. 歡迎合作與交流。
R有很多自然語言處理的包,但是大多是針對英文的。中文來做NLP的包,經過長期探索,認為目前要做中文的NLP,首推jiebaR包。本文主要講如何對中文進行分詞,分詞的概念就是把一個句子分成詞語。如果在英文中,詞語之間都有空格,因此分詞非常簡單。但是中文都連在一起,因此必須用一定的演算法來分開。 舉例:
- 英文:「R is my favorite programming language.」
- 中文:「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.輸入法。搜狗輸入法在搜狗詞胞庫中提供了大量的詞典(https://pinyin.sogou.com/dict/),大家可以自由下載。不過下載的文件格式是以「.scel」為後綴的,雙擊一般就給我們的輸入法補充了一個詞庫,但是沒法讓我們的jiebaR直接利用。幸好jiebaR的作者為我們提供了轉格式工具,能夠把scel文件直接轉化為.utf8格式的文本文件,從而直接對這些詞進行利用。具體內容可以參照https://github.com/qinwf/cidian,這裡給出懶人載入的版本。
p_load(devtools,stringi,pbapply,Rcpp,RcppProgress)
install_github("qinwf/cidian")那麼,大家就可以愉快地使用一個簡單的函數來進行轉格式了:
decode_scel(scel = "細胞詞庫路徑", output = "輸出文件路徑", cpp = TRUE)
關於更多個性化的用法,大家可以去官網查詢。
小結
我認為至此,中文分詞已經足夠好用。我相信大神永遠能夠對演算法進行革新,從而讓分詞更加準確。可惜我本人沒學習過分詞演算法,沒有辦法在演算法的層面來做一些事情。但是想辦法得到自己想要得到的目標關鍵詞詞庫,還是相對簡單的,這樣一來我們已經解決了大部分垂直領域的問題。
推薦閱讀: