1. 程式人生 > 其它 >R語言中文分詞包jiebaR

R語言中文分詞包jiebaR

R語言中文分詞包jiebaR

R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。

R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大資料的爆發,R語言變成了一門炙手可熱的資料分析的利器。隨著越來越多的工程背景的人的加入,R語言的社群在迅速擴大成長。現在已不僅僅是統計領域,教育,銀行,電商,網際網路….都在使用R語言。

要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數學,概率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓我們一起動起來吧,開始R的極客理想。

關於作者:

轉載請註明出處:
http://blog.fens.me/r-word-jiebar/

前言

本文挖掘是資料探勘中一個非常重要的部分,有非常廣闊的使用場景,比如我們可以對新聞事件進行分析,瞭解國家大事;也可以對微博資訊進行分析,通過社交輿情看看大家的關注點。通過文字挖掘找到文章中的隱藏資訊,對文章的結構進行分析,判斷是不是同一個作者寫文章;同時可以對郵件分析,結合bayes演算法判斷哪些是垃圾郵件,哪些是有用的郵件。

本文挖掘的第一步,就是要進行分詞,分詞將直接影響文字挖掘的效果。R語言在分詞方面有很好的支援,接下來就給大家介紹一個不錯的R語言中文分詞包“結巴分詞”(jiebaR)。

目錄

  1. jiebaR包介紹
  2. 5分鐘上手
  3. 分詞引擎
  4. 配置詞典
  5. 停止詞過濾
  6. 關鍵詞提取

1. jiebaR包介紹

結巴分詞(jiebaR),是一款高效的R語言中文分詞包,底層使用的是C++,通過Rcpp進行呼叫很高效。結巴分詞基於MIT協議,就是免費和開源的,感謝國人作者的給力支援,讓R的可以方便的處理中文文字。

官方Github的地址:https://github.com/qinwf/jiebaR

本文所使用的系統環境

  • Win10 64bit
  • R: 3.2.3 x86_64-w64-mingw32/x64 b4bit

jiebaR包是在CRAN釋出的標準庫,安裝起來非常簡單,2條命令就可以了。

~ R
> install.packages("jiebaR")
> library("jiebaR")

如果想要安裝開發版本,可以使用devtools來進行安裝,devtools的介紹請參考文章:在巨人的肩膀前行 催化R包開發

> library(devtools)
> install_github("qinwf/jiebaRD")
> install_github("qinwf/jiebaR")
> library("jiebaR")

開發版本安裝,官方建議使用Linux系統 gcc >= 4.6 編譯,Windows需要安裝 Rtools。

2. 5分鐘上手

5分鐘上手,直接看第一個例子吧,對一段文字進行分詞。

> wk = worker()

> wk["我是《R的極客理想》圖書作者"]
[1] "我是" "R"    "的"   "極客" "理想" "圖書" "作者"

> wk["我是R語言的深度使用者"]
[1] "我"   "是"   "R"    "語言" "的"   "深度" "使用者"

很簡單地,2行程式碼,就完成了中文分詞。

jiebaR提供了3種分詞語句的寫法,例子上面的用[]符號的語法,還可以使用<=符合語法,或者使用segment()函式。雖然形式不同,但是分詞效果是一樣的。 使用<=符號的語法,如下

> wk<='另一種符合的語法'
[1] "另"   "一種" "符合" "的"   "語法"

使用segment()函式的語法,如下

> segment( "segment()函式語句的寫法" , wk )
[1] "segment" "函式"    "語句"    "的"      "寫法" 

如果你覺得很神奇,想了解如何自定義操作符的,可以檢查專案的原始碼quick.R檔案

