1. 程式人生 > 其它 >R案例操作:RQDA和tm包結合進行文字挖掘

R案例操作:RQDA和tm包結合進行文字挖掘

應用定性資料分析包RQDA(Qualitative Data Analysis)和文挖掘框架包tm結合進行文字挖掘。

在對訪談內容或劇本、小說部分內容進行文字挖掘時,如果用不斷的剪粘儲存的方法非常繁瑣而且容易漏掉一些內容。好在黃榮貴開發的RQDA包可以進行文件管理和內容編碼及提取,大大方便了利用tm包進行文字挖掘,既提高了效率又提高了準確性,下面舉一個小例子:

1、安裝RQDA包、tm包和中文分詞軟體(分詞軟體見下面連結); http://www.pinggu.org/bbs/thread-853290-1-1.html

注:現在中文分詞軟體已經直接放到RQDAtm程式包中(https://r-forge.r-project.org/R/?group_id=137

),不需要另外安裝。

2、裝載RQDA包並建立一個新的工程專案;

3、輸入相關文字檔案;

4、進行編碼和作標記;

5、雙擊想要提取的編碼即可提取相關文字;

6、執行下面下載的程式進行文字提取、轉換、分詞、文字挖掘工作。

> gg <- RQDA2tm("記者" ,mf = FALSE)
> gg
A corpus with 55 text documents
>
------------------------------------------------
> ###  去掉多餘空格  ####> reuters <- tm_map(gg, stripWhitespace)
> reuters[[1]]
這個也是臨時改的?這兒應該放一個那樣的桌子。
>
------------------------------------------------
> ##  全文搜尋   ##> searchFullText(gg[[1]], "是臨[時]?改")
[1] TRUE>
------------------------------------------------
> ###  查詢以某字開頭、結尾等的詞條  ###> stemCompletion(gg, c("財", "政", "部"))
                  財                        政                       部"財政部就是替政府花錢的"                       ""                       ""------------------------------------------------
> ###  元資料管理  ###> DublinCore(reuters[[2]], "title") <- "建國60週年"> meta(reuters[[2]])
Available meta data pairs are:
  Author       :
  DateTimeStamp: 2010-07-15 02:06:27
  Description  :
  Heading      : 建國60週年
  ID           : 2
  Language     : eng
  Origin       :
>
------------------------------------------------
> ###  建立詞條-檔案矩陣>
> dtm <- DocumentTermMatrix(reuters,control = list(minWordLength=2))##最短詞兩個字> inspect(dtm[1:2, 3:6])
A document-term matrix (2 documents, 4 terms)
Non-/sparse entries: 0/8Sparsity           : 100%
Maximal term length: 5Weighting          : term frequency (tf)
    Terms
Docs 10000 12 120 1966
   1     0  0   0    0
   2     0  0   0    0------------------------------------------------
> ##  操作詞條-檔案矩陣  ##> ##  1、找出最少出現過3次的詞條  ##> findFreqTerms(dtm, 3)
[1] "政策"------------------------------------------------
> ##  2、找出與"應該"相關度到少達0.6的詞條  ###> findAssocs(dtm, "應該", 0.6)0.11 應該 桌子 臨時1.0  1.0  1.0  0.7>

其他看上面的連結中的內容,其實生成詞條-檔案矩陣後還有許多工作可以做,比如用支援向量機進行檔案分類、話題分類、根據話題用詞頻率分析作者所熟悉的行業等等……

民網 >> 時政 >> 時政專題 >> 網友進言

http://politics.people.com.cn/GB/8198/138817/index.html

MetaID fname fid 1 0 公安部答覆本網網友關於輕微交通違法處罰等4問題 1 2 0 公安部答覆本網網友關於駕齡計算、異地購車上牌、老人駕車等8問題 2 3 0 公安部答覆本網網友關於如何轉回農業戶口等3問題 3 4 0 公安部回覆本網網友關於駕駛證年檢被登出等3問題 4 5 0 公安部回覆人民網網友關於異地繳交通罰款等4問題 5 6 0 公安部回覆人民網網友關於身份證重號錯號等4問題 6

