R語言——中文分詞包jiebaR
R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。
R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大數據的爆發,R語言變成了一門炙手可熱的數據分析的利器。隨著越來越多的工程背景的人的加入,R語言的社區在迅速擴大成長?,F在已不僅僅是統計領域,教育,銀行,電商,互聯網….都在使用R語言。
要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數學,概率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓我們一起動起來吧,開始R的極客理想。
關于作者:
- 張丹(Conan), 程序員Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
轉載請注明出處:
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的極客理想》圖書作者"]
-
[
-
-
> wk["我是R語言的深度用戶"]
-
[
很簡單地,2行代碼,就完成了中文分詞。
jiebaR提供了3種分詞語句的寫法,例子上面的用[]符號的語法,還可以使用<=符合語法,或者使用segment()函數。雖然形式不同,但是分詞效果是一樣的。使用<=符號的語法,如下
-
-
> wk<='另一種符合的語法'
-
[
使用segment()函數的語法,如下
-
-
> segment( "segment()函數語句的寫法" , wk )
-
[
如果你覺得很神奇,想了解如何自定義操作符的,可以檢查項目的源代碼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']
-
[
打開文件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()
-
[
-
-
-
> dir(show_dictpath())
-
[
-
[
-
[
-
[
-
[
看到詞典目錄中,包括了多個文件。
- 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
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
我們發現系統詞典每一行都有三列,并以空格分割,第一列為詞項,第二列為詞頻,第三列為詞性標記。
打開用戶詞典文件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
-
[
用戶詞典第一行有二列,,第一列為詞項,第二列為詞性標記,沒有詞頻的列。用戶詞典默認詞頻為系統詞庫中的最大詞頻。
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']
-
[
對比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)為確保安裝順利,建議首先下載Rtools,下載后直接雙擊進行安裝,安裝同一般軟件安裝,下載地址https://cran.r-project.org/bin/windows/Rtools/,注意選擇對應自己軟件版本的。然后打開Rstudio或者R,用install.packages()依次安裝devtools、stringi、pbapply、Rcpp、RcppProgress,然后加載devtools,然后用install_github("qinwf/cidian")安裝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
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
接下來,直接把搜狗詞典配置到我們的分詞庫中,就可以直接使用了。把搜狗詞典文件改名,從17960.scel_2016-07-21_00_22_11.dict到user.dict.utf8,然后替換D:\tool\R-3.2.3\library\jiebaRD\dict目錄下面的user.dict.utf8。這樣默認的用戶詞典,就是搜狗詞典了。很酷吧!
如果使用txt文件作為詞典,需要將編碼改為utf-8,之后輸入命令:jieba.load_userdict("C:/Users/Lenovo/Desktop/dict.txt")#括號內可自行設置路徑
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
-
[
上面的文本,我們把"我是"通過停止詞進行了過濾。如果還想過濾“作者”一詞,可以動態的調用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
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
-
[
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/
R-cidian將詞庫批量讀入
用到cidian包中的decode_scel函數
參數scel用來給出細胞詞庫的路徑(需要帶上擴展名)
output給出輸出文件的路徑,我們在這里把他放到了和原細胞詞庫同一個路徑下面,并且將其擴展名改為.txt;
cpp = TRUE表示采用Rcpp(速度會更快)
progress = TRUE表示顯示轉換進度條。由于一般而言轉換速度非???,所以是否顯示進度條意義不大。
####此處詞庫為搜狗詞庫
library(dplyr)
library(stringr)
library(devtools)
library(data.table)
library(cidian)
#建立數據目錄
data.dir <- sprintf("%s/data", getwd())
#用來輸出結果的目錄
results.dir <- sprintf("%s/results", getwd())
#獲取所有搜狗詞庫的完整路徑
cidian.dir <- sprintf("%s/搜狗細胞詞庫-201602", data.dir)
scel.paths <- list.files(cidian.dir, pattern = ".scel$", full.names = T)
#導入目錄下所有詞庫,并輸出成.txt文件
lapply(seq_along(scel.paths), function(i) {
decode_scel(scel = scel.paths[i],
output = str_c(scel.paths[i], ".txt"),
cpp = TRUE)}) %>%
invisible()
#將所有詞庫合并成一個詞庫(此處用到函數data.table的rbindlist函數)
dict.paths <- list.files(cidian.dir, pattern = ".txt$", full.names = T)
dict.list <- lapply(seq_along(dict.paths),function(i) fread(dict.paths[i], encoding = "UTF-8"))
dict <- rbindlist(dict.list)
# 去重
dict <- unique(dict, by = names(dict))
#將最后生成的詞庫導出成單一的txt文件,用于后續分詞
write.table(dict, file = sprintf("%s/guba.use.dict.utf8", data.dir),
quote = F,
row.names = F,
col.names = F,
fileEncoding = "UTF-8")


浙公網安備 33010602011771號