R文本挖掘之二分詞

本文是轉載!原文地址:CSDN-R語言做文本挖掘 Part2分詞處理

Part2分詞處理

在RStudio中安裝完相關軟件包之後,才能做相關分詞處理,請參照Part1部分安裝需要軟件包。參考文檔:玩玩文本挖掘,這篇文章講用R做文本挖掘很詳盡,並且有一些相關資料的下載,值得看看!

1.       RWordseg功能

說明文檔可在http://download.csdn.net/detail/cl1143015961/8436741下載,這裏只做簡單介紹。

分詞

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. segmentCN(c("如果你因爲錯過太陽而流淚", "你也會錯過星星"))  
[[1]]

[1] "如果"""   "因爲" ""   ""   "太陽" "

[8] "流淚"

[[2]]

[1] ""   ""   ""   ""   ""   "星星"

可以看到分詞的效果不是很理想,“錯過”這是一個詞卻被分開了,說明詞庫中不存在這個詞,所以,我們有時候需要向詞庫中添加我們需要的詞語。

加詞刪詞

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. insertWords("錯過")  
  2. segmentCN(c("如果你因爲錯過太陽而流淚", "你也會錯過星星"))  
[[1]]

[1] "如果"""   "因爲" "錯過" "太陽" ""   "流淚"

[[2]]

[1] ""   ""   ""   "錯過" "星星"

有些情況下,你不希望某個詞被分出來,例如還是“錯過”這個詞,這裏“錯”和“過”語義上已經不應該是一個詞語了,所以,可以從詞典中刪除這個詞,再添加上你需要的詞語,繼續做分詞,效果就好多了。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. segmentCN("這個錯過去你可以犯,但是現在再犯就不應該了")  
 [1] "這個" "錯過" ""   ""   "可以" ""   "但是"

 [8] "現在" ""   ""   ""   ""   "應該" "

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. deleteWords("錯過")  
  2. insertWords("過去")  
  3. segmentCN("這個錯過去你可以犯,但是現在再犯就不應該了")  
 [1] "這個" ""   "過去" ""   "可以" ""   "但是"

 [8] "現在" ""   ""   ""   ""   "應該" ""

安裝卸載詞典

在做分詞處理時,可能會遇到一些比較精而專的文章,專業詞彙在詞庫裏面並沒有,這時候就需要去找相關的詞典,安裝到R中。例如,在做新聞分析中,一些娛樂新聞裏會有很多明星歌手的名字出現,這些名字在做分詞時,不會被識別爲一個個詞。此時可能需要添加一個名字的詞典,詞典可以是自己建也可以從網上找。推薦從搜搜狗輸入法的詞庫下載地址http://pinyin.sogou.com/dict/,可以選擇需要的分類詞典下載。

這裏我用到的一個詞典names的下載地址:http://pinyin.sogou.com/dict/cate/index/429

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. segmentCN("2015年的幾部開年戲都出現了唐嫣的身影")  
 [1] "2015" ""     "幾部"   ""     ""   

 [6] ""     ""     "出現"   ""     ""   

[11] ""     ""     "身影

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. installDict("D:\\R\\sources\\Dictionaries\\singers.scel", dictname ="names")  
3732 words were loaded! ... New dictionary 'names' was installed!

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. segmentCN("2015年的幾部開年戲都出現了唐嫣的身影")  
 [1] "2015" ""     "幾部"   ""     ""   

 [6] ""     ""     "出現"   ""     "唐嫣

[11] ""     "身影

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. listDict()  
   Name Type                          Des

1 names 明星官方推薦,詞庫來源於網友上傳

                                                      Path

1 E:/programFiles/R/R-3.1.2/library/Rwordseg/dict/names.dic

在不需要自己添加的詞典時,還可以刪除。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. uninstallDict()  
3732 words were removed! ... The dictionary 'names' wasuninstalled!

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. listDict()  
[1] Name Type Des  Path

<0 >(0-長度的row.names)

以上這些是基本的介紹,RWordseg還有更多的功能,請查看其中文文檔。

 