# <= 符號定義
`<=.qseg`<-function(qseg, code){
  if(!exists("quick_worker",envir = .GlobalEnv ,inherits = F) || 
       .GlobalEnv$quick_worker$PrivateVarible$timestamp != TIMESTAMP){
    
    if(exists("qseg",envir = .GlobalEnv,inherits = FALSE ) ) 
      rm("qseg",envir = .GlobalEnv)
    
    modelpath  = file.path(find.package("jiebaR"),"model","model.rda")
    quickparam = readRDS(modelpath)
    
    if(quickparam$dict == "AUTO") quickparam$dict = DICTPATH
    if(quickparam$hmm == "AUTO") quickparam$hmm = HMMPATH
    if(quickparam$user == "AUTO") quickparam$user = USERPATH
    if(quickparam$stop_word == "AUTO") quickparam$stop_word = STOPPATH
    if(quickparam$idf == "AUTO") quickparam$idf = IDFPATH
    
    createquickworker(quickparam)
    setactive()
  } 

  //..程式碼省略
}

# [ 符號定義
`[.qseg`<- `<=.qseg`

我們也可以直接對文字檔案進行分詞,在當前目錄新建一個文字檔案idea.txt。

~ notepad idea.txt

R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。

R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大資料的爆發,R語言變成了一門炙手可熱的資料分析的利器。隨著越來越多的工程背景的人的加入,R語言的社群在迅速擴大成長。現在已不僅僅是統計領域,教育,銀行,電商,網際網路….都在使用R語言。

當然,我們執行分詞程式,會在當前目錄生成一個新的分詞結果的檔案。

> wk['./idea.txt']
[1] "./idea.segment.2016-07-20_23_25_34.txt"

開啟檔案idea.segment.2016-07-20_23_25_34.txt,整個本文以空格進行分詞。

~ notepad idea.segment.2016-07-20_23_25_34.txt

R 的 極客 理想 系列 文章 涵蓋 了 R 的 思想 使用 工具 創新 等 的 一系列 要點 以 我 個人 的 學習 和 體驗 去 詮釋 R 的 強大 R 語言 作為 統計學 一門 語言 一直 在 小眾 領域 閃耀著 光芒 直到 大 資料 的 爆發 R 語言 變成 了 一門 炙手可熱 的 資料分析 的 利器 隨著 越來越 多 的 工程 背景 的 人 的 加入 R 語言 的 社群 在 迅速 擴大 成長 現在 已 不僅僅 是 統計 領域 教育 銀行 電商 網際網路 都 在 使用 R 語言

是不是很簡單,5分鐘實踐就能完成分詞的任務。

3. 分詞引擎

在呼叫worker()函式時,我們實際是在載入jiebaR庫的分詞引擎。jiebaR庫提供了7種分詞引擎。

  • 混合模型(MixSegment):是四個分詞引擎裡面分詞效果較好的類,結它合使用最大概率法和隱式馬爾科夫模型。
  • 最大概率法(MPSegment) :負責根據Trie樹構建有向無環圖和進行動態規劃演算法,是分詞演算法的核心。
  • 隱式馬爾科夫模型(HMMSegment):是根據基於人民日報等語料庫構建的HMM模型來進行分詞,主要演算法思路是根據(B,E,M,S)四個狀態來代表每個字的隱藏狀態。 HMM模型由dict/hmm_model.utf8提供。分詞演算法即viterbi演算法。
  • 索引模型(QuerySegment):先使用混合模型進行切詞,再對於切出來的較長的詞,列舉句子中所有可能成詞的情況,找出詞庫裡存在。
  • 標記模型(tag)
  • Simhash模型(simhash)
  • 關鍵詞模型(keywods)

如果你不太關心引擎的事,那麼直接用官方推薦的混合模型(預設選擇)就行了。檢視worker()函式的定義。

worker(type = "mix", dict = DICTPATH, hmm = HMMPATH, user = USERPATH,
  idf = IDFPATH, stop_word = STOPPATH, write = T, qmax = 20, topn = 5,
  encoding = "UTF-8", detect = T, symbol = F, lines = 1e+05,
  output = NULL, bylines = F, user_weight = "max")

