1. 程式人生 > 資訊 >特斯拉解釋為何沒有 4S 店:直營模式更透明,電動汽車養護成本低

特斯拉解釋為何沒有 4S 店:直營模式更透明,電動汽車養護成本低

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條命令就可以了。

  1. ~ R
  2. > install.packages("jiebaR")
  3. > library("jiebaR")

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

  1. > library(devtools)
  2. > install_github("qinwf/jiebaRD")
  3. > install_github("qinwf/jiebaR")
  4. > library("jiebaR")

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

2. 5分鐘上手

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

  1. > wk = worker()
  2. > wk["我是《R的極客理想》圖書作者"]
  3. [1] "我是" "R" "的" "極客" "理想" "圖書" "作者"
  4. > wk["我是R語言的深度使用者"]
  5. [1] "我" "是" "R" "語言" "的" "深度" "使用者"

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

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

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

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

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

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

  1. # <= 符號定義
  2. `<=.qseg`<-function(qseg, code){
  3. if(!exists("quick_worker",envir = .GlobalEnv ,inherits = F) ||
  4. .GlobalEnv$quick_worker$PrivateVarible$timestamp != TIMESTAMP){
  5. if(exists("qseg",envir = .GlobalEnv,inherits = FALSE ) )
  6. rm("qseg",envir = .GlobalEnv)
  7. modelpath = file.path(find.package("jiebaR"),"model","model.rda")
  8. quickparam = readRDS(modelpath)
  9. if(quickparam$dict == "AUTO") quickparam$dict = DICTPATH
  10. if(quickparam$hmm == "AUTO") quickparam$hmm = HMMPATH
  11. if(quickparam$user == "AUTO") quickparam$user = USERPATH
  12. if(quickparam$stop_word == "AUTO") quickparam$stop_word = STOPPATH
  13. if(quickparam$idf == "AUTO") quickparam$idf = IDFPATH
  14. createquickworker(quickparam)
  15. setactive()
  16. }
  17. //..程式碼省略
  18. }
  19. # [ 符號定義
  20. `[.qseg`<- `<=.qseg`

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

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

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

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

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

  1. ~ notepad idea.segment.2016-07-20_23_25_34.txt
  2. 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()函式的定義。

  1. worker(type = "mix", dict = DICTPATH, hmm = HMMPATH, user = USERPATH,
  2. idf = IDFPATH, stop_word = STOPPATH, write = T, qmax = 20, topn = 5,
  3. encoding = "UTF-8", detect = T, symbol = F, lines = 1e+05,
  4. 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()時,就載入了分詞引擎,可以打印出來,檢視分詞的引擎的配置。

  1. > wk = worker()
  2. > wk
  3. Worker Type: Jieba Segment
  4. Default Method : mix # 混合模型
  5. Detect Encoding : TRUE # 檢查編碼
  6. Default Encoding: UTF-8 # UTF-8
  7. Keep Symbols : FALSE # 不保留符號
  8. Output Path : # 輸出檔案目錄
  9. Write File : TRUE # 寫檔案
  10. By Lines : FALSE # 不行輸出
  11. Max Word Length : 20 # 最大單單詞長度
  12. Max Read Lines : 1e+05 # 最大讀入檔案行數
  13. Fixed Model Components:
  14. $dict # 系統詞典
  15. [1] "D:/tool/R-3.2.3/library/jiebaRD/dict/jieba.dict.utf8"
  16. $user # 使用者詞典
  17. [1] "D:/tool/R-3.2.3/library/jiebaRD/dict/user.dict.utf8"
  18. $hmm # 隱式馬爾科夫模型模型
  19. [1] "D:/tool/R-3.2.3/library/jiebaRD/dict/hmm_model.utf8"
  20. $stop_word # 停止詞,無
  21. NULL
  22. $user_weight # 使用者詞典權重
  23. [1] "max"
  24. $timestamp # 時間戳
  25. [1] 1469027302
  26. $default $detect $encoding $symbol $output $write $lines $bylines can be reset.

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

  1. # 載入 pryr包
  2. > library(pryr)
  3. > otype(wk) # 面向物件的型別檢查
  4. [1] "S3"
  5. > class(wk) # 檢視class是屬性
  6. [1] "jiebar" "segment" "jieba"

4. 配置詞典

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

  1. # 檢視預設的詞庫位置
  2. > show_dictpath()
  3. [1] "D:/tool/R-3.2.3/library/jiebaRD/dict"
  4. # 檢視目錄
  5. > dir(show_dictpath())
  6. [1] "D:/tool/R-3.2.3/library/jiebaRD/dict"
  7. [1] "backup.rda" "hmm_model.utf8" "hmm_model.zip"
  8. [4] "idf.utf8" "idf.zip" "jieba.dict.utf8"
  9. [7] "jieba.dict.zip" "model.rda" "README.md"
  10. [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行。

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

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

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

  1. > scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/user.dict.utf8",
  2. + what=character(),nlines=50,sep='\n',
  3. + encoding='utf-8',fileEncoding='utf-8')
  4. Read 5 items
  5. [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。

  1. ~ notepad user.utf8
  2. R語言
  3. R的極客理想
  4. 大資料
  5. 資料

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

  1. > wk = worker(user='user.utf8')
  2. > wk['./idea.txt']
  3. [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個單詞,太簡單了,肯定是不夠用的。我們可以用搜狗詞典,來豐富使用者自己的詞庫。接下來,讓我們配置搜狗詞典。你需要安裝一個搜狗輸入法,具體的安裝過程不再解釋。

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

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

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

安裝cidian專案

  1. > install.packages("devtools")
  2. > install.packages("stringi")
  3. > install.packages("pbapply")
  4. > install.packages("Rcpp")
  5. > install.packages("RcppProgress")
  6. > library(devtools)
  7. > install_github("qinwf/cidian")
  8. > 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,正常情況下就能順利安裝

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

  1. # 轉換
  2. > decode_scel(scel = "./17960.scel",cpp = TRUE)
  3. output file: ./17960.scel_2016-07-21_00_22_11.dict
  4. # 檢視生成的詞典檔案
  5. > scan(file="./17960.scel_2016-07-21_00_22_11.dict",
  6. + what=character(),nlines=50,sep='\n',
  7. + encoding='utf-8',fileEncoding='utf-8')
  8. Read 50 items
  9. [1] "阿壩州 n" "阿百川 n" "阿班 n"
  10. [4] "阿賓 n" "阿波菲斯 n" "阿不都熱希提 n"
  11. [7] "阿不都西庫爾 n" "阿不力克木 n" "阿爾姆格倫 n"
  12. [10] "阿爾沙文 n" "阿肥星 n" "阿菲正傳 n"
  13. [13] "阿密特 n" "阿穆 n" "阿穆隆 n"
  14. [16] "阿帕魯薩鎮 n" "阿披實 n" "阿衰 n"
  15. [19] "阿霞 n" "艾奧瓦 n" "愛不疚 n"
  16. [22] "愛的錯位 n" "愛得得體 n" "愛的火焰 n"
  17. [25] "愛的流刑地 n" "愛得起 n" "埃夫隆 n"
  18. [28] "愛搞網 n" "愛國紅心 n" "愛呼 n"
  19. [31] "愛就宅一起 n" "埃克希兒 n" "愛沒有錯 n"
  20. [34] "埃蒙斯 n" "愛奴新傳 n" "愛起點 n"
  21. [37] "愛情的牙齒 n" "愛情海濱 n" "愛情節 n"
  22. [40] "愛情美的樣子 n" "愛情無限譜 n" "愛情佔線 n"
  23. [43] "愛情轉移 n" "愛情左燈右行 n" "愛上你是一個錯 n"
  24. [46] "矮哨兵 n" "愛是妥協 n" "愛似水仙 n"
  25. [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。這樣預設的使用者詞典,就是搜狗詞典了。很酷吧!

如果使用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檔案。

  1. ~ notepad stop_word.txt
  2. 我是

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

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

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

  1. > filter<-c("作者")
  2. > filter_segment(segment,filter)
  3. [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內容。

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

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

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

  1. > wk = worker()
  2. > segment<-wk["R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。"]
  3. # 計算詞頻
  4. > freq(segment)
  5. char freq
  6. 1 創新 1
  7. 2 了 1
  8. 3 文章 1
  9. 4 強大 1
  10. 5 R 3
  11. 6 個人 1
  12. 7 的 5
  13. 8 詮釋 1
  14. 9 和 1
  15. 10 一系列 1
  16. 11 使用 1
  17. 12 以 1
  18. 13 等 1
  19. 14 極客 1
  20. 15 理想 1
  21. 16 思想 1
  22. 17 涵蓋 1
  23. 18 系列 1
  24. 19 去 1
  25. 20 我 1
  26. 21 工具 1
  27. 22 學習 1
  28. 23 體驗 1
  29. 24 要點 1
  30. # 取TF-IDF的前5的關鍵詞
  31. > keys = worker("keywords",topn=5)
  32. # 計算關鍵詞
  33. > vector_keywords(segment,keys)
  34. 11.7392 8.97342 8.23425 8.2137 7.43298
  35. "極客" "詮釋" "要點" "涵蓋" "體驗"

使用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")