一、出現5次以上的詞條 —————————————————————————- 1、根據編碼“網友”分析:

gg <- RQDA2tm("網友" ,mf = TRUE)
> findFreqTerms(dtm, 5)
[1] "駕駛"   "身份證" "問題"

—————————————————————————- 2、根據編碼“公安部迴應”分析:

gg <- RQDA2tm("公安部迴應" ,mf = TRUE)
> findFreqTerms(dtm, 5)
[1] "辦理"   "部門"   "公安"   "管理"   "規定"   "機動車" "機關"   "交通"[9] "安全"   "不得"   "車輛"   "道路"   "駕駛"   "駕駛證" "汽車"   "實施"[17] "使用"   "小型"   "營運"   "載貨"   "載客"   "證明"   "工作"   "法律"[25] "公民"   "居民"   "社會"   "身份"   "身份證" "條件"   "相關"   "行為"[33] "證件"   "措施"   "違法"   "應當"   "公安部" "資訊"

************************************************************** 二、找出與“駕駛”相關達70%以上的詞條 —————————————————————————- 1、根據編碼“網友”分析:

> findAssocs(dtm, "駕駛", 0.7)
  駕駛 公安部   能否   規定   駕照   汽車  1.00   0.87   0.80   0.79   0.78   0.72

—————————————————————————- 2、根據編碼“公安部迴應”分析:

> findAssocs(dtm, "駕駛", 0.7)
  駕駛   需要   期限   證明   小型   法律   使用   中型 駕駛證   依法   檢查  1.00   0.95   0.90   0.86   0.84   0.83   0.80   0.79   0.77   0.77   0.75
  有效   超過  0.75   0.72

************************************************************** MetaID fname fid 1 0 公安部答覆本網網友關於輕微交通違法處罰等4問題 1 2 0 公安部答覆本網網友關於駕齡計算、異地購車上牌、老人駕車等8問題 2 3 0 公安部答覆本網網友關於如何轉回農業戶口等3問題 3 4 0 公安部回覆本網網友關於駕駛證年檢被登出等3問題 4 5 0 公安部回覆人民網網友關於異地繳交通罰款等4問題 5 6 0 公安部回覆人民網網友關於身份證重號錯號等4問題 6

對上面的資料改為將每條迴應為研究物件進行文件聚類分析,結果如下:

綜合上面兩種聚類分析可以判斷:公安部負責對人民網網民進行迴應的工作人員有兩名,因為每個人的寫作用詞習慣是比較固定的。

對三位房地產大佬在搜房網部落格近期文章的分析:

搜房網部落格連結: 潘石屹 http://blog.soufun.com/blog_132261.htm 王石 http://blog.soufun.com/blog_1525150.htm 任志強 http://blog.soufun.com/blog_1796106.htm

標題:

> txt
  MetaID                          fname fid ID
1      0  穿越“鬼門關”登山者視界4(王)   3  1
2      0       美麗的建築網友交流42(王)   7  2
3      0 如何瞭解日本民族網上交流43(王)   8  3
> txt
  MetaID                            fname fid ID
1      0   從發改委的檔案看政策的變化(任)   4  1
2      0                   該不該降價(任)   6  2
3      0                 聽老柳侃管理(任)  11  3
4      0 穩定、明確的政策預期更為重要(任)  12  4
5      0   先拆還是先建,這是一門藝術(任)  13  5
6      0   幸福指數——再次寫給八零後(任)  16  6
> txt
   MetaID                                                 fname fid ID