引數列表:

  • type, 引擎型別
  • dict, 系統詞典
  • hmm, HMM模型路徑
  • user, 使用者詞典
  • idf, IDF詞典
  • stop_word, 關鍵詞用停止詞庫
  • write, 是否將檔案分詞結果寫入檔案,預設FALSE
  • qmax, 最大成詞的字元數,預設20個字元
  • topn, 關鍵詞數,預設5個
  • encoding, 輸入檔案的編碼,預設UTF-8
  • detect, 是否編碼檢查,預設TRUE
  • symbol, 是否保留符號,預設FALSE
  • lines, 每次讀取檔案的最大行數,用於控制讀取檔案的長度。大檔案則會分次讀取。
  • output, 輸出路徑
  • bylines, 按行輸出
  • user_weight, 使用者權重

我們在呼叫worker()時,就載入了分詞引擎,可以打印出來,檢視分詞的引擎的配置。

> wk = worker()
> wk
Worker Type:  Jieba Segment

Default Method  :  mix     # 混合模型
Detect Encoding :  TRUE    # 檢查編碼
Default Encoding:  UTF-8   # UTF-8
Keep Symbols    :  FALSE   # 不保留符號
Output Path     :          # 輸出檔案目錄
Write File      :  TRUE    # 寫檔案
By Lines        :  FALSE   # 不行輸出
Max Word Length :  20      # 最大單單詞長度
Max Read Lines  :  1e+05   # 最大讀入檔案行數

Fixed Model Components:  

$dict                      # 系統詞典
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/jieba.dict.utf8"

$user                      # 使用者詞典
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/user.dict.utf8"

$hmm                       # 隱式馬爾科夫模型模型
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/hmm_model.utf8"

$stop_word                 # 停止詞,無
NULL

$user_weight               # 使用者詞典權重
[1] "max"

$timestamp                 # 時間戳
[1] 1469027302

$default $detect $encoding $symbol $output $write $lines $bylines can be reset.

如果我們想改變分詞引擎的配置項,可以在呼叫worker()建立分詞引擎時,也可以通過wk$XX來進行設定。如果想了解wk是什麼型別的物件,我們通過pryr包的otype的函式來檢查wk物件的型別。關於pryr包的詳細使用,請參考文章撬動R核心的高階工具包pryr

# 載入 pryr包
> library(pryr)
> otype(wk)  # 面向物件的型別檢查
[1] "S3"

> class(wk)  # 檢視class是屬性
[1] "jiebar"  "segment" "jieba" 

4. 配置詞典

對於分詞的結果好壞的關鍵因素是詞典,jiebaR預設有配置標準的詞典。對於我們的使用來說,不同行業或不同的文字型別,最好用專門的分詞詞典。在jiebaR中通過show_dictpath()函式可以檢視預設的標準詞典,可以通過上一小節介紹的配置項,來指定我們自己的詞典。日常對話的常用詞典,比如搜狗輸入法的詞庫。

# 檢視預設的詞庫位置
> show_dictpath()
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict"

# 檢視目錄
> dir(show_dictpath())
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict"
 [1] "backup.rda"      "hmm_model.utf8"  "hmm_model.zip"  
 [4] "idf.utf8"        "idf.zip"         "jieba.dict.utf8"
 [7] "jieba.dict.zip"  "model.rda"       "README.md"      
[10] "stop_words.utf8" "user.dict.utf8" 

看到詞典目錄中,包括了多個檔案。

  • jieba.dict.utf8, 系統詞典檔案,最大概率法,utf8編碼的
  • hmm_model.utf8, 系統詞典檔案,隱式馬爾科夫模型,utf8編碼的
  • user.dict.utf8, 使用者詞典檔案,utf8編碼的
  • stop_words.utf8,停止詞檔案,utf8編碼的
  • idf.utf8,IDF語料庫,utf8編碼的
  • jieba.dict.zip,jieba.dict.utf8的壓縮包
  • hmm_model.zip,hmm_model.utf8的壓縮包
  • idf.zip,idf.utf8的壓縮包
  • backup.rda,無註釋
  • model.rda,無註釋
  • README.md,說明檔案

