【文本分析】利用jiebaR進行中文分詞
說在前面
中文分詞(Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞。分詞是文本分析中的關鍵步驟,只有分詞準確,才能生成正確的詞頻矩陣,對一篇文章或是以部小說進行合適的統計分析,得出許多有趣的結論。
然而,相對於英文來說,由於中文的一句話內詞與詞之間並沒有清晰的空格劃分,所以很多人就研究了許多演算法解決這一問題。在諸多的開源包中,jieba是我目前碰到的效果最好,最易用的中文分詞工具今天我們就主要介紹其在R語言的API介面:jiebaR。
1. 分詞
jiebaR提供了可以通過函數worker()來初始化分詞引擎,使用函數segment()進行分詞。其提供了四種分詞模式,分別基於以下演算法(摘自官方文檔):
最大概率法(MPSegment),負責根據Trie樹構建有向無環圖和進行動態規劃演算法,是分詞演算法的核心。
隱式馬爾科夫模型(HMMSegment)是根據基於人民日報等語料庫構建的HMM模型來進行分詞,主要演算法思路是根據(B,E,M,S)四個狀態來代表每個字的隱藏狀態。 HMM模型由dict/hmm_model.utf8提供。分詞演算法即viterbi演算法。
混合模型(MixSegment)是四個分詞引擎裡面分詞效果較好的類,結它合使用最大概率法和隱式馬爾科夫模型。
索引模型(QuerySegment)先使用混合模型進行切詞,再對於切出來的較長的詞,枚舉句子中所有可能成詞的情況,找出詞庫里存在。
而具體R語言實現例子如下:
library(jiebaR)nnmixseg <- worker() #worker()函數是用來初始化分詞引擎的,默認為混合模型。ntext <- "我們來一起學習數據科學"nsegment(text, mixseg) #segment函數可以進行分詞,返回的是一個向量。n[1] "我們" "來" "一起" "學習" "數據" "科學"nn還有另外一些寫法,可以代替segment函數:nmixseg[text]n[1] "我們" "來" "一起" "學習" "數據" "科學"nmixseg<=textn[1] "我們" "來" "一起" "學習" "數據" "科學"nn#當然還可以直接對一個文件進行分詞,比如:nsegment(D:/test.txt, mixseg) n
可以看到,分詞的效果還是不錯的。worker()函數是jiebaR里最為核心的函數,我們可以設置其眾多參數:
cc2 = worker(type = "mix", dict = "dict/jieba.dict.utf8",n hmm = "dict/hmm_model.utf8", n user = "dict/test.dict.utf8",n symbol = Fn ) n
這段代碼展示了其中比較關鍵的一些參數,其中type是演算法類型,dict是字典來源,如果不設置就會使用jiebaR默認的字典,同樣的hmm路徑和user路徑也一樣。symbol選項是F表示不保留標點。此外,還可以設置停詞字典,更多詳細具體的設置可以在R語言里用?worker()查看。
2. 標註詞性
可以使用 <=.tagger 或者 tag 來進行分詞和詞性標註,詞性標註使用混合模型模型分詞,標註採用和 ictclas 兼容的標記法。
words = "我愛北京天安門"ntagger = worker("tag")ntagger <= wordsnn#返回結果:n r v ns ns n "我" "愛" "北京" "天安門"n
3. 提取關鍵詞
關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑,使用方法與分詞類似。topn參數為關鍵詞的個數。
keys = worker("keywords", topn = 1)nkeys <= "我愛北京天安門"n 8.9954 n"天安門"n
返回結果之所以是天安門而沒有「北京」和「」我」等詞是因為這些詞的相對詞頻不高,在行文中太過常見。topn表示的是返回關鍵詞的個數,8.9954就是相對詞頻值。
我們也可以對古龍《多情劍客無情劍》第一章進行關鍵詞提取,結果如下:
keys = worker("keywords", topn = 4)nkeys <= gulongnn 516.525 264.77 247.599 234.873 n"李尋歡" "諸葛" "白蛇" "少年" n
4. simhash計算
對中文文檔計算出對應的simhash值。simhash是谷歌用來進行文本去重的演算法,現在廣泛應用在文本處理中。Simhash引擎先進行分詞和關鍵詞提取,後計算Simhash值和海明距離,官方例子如下:
words = "hello world!"nsimhasher = worker("simhash",topn=2)nsimhasher <= "江州市長江大橋參加了長江大橋的通車儀式"n$simhashn[1] "12882166450308878002"nn$keywordn 22.3853 8.69667 n"長江大橋" "江州"ndistance(words, "江州市長江大橋參加了長江大橋的通車儀式",simhasher)n$distancen[1] "23"nn$lhsn11.7392 11.7392 n"hello" "world" nn$rhsn 22.3853 8.69667 n"長江大橋" "江州"n
說在後面
關於機器學習的內容還未結束,請持續關注該專欄的後續文章。
更多內容請關注我的專欄:R Language and Data Mining
或者關注我的知乎賬號:溫如
推薦閱讀:
※打造自身長板- 學習數據分析,實現轉型之路(第一篇)
※【客戶案例】脈車人CRM的選擇:兩周內打造決策分析能力
※SparkSQL數據分析項目---數據可視化
※我用Python分析了42萬字的歌詞,為了搞清楚民謠歌手們在唱些什麼
※R語言之矩陣操作