1       0                      IPAD現象預示了社會結構的變化(潘)   1  1
2       0                              SOHO中國進駐上海外灘(潘)   2  2
3       0                        房地產業要做受人尊重的行業(潘)   5  3
4       0                商業地產與住房是兩個完全不同的市場(潘)   9  4
5       0                              世界正經歷分娩之陣痛(潘)  10  5
6       0                現在中國房地產市場上“尖叫”聲一片(潘)  14  6
7       0                                信仰改變了我的生命(潘)  15  7
8       0               銀河SOHO和光華路SOHO2通過LEED預認證(潘)  17  8
9       0                     銀河SOHO開盤三天銷售46.75億元(潘)  18  9
10      0 致《酥油》作者: 你的愛和我們的感受構成世界的力量(潘)  19 10
> 

結果:

> ##  任志強最喜歡的用詞:> inspect(dtm_rzq[,j])
A document-term matrix (6 documents, 10 terms)
Non-/sparse entries: 41/19Sparsity           : 32%
Maximal term length: 2Weighting          : term frequency (tf)
    Terms
Docs 價格 企業 租賃 發展 改革 沒有 社會 一代 知道 中國   1    0    1    5    4    7    0    3    0    0    6
   2   31    2    0    3    1    7    4    0    4   15
   3    0   42    0    4    0    5    4    0    0    2
   4    9    1    0    0    0    7    4    0    3    4
   5    1    0   25    3    0    6    4    0    2    4
   6    1    5    0   25   48   30   55   41   35   51> ##  潘石屹最喜歡的用詞:> inspect(dtm_psy[,j])
A document-term matrix (10 documents, 9 terms)
Non-/sparse entries: 49/41Sparsity           : 46%
Maximal term length: 4Weighting          : term frequency (tf)
    Terms
Docs 一個 商業 上海 外灘 專案 房地產 市場 土地 soho  1    17   12    0    0    0      4    4    1    1
  2     6   17   15   27   21      1    2    2    6
  3     8    0    0    0    2     11    2   10    0
  4     6   16    0    0    2      0    5    0   13
  5    10    2    0    0    6      0    0    0    9
  6     5    4    3    0    1     17   37   15    0
  7     5    0    0    0    1      0    1    0    0
  8     1    0    0    0    8      0    0    0    7
  9     1   15    0    0    4      0    9    0   18
  10    7    0    0    0    0      0    0    1    0> ##  王石最喜歡的用詞> inspect(dtm_ws[,j])
A document-term matrix (3 documents, 16 terms)
Non-/sparse entries: 17/31Sparsity           : 65%
Maximal term length: 2Weighting          : term frequency (tf)
    Terms
Docs 冰川 穿越 攀登 融化 珠峰 處理 東京 焚燒 垃圾 等級 瞭解 日本 喜歡 相撲   1   18    6    4    8    4    0    0    0    0    0    0    0    0    0
   2    0    0    0    0    0    4    4    8   11    0    0    1    0    0
   3    0    0    0    0    0    0    0    0    0    4    4    7    4   10
    Terms
Docs 運動 秩序   1    0    0
   2    0    0
   3    4    6

由此看來王石仍然在到處玩兒,怪不得從萬科A到萬科B,再到萬科債券08G1、08G2都跌的一塌糊塗。任志強的興趣仍在研究國家政策,憂國憂民啊! 老潘的工作重點已經轉到上海的商業地產了。

現在再用支援向量機的方法對上面的資料建模,看是否能分辨出某些話是誰說的:

> library(e1071)
> ##  生成訓練用的資料   ##………………
> tt <- rbind(tt,tt1)
>
> tt[is.na(tt)]<-0> tt[,"作者"] <- factor(tt[,"作者"])
> model <- svm(作者 ~ ., data = tt[c(1:4,7:14,17:18),], kernel = "sigmoid")
> summary(model)
Call:
svm(formula = 作者 ~ ., data = tt[c(1:4, 7:14, 17:18), ], kernel = "sigmoid")
Parameters:
   SVM-Type:  C-classification