2.       對某品牌官微做分詞

數據來源是某服裝品牌的官方微博從2012年到2014年末的微博。數據的基本內容結構如下圖示,看內容大概能猜出來是哪個品牌了吧。


首先安裝跟服裝相關的詞典,同樣是從搜狗輸入法的詞庫中下載的兩個服飾類的詞典, 下載地址http://pinyin.sogou.com/dict/cate/index/397,這個地址下的前兩個詞庫。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. installDict("D:\\R\\sources\\Dictionaries\\fushi.scel",dictname = "fushi")  
  2. installDict("D:\\R\\sources\\Dictionaries\\Ali_fushi.scel",dictname = "alifushi")  
  3. listDict()  
   Name Type

1 names 明星

2 pangu Text

3 fushi 服飾

4   ali 服飾

下一步是將數據讀入R中,可以看到一共有1640條微博數據,注意數據的編碼格式,readLines默認讀取格式是gbk格式的,讀取格式不對時會亂碼。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj <-readLines("d:\\R\\RWorkspace\\orgData.txt",encoding ="UTF-8")  
  2. length(hlzj)  
[1] 1640

接下來就是做分詞了,要先去除數據中可能存在的數字和一些特殊符號,然後分詞。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzjTemp <- gsub("[0-90123456789 < > ~]","",hlzj)  
  2. hlzjTemp <- segmentCN(hlzjTemp)  
  3. hlzjTemp[1:2]  
[[1]]

 [1] "新品"     "推薦"     "時尚"     "迷彩"     "面料"     "設計"   

 [7] ""       "簡約"     ""       ""       "西"       "注入"   

[13] "非同凡響"""       "野性"     "魅力"     "良好"     ""     

[19] "防水"     "效果"     "使得"     "實用"     ""       ""     

[25] ""       ""       ""       "春日"     ""       ""     

[31] "亮點"     "春季"     "新品"     "海瀾之家" "男士"     "休閒"   

[37] "西服"     "韓版"     "迷彩"     "西裝"     "外套"     "HWXAJAA"

[[2]]

 [1] "小編"     "推薦"     "修身"     "薄款"     "連帽"     "暖心"   

 [7] "設計"     "防風"     "保暖"     "撞色"     "線條"     "設計"   

[13] "年輕"     "時尚"     "走親訪友" "休閒"     "出行"     ""     

[19] "時尚"     "選擇"     "活力"     "過冬"     "保暖"     "輕鬆"   

[25] "冬季"     "熱賣"     "海瀾之家" "正品"     "男士"     "保暖"   

[31] "連帽"     "羽絨服"   "外套"     "HWRAJGA"

可以看到微博內容都已經被做過分詞處理了,這個過程很簡單,但實際上可能需要多次查看分詞處理結果,有些詞庫中不存在所以被截開了的詞需要被添加進去,從而讓分詞效果達到最好。

 

3.       去停詞

分詞已經有結果了,但是分詞的結果中存在很多像,“吧”,“嗎”,“的”,“呢”這些無實際含義的語氣詞,或者是“即使”,“但是”這樣的轉折詞,或者是一些符號,這樣的詞就叫做停詞。要做進一步的分析可能需要去掉這些停詞。

