R語言中文分詞包jiebaR
R語言中文分詞包jiebaR
R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。
R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大資料的爆發,R語言變成了一門炙手可熱的資料分析的利器。隨著越來越多的工程背景的人的加入,R語言的社群在迅速擴大成長。現在已不僅僅是統計領域,教育,銀行,電商,網際網路….都在使用R語言。
要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數學,概率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓我們一起動起來吧,開始R的極客理想。
關於作者:
- 張丹(Conan), 程式設計師Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: [email protected]
轉載請註明出處:
http://blog.fens.me/r-word-jiebar/
前言
本文挖掘是資料探勘中一個非常重要的部分,有非常廣闊的使用場景,比如我們可以對新聞事件進行分析,瞭解國家大事;也可以對微博資訊進行分析,通過社交輿情看看大家的關注點。通過文字挖掘找到文章中的隱藏資訊,對文章的結構進行分析,判斷是不是同一個作者寫文章;同時可以對郵件分析,結合bayes演算法判斷哪些是垃圾郵件,哪些是有用的郵件。
本文挖掘的第一步,就是要進行分詞,分詞將直接影響文字挖掘的效果。R語言在分詞方面有很好的支援,接下來就給大家介紹一個不錯的R語言中文分詞包“結巴分詞”(jiebaR)。
目錄
- jiebaR包介紹
- 5分鐘上手
- 分詞引擎
- 配置詞典
- 停止詞過濾
- 關鍵詞提取
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/