分詞 | jiebaR 常用函數

一、jiebaR主要函數

1.worker():載入jiebaR庫的分詞引擎

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, 是否將文件分詞結果寫入文件,默認FALSEqmax, 最大成詞的字元數,默認20個字元topn, 關鍵詞數,默認5個encoding, 輸入文件的編碼,默認UTF-8detect, 是否編碼檢查,默認TRUEsymbol, 是否保留符號,默認FALSElines, 每次讀取文件的最大行數,用於控制讀取文件的長度。大文件則會分次讀取。output, 輸出路徑bylines, 按行輸出user_weight, 用戶權重

jiebaR庫提供了八種分詞引擎:

混合模型(MixSegment)

四個分詞引擎裡面分詞效果較好的類,使用最大概率法和隱式馬爾科夫模型

最大概率法(MPSegment)

負責根據Trie樹構建有向無環圖和進行動態規劃演算法,是分詞演算法的核心

隱式馬爾科夫模型(HMMSegment)

根據基於人民日報等語料庫構建的HMM模型來進行分詞,主要演算法思路是根據(B,E,M,S)四個狀態來代表每個字的隱藏狀態,HMM模型由dict/hmm_model.utf8提供,分詞演算法即viterbi演算法。

索引模型(QuerySegment)

先使用混合模型進行切詞,再對於切出來的較長的詞,枚舉句子中所有可能成詞的情況,找出詞庫里存在

標記模型(tag)

Simhash模型(simhash)

關鍵詞模型(keywods)

FullSegment模型(Full)

2.分詞語法:[]、<=和segment函數

jiebaR提供了3種分詞語句寫法:[]符號語法、<=符號語法、segment()函數,三者形式不同,但分詞效果一樣。

library("jiebaR")wk = worker()#調用worker()函數,載入jiebaR庫的分詞引擎wk["我是豆瓣讀書的忠實用戶"]#句法1:使用[]符號[1] "我" "是" "豆瓣" "讀書" "的" "忠實" "用戶"wk<=我是豆瓣讀書的忠實用戶 #句法2:使用k<=符號[1] "我" "是" "豆瓣" "讀書" "的" "忠實" "用戶"segment("我是豆瓣讀書的忠實用戶" , wk ) #句法3:使用segment函數[1] "我" "是" "豆瓣" "讀書" "的" "忠實" "用戶"

3.詞典配置函數

3.1 查看詞典

show_dictpath() # 查看默認的詞庫位置[1] "D:/R-3.4.2/library/jiebaRD/dict"---------dir(show_dictpath()) # 查看目錄[1] "D:/R-3.4.2/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,說明文件---------scan(file="D:/R-3.4.2/library/jiebaRD/dict/jieba.dict.utf8",+ what=character(),nlines=20,sep=
,+ encoding=utf-8,fileEncoding=utf-8) #查看詞典前20行Read 20 items[1] "1號店 3 n" "1號店 3 n" "4S店 3 n" "4s店 3 n" "AA制 3 n" "AB型 3 n" "AT&T 3 nz" "A型 3 n" "A座 3 n" "A股 3 n" "A輪 3 n" [12] "A輪 3 n" "BB機 3 n" "BB機 3 n" "BP機 3 n" "BP機 3 n" "B型 3 n" "B座 3 n" "B股 3 n" "B超 3 n" #每一行都有三列,並以空格分割,第一列為詞項,第二列為詞頻,第三列為詞性標記---------scan(file="D:/R-3.4.2/library/jiebaRD/dict/user.dict.utf8",+ what=character(),nlines=20,sep=
,+ encoding=utf-8,fileEncoding=utf-8) #查看用戶詞典前20行Read 5 items[1] "雲計算" "韓玉鑒賞" "藍翔 nz" "CEO" "江大橋" #用戶詞典第一行有二列,,第一列為詞項,第二列為詞性標記,沒有詞頻列,默認詞頻為系統詞庫中的最大詞頻,用戶詞典默認僅有五個詞。---------

3.2自定義詞典

(1)簡單自定義

wk = worker(user=D:/R-3.4.2/library/jiebaRD/dict/user.utf8) #使用自定義詞典user.utf8wk["我是豆瓣讀書的忠實用戶"][1] "我" "是" "豆瓣讀書" "的" "忠實用戶"

(2)使用搜狗詞典

搜狗詞庫scel文件是二進位,需要把二進位的詞典轉成可以使用的文本文件,jiebaR包的作者,同時開發了一個cidian項目,可以轉換搜狗的詞典。

#安裝cidianinstall.packages("devtools")install.packages("stringi")install.packages("pbapply")install.packages("Rcpp")install.packages("RcppProgress")library(devtools)install_github("qinwf/cidian") #目前託管在github,不能直接從CRAN上下載