開啟系統詞典檔案jieba.dict.utf8,並列印前50行。

> scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/jieba.dict.utf8",
+           what=character(),nlines=50,sep='\n',
+           encoding='utf-8',fileEncoding='utf-8')
Read 50 items
 [1] "1號店 3 n"  "1號店 3 n"  "4S店 3 n"   "4s店 3 n"  
 [5] "AA制 3 n"   "AB型 3 n"   "AT&T 3 nz"  "A型 3 n"   
 [9] "A座 3 n"    "A股 3 n"    "A輪 3 n"    "A輪 3 n"   
[13] "BB機 3 n"   "BB機 3 n"   "BP機 3 n"   "BP機 3 n"  
[17] "B型 3 n"    "B座 3 n"    "B股 3 n"    "B超 3 n"   
[21] "B輪 3 n"    "B輪 3 n"    "C# 3 nz"    "C++ 3 nz"  
[25] "CALL機 3 n" "CALL機 3 n" "CD機 3 n"   "CD機 3 n"  
[29] "CD盒 3 n"   "C座 3 n"    "C盤 3 n"    "C盤 3 n"   
[33] "C語言 3 n"  "C語言 3 n"  "D座 3 n"    "D版 3 n"   
[37] "D盤 3 n"    "D盤 3 n"    "E化 3 n"    "E座 3 n"   
[41] "E盤 3 n"    "E盤 3 n"    "E通 3 n"    "F座 3 n"   
[45] "F盤 3 n"    "F盤 3 n"    "G盤 3 n"    "G盤 3 n"   
[49] "H盤 3 n"    "H盤 3 n"

我們發現系統詞典每一行都有三列,並以空格分割,第一列為詞項,第二列為詞頻,第三列為詞性標記。

開啟使用者詞典檔案user.dict.utf8,並列印前50行。

> scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/user.dict.utf8",
+      what=character(),nlines=50,sep='\n',
+      encoding='utf-8',fileEncoding='utf-8')
Read 5 items
[1] "雲端計算"   "韓玉鑑賞" "藍翔 nz"  "CEO"      "江大橋"  

使用者詞典第一行有二列,,第一列為詞項,第二列為詞性標記,沒有詞頻的列。使用者詞典預設詞頻為系統詞庫中的最大詞頻。

jiebaR包關於詞典詞性標記,採用ictclas的標記方法。ICTCLAS 漢語詞性標註集。