先自己整理一個停詞表,這個停詞表是我自己找的,包含一些常見的停詞,然後根據實際內容中出現的一些無實際分析意義的詞語,就可以作爲我們的停詞表了,網上能找到別人已經整理好的停詞表。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. stopwords<- unlist(read.table("D:\\R\\RWorkspace\\StopWords.txt",stringsAsFactors=F))  
  2. stopwords[50:100]  
     V150       V151       V152       V153       V154       V155       V156

    "哎喲"       ""       ""     "俺們"       ""     "按照"       ""

      V157       V158       V159       V160       V161       V162       V163

    "吧噠"       ""     "罷了"       ""       ""     "本着"       ""

      V164       V165       V166       V167       V168       V169       V170

    "比方"     "比如"     "鄙人"       ""     "彼此"       ""       ""

      V171       V172       V173       V174       V175       V176       V177

    "別的"     "別說"       ""     "並且"     "不比"     "不成"     "不單"

      V178       V179       V180       V181       V182       V183       V184

    "不但"     "不獨"     "不管"     "不光"     "不過"     "不僅"     "不拘"

      V185       V186       V187       V188       V189       V190       V191

    "不論"     "不怕"     "不然"     "不如"     "不特"     "不惟"     "不問"

      V192       V193       V194       V195       V196       V197       V198

    "不只"       ""     "朝着"       ""     "趁着"       ""       ""

      V199      V1100

      """除此之外"

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. removeStopWords <- function(x,stopwords) {  
  2. temp <- character(0)  
  3. index <- 1  
  4. xLen <- length(x)  
  5. while (index <= xLen) {  
  6. if (length(stopwords[stopwords==x[index]]) <1)  
  7. temp<- c(temp,x[index])  
  8. index <- index +1  
  9. }  
  10. temp  
  11. }  

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzjTemp2 <-lapply(hlzjTemp,removeStopWords,stopwords)  
  2. hlzjTemp2[1:2]  
[[1]]

 [1] "新品"     "推薦"     "時尚"     "迷彩"     "面料"     "設計"   

 [7] "簡約"     ""       "西"       "注入"     "非同凡響" "野性"   

[13] "魅力"     "防水"     "效果"     "實用"     ""       ""     

[19] ""       ""       "春日"     ""       ""       "亮點"   

[25] "春季"     "新品"     "海瀾之家" "男士"     "休閒"     "西服"   

[31] "韓版"     "迷彩"     "西裝"     "外套"     "HWXAJAA"

[[2]]

 [1] "小編"     "推薦"     "修身"     "薄款"     "連帽"     "暖心"   

 [7] "設計"     "防風"     "保暖"     "撞色"     "線條"     "設計"   

[13] "年輕"     "時尚"     "走親訪友" "休閒"     "出行"     "時尚"   

[19] "選擇"     "活力"     "過冬"     "保暖"     "輕鬆"     "冬季"   

[25] "熱賣"     "海瀾之家" "正品"     "男士"     "保暖"     "連帽"   

[31] "羽絨服"   "外套"     "HWRAJGA"

跟hlzjTemp[1:2]的內容比較可以明顯發現“的”這樣的字都被去掉了。

 

4.       詞雲

詞雲是現在很常見的一種分析圖,把這些詞語放在一張圖中,頻次來顯示詞語的大小,這樣就能很直觀看出那些詞語出現得比較多,在輿情分析中經常被用到。

下面的過程是將分詞結果做一個統計,計算出每個詞出現的次數並排序,然後取排名在前150的150個詞語,用wordcloud()方法來畫詞雲。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. words <- lapply(hlzjTemp2,strsplit," ")  
  2. wordsNum <- table(unlist(words))  
  3. wordsNum <- sort(wordsNum) #排序  
  4. wordsData <- data.frame(words =names(wordsNum), freq = wordsNum)  
  5. library(wordcloud) #加載畫詞雲的包  
  6. weibo.top150 <- tail(wordsData,150) #取前150個詞  
  7. colors=brewer.pal(8,"Dark2")  
  8. wordcloud(weibo.top150$words,weibo.top150$freq,scale=c(8,0.5),colors=colors,random.order=F)  

該品牌微博的內容有很明顯的特徵,品牌名“海瀾之家”出現的次數遠大於其他詞語;其次出現頻度比較高的詞語是“鏈接”,“旗艦店”,“時尚”,“新品”,“修身”,“男裝”,可以大概看出這個該品牌專注於男裝,該微博賬號經常做新品推薦,可能會提供服裝鏈接到它的旗艦店;另外還能看到“全能星戰”,“奔跑吧兄弟”這樣的電視節目,稍微瞭解一下就知道,這是海瀾之家這兩年贊助的兩個節目,所以在它的微博中出現多次是很正常的。

原始數據就不共享了,大家可以另外找數據嘗試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章