使用cidian對搜狗詞典進行轉換

library(cidian)decode_scel(scel = "D:/R-3.4.2/library/jiebaRD/dict/14108.scel",cpp = TRUE)#轉換output file: D:/R-3.4.2/library/jiebaRD/dict/14108.scel_2018-01-19_16_46_33.dictscan(file="D:/R-3.4.2/library/jiebaRD/dict/14108.scel_2018-01-19_16_46_33.dict",what=character(),nlines=20,sep=
,encoding=utf-8,fileEncoding=utf-8)#查看轉換後的詞典Read 20 items[1] "阿黨相為 n" "阿房 n" "阿附 n" "阿膠 n" "阿膠補血膏 n" "阿膠補血顆粒 n" [7] "阿膠補血口服液 n" "阿膠丁 n" "阿膠粉 n" "阿膠糕 n" "阿膠膏 n" "阿膠貢棗 n" [13] "阿膠固元膏 n" "阿膠紅糖 n" "阿膠紅棗 n" "阿膠漿 n" "阿膠膠囊 n" "阿膠顆粒 n" [19] "阿膠口服液 n" "阿膠蜜棗 n"

把轉換後的搜狗詞典文件改名,從14108.scel2018-01-19164633.dict到user_test.utf8

3.3 停用詞詞典

停止詞就是分詞過程中不需要作為結果的詞,如a,the/or/and/的/地/得/我/你/他等,這些詞使用頻率過高,會大量出現在一段文本中,在統計詞頻的時候會增加很多的噪音,所以通常將這些詞過濾。在jiebaR中,過濾停止詞有2種方法,一種是通過配置stopword文件,二是使用filtersegment()函數:

(1)配置stop_word文件

wk = worker(stop_word=D:/R-3.4.2/library/jiebaRD/dict/stopwd.utf8)segment<-wk["我是豆瓣讀書的忠實用戶"]segment[1] "豆瓣" "讀書" "忠實" "用戶"

(2)動態調用filter_segment()函數

filter<-c("用戶")filter_segment(segment,filter)#動態調用filter_segment()函數[1] "豆瓣" "讀書" "忠實"

3.4 關鍵詞提取

關鍵詞提取的一個經典演算法是TF-IDF,TF(Term Frequency)代表某個詞在文檔中出現的頻率,IDF(Inverse Document Frequency)表示逆文檔頻率,是一個重要性調整係數,衡量一個詞是不是常見詞。如果某個詞比較少見,但是它在這篇文章中多次出現,而且不是停止詞,那麼它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞,再通過IDF來算出每個詞的權重,不常見的詞出現的頻率越高,則權重越大。計算TF-IDF的公式為:

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

jiebaR包的關鍵詞提取提取的實現使用的TF-IDF的演算法,在安裝目錄中的idf.utf8文件為IDF的語料庫。

scan(file="D:/R-3.4.2/library/jiebaRD/dict/idf.utf8",what=character(),nlines=20,sep=
,encoding=utf-8,fileEncoding=utf-8)Read 20 items[1] "勞動防護 13.900677652" "生化學 13.900677652" "奧薩貝爾 13.900677652" [4] "考察隊員 13.900677652" "崗上 11.5027823792" "倒車檔 12.2912397395" [7] "編譯 9.21854642485" "蝶泳 11.1926274509" "外委 11.8212361103" [10] "故作高深 11.9547675029" "尉遂成 13.2075304714" "心源性 11.1926274509" [13] "現役軍人 10.642581114" "杜勃留 13.2075304714" "包天笑 13.900677652" [16] "賈政陪 13.2075304714" "托爾灣 13.900677652" "多瓦 12.5143832909" [19] "多瓣 13.900677652" "巴斯特爾 11.598092559"

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

wk = worker()> segment<-wk["R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。"]> freq(segment) #計算詞頻char freq1 強大 12 使用 13 思想 14 涵蓋 15 極客 16 文章 17 詮釋 18 系列 19 體驗 110 理想 111 等 112 了 113 個人 114 的 515 要點 116 R 317 創新 118 一系列 119 我 120 工具 121 學習 122 以 123 去 124 和 1> keys = worker("keywords",topn=5)# 取TF-IDF的前5的關鍵詞> vector_keywords(segment,keys) #計算關鍵詞11.7392 8.97342 8.23425 8.2137 7.43298 "極客" "詮釋" "要點" "涵蓋" "體驗"

推薦閱讀:

中文分詞評測
中文分詞演算法簡介
數學之美第四章談談分詞
jieba源碼解析(一)——中文分詞

TAG:R編程語言 | 中文分詞 |