程式碼 名稱 幫助記憶的詮釋
Ag 形語素 形容詞性語素。形容詞程式碼為a,語素程式碼g前面置以A。
a 形容詞 取英語形容詞adjective的第1個字母。
ad 副形詞 直接作狀語的形容詞。形容詞程式碼a和副詞程式碼d並在一起。
an 名形詞 具有名詞功能的形容詞。形容詞程式碼a和名詞程式碼n並在一起。
b 區別詞 取漢字"別"的聲母。
c 連詞 取英語連詞conjunction的第1個字母。
Dg 副語素 副詞性語素。副詞程式碼為d,語素程式碼g前面置以D。
d 副詞 取adverb的第2個字母,因其第1個字母已用於形容詞。
e 嘆詞 取英語嘆詞exclamation的第1個字母。
f 方位詞 取漢字"方"的聲母。
g 語素 絕大多數語素都能作為合成詞的"詞根",取漢字"根"的聲母。
h 前接成分 取英語head的第1個字母。
i 成語 取英語成語idiom的第1個字母。
j 簡稱略語 取漢字"簡"的聲母。
k 後接成分
l 習用語 習用語尚未成為成語,有點"臨時性",取"臨"的聲母。
m 數詞 取英語numeral的第3個字母,n,u已有他用。
Ng 名語素 名詞性語素。名詞程式碼為n,語素程式碼g前面置以N。
n 名詞 取英語名詞noun的第1個字母。
nr 人名 名詞程式碼n和"人(ren)"的聲母並在一起。
ns 地名 名詞程式碼n和處所詞程式碼s並在一起。
nt 機構團體 "團"的聲母為t,名詞程式碼n和t並在一起。
nz 其他專名 "專"的聲母的第1個字母為z,名詞程式碼n和z並在一起。
o 擬聲詞 取英語擬聲詞onomatopoeia的第1個字母。
p 介詞 取英語介詞prepositional的第1個字母。
q 量詞 取英語quantity的第1個字母。
r 代詞 取英語代詞pronoun的第2個字母,因p已用於介詞。
s 處所詞 取英語space的第1個字母。
Tg 時語素 時間詞性語素。時間詞程式碼為t,在語素的程式碼g前面置以T。
t 時間詞 取英語time的第1個字母。
u 助詞 取英語助詞auxiliary 的第2個字母,因a已用於形容詞。
Vg 動語素 動詞性語素。動詞程式碼為v。在語素的程式碼g前面置以V。
v 動詞 取英語動詞verb的第一個字母。
vd 副動詞 直接作狀語的動詞。動詞和副詞的程式碼並在一起。
vn 名動詞 指具有名詞功能的動詞。動詞和名詞的程式碼並在一起。
w 標點符號
x 非語素字 非語素字只是一個符號,字母x通常用於代表未知數、符號。
y 語氣詞 取漢字"語"的聲母。
z 狀態詞 取漢字"狀"的聲母的前一個字母。

下面我們自定義一個使用者詞典,來試試效果。編寫詞典檔案,user.utf8。

~ notepad user.utf8

R語言
R的極客理想
大資料
資料

使用我們的自定義的使用者詞典,對剛才的文字再進行分詞。

> wk = worker(user='user.utf8')
> wk['./idea.txt']
[1] "./idea.segment.2016-07-21_11_14_24.txt"

對比2次產生的分詞結果,idea.segment.2016-07-20_23_25_34.txt 和 idea.segment.2016-07-21_11_14_24.txt。

在實際使用中,jiebaR預設提供的使用者詞典只有5個單詞,太簡單了,肯定是不夠用的。我們可以用搜狗詞典,來豐富使用者自己的詞庫。接下來,讓我們配置搜狗詞典。你需要安裝一個搜狗輸入法,具體的安裝過程不再解釋。

我安裝的是搜狗五筆輸入法,找到搜狗的安裝目錄,並找到詞典檔案。我的搜狗詞典,在下面的安裝位置。

C:\Program Files (x86)\SogouWBInput\2.1.0.1288\scd\17960.scel

把17960.scel檔案複製到自己的專案目錄裡,用文字編輯器開啟檔案,發現是二進位制的。那麼我需要用工具進行轉換,把二進位制的詞典轉成我們可以使用的文字檔案。jiebaR包的作者,同時開發了一個cidian專案,可以轉換搜狗的詞典,那麼我們只需要安裝cidian包即可。

安裝cidian專案

> install.packages("devtools")
> install.packages("stringi")
> install.packages("pbapply")
> install.packages("Rcpp")
> install.packages("RcppProgress")
> library(devtools)
> install_github("qinwf/cidian")
> library(cidian)

轉換二進位制詞典到文字檔案。

# 轉換
> decode_scel(scel = "./17960.scel",cpp = TRUE)
output file: ./17960.scel_2016-07-21_00_22_11.dict

# 檢視生成的詞典檔案
> scan(file="./17960.scel_2016-07-21_00_22_11.dict",
+      what=character(),nlines=50,sep='\n',
+      encoding='utf-8',fileEncoding='utf-8')
Read 50 items
 [1] "阿壩州 n"         "阿百川 n"         "阿班 n"          
 [4] "阿賓 n"           "阿波菲斯 n"       "阿不都熱希提 n"  
 [7] "阿不都西庫爾 n"   "阿不力克木 n"     "阿爾姆格倫 n"    