SVM-Kernel:  sigmoid
       cost:  1
      gamma:  0.01666667
     coef.0:  0Number of Support Vectors:  10( 4 4 2 )
Number of Classes:  3Levels:
潘石屹 任志強 王石
> ##   模型擬合測試  ##> ##  訓練集(樣本內)擬合     ##> pred <- predict(model, tt[c(1:4,7:14,17:18),1:length(hh)])
> table(pred, tt[c(1:4,7:14,17:18),"作者"])
pred     潘石屹 任志強 王石
  潘石屹      7      0    0
  任志強      1      4    0
  王石        0      0    2> ##  測試集(樣本外)預測     ##> pred <- predict(model, tt[c(5:6,15:16,19),1:length(hh)])
> table(pred, tt[c(5:6,15:16,19),"作者"])
pred     潘石屹 任志強 王石
  潘石屹      2      0    0
  任志強      0      2    0
  王石        0      0    1

訓練集中有一個錯的,但預測集中全中。 ******************************************************* 哪麼隨機找兩段他們的話看能判斷出嗎?

>
> test <- c("昨天休息了一天,駐地村子現在很大,二年前很小,自首位成功登上珠穆朗瑪峰的探險家埃德蒙.希拉里組織義工建立學校醫療診所,當地條件開始顯著改善,目前這裡三分之一的當地人已經移民國外,境外一些人士建立了一些家庭小旅館,衛生條件不錯,紐西蘭獅子會建立了一家小衛生所,以改善當地的醫療條件。這些讓我體會到登山這項運動對當地生活條件改善的有益影響。")
>………………
> tt1[,c(test_h)] <- test_tt[,c(test_h)]
> tt1[is.na(tt1)]<-0> predict(model, tt1)
   1
王石
Levels: 潘石屹 任志強 王石
>

對了,是《珠峰零公里口述之四 (2010-4-9 16:06:22)》中的一段話。 ++++++++++++++++++++++++++++++++++++++++

> test <- c("2007年出臺的“第二套住房的信貸”新政,讓中國的房地產市場調頭直下,在“兩防”的政策推力和美國的金融危機雙重作用之下,讓中國的巨集觀經濟也隨之調頭直下,GDP快速下降到6.3%,從而讓中國政府不得不用四萬億元投資、放量的貨幣信貸和解封“第二套住房信貸”改為0.7倍信貸降息和對改善性住房(實際的第二套)信貸給以支援,才讓中國的房地產和巨集觀經濟從谷底翻轉恢復到保八之上。
+ ")
……………………
> tt1[,c(test_h)] <- test_tt[,c(test_h)]
> tt1[is.na(tt1)]<-0> predict(model, tt1)
     1
任志強
Levels: 潘石屹 任志強 王石
>

也對了,是《何需分清幾套房 (2010-4-29 9:38:52) 》中的一段話

那麼下面這段文字是誰寫的呢?

test <- c("經常有人問我第一桶金怎麼來的,從哪裡得到的,有多少。其實每次有人問我這個問題時,我都想說,人的第一桶金是自信。即使你沒錢也不要怕,自信就是你的資本。也有人在自信前面加了一個不好的修飾語,叫盲目自信,我不太愛聽。我說過很多次自我的害處,但我認為與自我有點關係的不多的好東西之一,就是自信。自信當然有自我意識,還有信,相信的信。相信,是正面的、健康的。要相信自己。一個相信自己的人才會相信他人,相信未來。")
> predict(model, tt1)     1潘石屹
Levels: 潘石屹 任志強 王石

太神奇了!潘石屹——《自信是人生第一桶金》的一段。見下面的連結:

http://www.pinggu.org/bbs/thread-863705-1-1.html

再根據他們所用的詞頻看看他們三人之關係誰更近一點:

> dist(tt_s)
..........潘石屹   任志強
任志強 243.6945
王石   161.1552 204.2890