[10] "阿爾沙文 n"       "阿肥星 n"         "阿菲正傳 n"      
[13] "阿密特 n"         "阿穆 n"           "阿穆隆 n"        
[16] "阿帕魯薩鎮 n"     "阿披實 n"         "阿衰 n"          
[19] "阿霞 n"           "艾奧瓦 n"         "愛不疚 n"        
[22] "愛的錯位 n"       "愛得得體 n"       "愛的火焰 n"      
[25] "愛的流刑地 n"     "愛得起 n"         "埃夫隆 n"        
[28] "愛搞網 n"         "愛國紅心 n"       "愛呼 n"          
[31] "愛就宅一起 n"     "埃克希兒 n"       "愛沒有錯 n"      
[34] "埃蒙斯 n"         "愛奴新傳 n"       "愛起點 n"        
[37] "愛情的牙齒 n"     "愛情海濱 n"       "愛情節 n"        
[40] "愛情美的樣子 n"   "愛情無限譜 n"     "愛情佔線 n"      
[43] "愛情轉移 n"       "愛情左燈右行 n"   "愛上你是一個錯 n"
[46] "矮哨兵 n"         "愛是妥協 n"       "愛似水仙 n"      
[49] "愛太痛 n"         "愛無界 n"    

接下來,直接把搜狗詞典配置到我們的分詞庫中,就可以直接使用了。把搜狗詞典檔案改名,從17960.scel_2016-07-21_00_22_11.dict到user.dict.utf8,然後替換D:\tool\R-3.2.3\library\jiebaRD\dict目錄下面的user.dict.utf8。這樣預設的使用者詞典,就是搜狗詞典了。很酷吧!

5. 停止詞過濾

停止詞就是分詞過程中,我們不需要作為結果的詞,像英文的語句中有很多的a,the,or,and等,中文語言中也有很多,比如 的,地,得,我,你,他。這些詞因為使用頻率過高,會大量出現在一段文字中,對於分詞後的結果,在統計詞頻的時候會增加很多的噪音,所以我們通常都會將這些詞進行過濾。

在jiebaR中,過濾停止詞有2種方法,一種是通過配置stop_word檔案,另一種是使用filter_segment()函式。

首先我們先來看,通過配置stop_word檔案的方法。新建一個stop_word.txt檔案。

~ notepad stop_word.txt

我
我是

載入分詞引擎,並配置停止詞過濾。

> wk = worker(stop_word='stop_word.txt')
> segment<-wk["我是《R的極客理想》圖書作者"]
> segment
[1] "R"    "的"   "極客" "理想" "圖書" "作者"

上面的文字,我們把"我是"通過停止詞進行了過濾。如果還想過濾“作者”一詞,可以動態的呼叫filter_segment()函式。

> filter<-c("作者")
> filter_segment(segment,filter)
[1] "R"    "的"   "極客" "理想" "圖書"

6. 關鍵詞提取

關鍵詞提取是文字處理非常重要的一個環節,一個經典演算法是TF-IDF演算法。其中,TF(Term Frequency)代表詞頻,IDF(Inverse Document Frequency)表示逆文件頻率。如果某個詞在文章中多次出現,而且不是停止詞,那麼它很可能就反應了這段文章的特性,這就是我們要找的關鍵詞。再通過IDF來算出每個詞的權重,不常見的詞出現的頻率越高,則權重越大。計算TF-IDF的公式為:

TF-IDF = TF(詞頻) * 逆文件頻率(IDF)

對文件中每個詞計算TF-IDF的值,把結果從大到小排序,就得到了這篇文件的關鍵性排序列表。關於IF-IDF的解釋,參考了文章TF-IDF與餘弦相似性的應用(一):自動提取關鍵詞

jiebaR包的關鍵詞提取提取的實現,也是使用了TF-IDF的演算法。在安裝目錄中的idf.utf8檔案,為IDF的語料庫。檢視idf.utf8內容。

> scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/idf.utf8",
+      what=character(),nlines=50,sep='\n',
+      encoding='utf-8',fileEncoding='utf-8')
Read 50 items
 [1] "勞動防護 13.900677652"      "生化學 13.900677652"       
 [3] "奧薩貝爾 13.900677652"      "考察隊員 13.900677652"     
 [5] "崗上 11.5027823792"         "倒車檔 12.2912397395"      
 [7] "編譯 9.21854642485"         "蝶泳 11.1926274509"        
 [9] "外委 11.8212361103"         "故作高深 11.9547675029"    
[11] "尉遂成 13.2075304714"       "心源性 11.1926274509"      
[13] "現役軍人 10.642581114"      "杜勃留 13.2075304714"      
[15] "包天笑 13.900677652"        "賈政陪 13.2075304714"      
[17] "托爾灣 13.900677652"        "多瓦 12.5143832909"        
[19] "多瓣 13.900677652"          "巴斯特爾 11.598092559"     
[21] "劉皇帝 12.8020653633"       "亞歷山德羅夫 13.2075304714"
[23] "社會公眾 8.90346537821"     "五百份 12.8020653633"      
[25] "兩點閾 12.5143832909"       "多瓶 13.900677652"         
[27] "冰天 12.2912397395"         "庫布齊 11.598092559"       
[29] "龍川縣 12.8020653633"       "銀燕 11.9547675029"        
[31] "歷史風貌 11.8212361103"     "信仰主義 13.2075304714"    
[33] "好色 10.0088573539"         "款款而行 12.5143832909"    
[35] "凳子 8.36728816325"         "二部 9.93038573842"        
[37] "盧巴 12.1089181827"         "五百五 13.2075304714"      
[39] "暢敘 11.598092559"          "吳柵子 13.2075304714"      
[41] "智力競賽 13.900677652"      "庫邦 13.2075304714"        
[43] "非正義 11.3357282945"       "編訂 10.2897597393"        
[45] "悲號 12.8020653633"         "陳莊搭 13.2075304714"      
[47] "二郎 9.62401153296"         "電光石火 11.8212361103"    
[49] "搶球 11.9547675029"         "南澳大利亞 10.9562386728"  

idf.utf8檔案每一行有2列,第一列是詞項,第二列為權重。然後,我通過計算文件的詞頻(TF),與語料庫的IDF值相乘,就可以得到TF-IDF值,從而提取文件的關鍵詞。

比如,我們對下面的文字內容進行關鍵詞的提取。

> wk = worker()
> segment<-wk["R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。"]

# 計算詞頻
> freq(segment)
     char freq
1    創新    1
2      了    1
3    文章    1
4    強大    1
5       R    3
6    個人    1
7      的    5
8    詮釋    1
9      和    1
10 一系列    1
11   使用    1
12     以    1
13     等    1
14   極客    1
15   理想    1
16   思想    1
17   涵蓋    1
18   系列    1
19     去    1
20     我    1
21   工具    1
22   學習    1
23   體驗    1
24   要點    1

# 取TF-IDF的前5的關鍵詞
> keys = worker("keywords",topn=5)

# 計算關鍵詞
> vector_keywords(segment,keys)
11.7392 8.97342 8.23425  8.2137 7.43298 
 "極客"  "詮釋"  "要點"  "涵蓋"  "體驗" 

使用jiebaR包處理分詞確實簡單,幾行的程式碼就能實現分詞的各種演算法操作。有了這個工具,我們就可以文件中,發現各種語言規則進行文字挖掘了。下篇文章讓我們挖掘一下上市公司的公告吧,說不定能發現什麼市場規則。

本文只是拋磚引玉地介紹了jiebaR包的使用方法,詳細使用操作,請參考包作者的官方介紹。再次感謝jiebaR作者@qinwenfeng,為R語言在中文分詞中提供了一套非常不錯的工具包!

轉載請註明出處:
http://blog.fens.me/r-word-jiebar/