• R语言
  • RQDA和文挖掘框架包tm结合进行文本挖掘

应用定性数据分析包RQDA(Qualitative Data Analysis)和文挖掘框架包tm结合进行文本挖掘。

在对访谈内容或剧本、小说部分内容进行文本挖掘时,如果用不断的剪粘保存的方法非常繁琐而且容易漏掉一些内容。好在黄荣贵开发的RQDA包可以进行文档管理和内容编码及提取,大大方便了利用tm包进行文本挖掘,既提高了效率又提高了准确性,下面举一个小例子:

1、安装RQDA包、tm包和中文分词软件(分词软件见下面链接);

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

2、装载RQDA包并建立一个新的工程项目;

3、输入相关文本文件;

4、进行编码和作标记;

5、双击想要提取的编码即可提取相关文本;

6、运行下面下载的程序进行文本提取、转换、分词、文本挖掘工作。

> gg <- RQDA2tm("记者" ,mf = FALSE)<br />
> gg<br />
A corpus with 55 text documents<br />
><br />
------------------------------------------------<br />
> ###  去掉多余空格  ####<br />
> reuters <- tm_map(gg, stripWhitespace)<br />
> reuters[[1]]<br />
这个也是临时改的?这儿应该放一个那样的桌子。<br />
><br />
------------------------------------------------<br />
> ##  全文搜索   ##<br />
> searchFullText(gg[[1]], "是临[时]?改")<br />
[1] TRUE<br />
><br />
------------------------------------------------<br />
> ###  查找以某字开头、结尾等的词条  ###<br />
> stemCompletion(gg, c("财", "政", "部"))<br />
                  财                        政                       部<br />
"财政部就是替政府花钱的"                       ""                       ""<br />
------------------------------------------------<br />
> ###  元数据管理  ###<br />
> DublinCore(reuters[[2]], "title") <- "建国60周年"<br />
> meta(reuters[[2]])<br />
Available meta data pairs are:<br />
  Author       :<br />
  DateTimeStamp: 2010-07-15 02:06:27<br />
  Description  :<br />
  Heading      : 建国60周年<br />
  ID           : 2<br />
  Language     : eng<br />
  Origin       :<br />
><br />
------------------------------------------------<br />
> ###  创建词条-文件矩阵<br />
><br />
> dtm <- DocumentTermMatrix(reuters,control = list(minWordLength=2))##最短词两个字<br />
> inspect(dtm[1:2, 3:6])<br />
A document-term matrix (2 documents, 4 terms)<br />
Non-/sparse entries: 0/8<br />
Sparsity           : 100%<br />
Maximal term length: 5<br />
Weighting          : term frequency (tf)<br />
    Terms<br />
Docs 10000 12 120 1966<br />
   1     0  0   0    0<br />
   2     0  0   0    0<br />
------------------------------------------------<br />
> ##  操作词条-文件矩阵  ##<br />
> ##  1、找出最少出现过3次的词条  ##<br />
> findFreqTerms(dtm, 3)<br />
[1] "政策"<br />
------------------------------------------------<br />
> ##  2、找出与"应该"相关度到少达0.6的词条  ###<br />
> findAssocs(dtm, "应该", 0.6)<br />
0.11 应该 桌子 临时<br />
1.0  1.0  1.0  0.7<br />
>


其他看上面的链接中的内容,其实生成词条-文件矩阵后还有许多工作可以做,比如用支持向量机进行文件分类、话题分类、根据话题用词频率分析作者所熟悉的行业等等……</p>

民网 >> 时政 >> 时政专题 >> 网友进言

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)<br />
> findFreqTerms(dtm, 5)<br />
[1] "驾驶"   "身份证" "问题"  
</p>

----------------------------------------------------------------------------

2、根据编码“公安部回应”分析:

gg <- RQDA2tm("公安部回应" ,mf = TRUE)<br />
> findFreqTerms(dtm, 5)<br />
[1] "办理"   "部门"   "公安"   "管理"   "规定"   "机动车" "机关"   "交通"<br />
[9] "安全"   "不得"   "车辆"   "道路"   "驾驶"   "驾驶证" "汽车"   "实施"<br />
[17] "使用"   "小型"   "营运"   "载货"   "载客"   "证明"   "工作"   "法律"<br />
[25] "公民"   "居民"   "社会"   "身份"   "身份证" "条件"   "相关"   "行为"<br />
[33] "证件"   "措施"   "违法"   "应当"   "公安部" "信息"  
</p>

**************************************************************

二、找出与“驾驶”相关达70%以上的词条

----------------------------------------------------------------------------

1、根据编码“网友”分析:

> findAssocs(dtm, "驾驶", 0.7)<br />
  驾驶 公安部   能否   规定   驾照   汽车<br />
  1.00   0.87   0.80   0.79   0.78   0.72


----------------------------------------------------------------------------

2、根据编码“公安部回应”分析:</p>

> findAssocs(dtm, "驾驶", 0.7)<br />
  驾驶   需要   期限   证明   小型   法律   使用   中型 驾驶证   依法   检查<br />
  1.00   0.95   0.90   0.86   0.84   0.83   0.80   0.79   0.77   0.77   0.75<br />
  有效   超过<br />
  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</p>

对上面的数据改为将每条回应为研究对象进行文档聚类分析,结果如下:

综合上面两种聚类分析可以判断:公安部负责对人民网网民进行回应的工作人员有两名,因为每个人的写作用词习惯是比较固定的。

因为不会这里的插入图片和附件方法,所以没有相关附件,抱歉。

4 天 后

对三位房地产大佬在搜房网博客近期文章的分析:

搜房网博客链接:

潘石屹

http://blog.soufun.com/blog_132261.htm

王石

http://blog.soufun.com/blog_1525150.htm

任志强

http://blog.soufun.com/blog_1796106.htm

标题:

> txt<br />
  MetaID                          fname fid ID<br />
1      0  穿越“鬼门关”登山者视界4(王)   3  1<br />
2      0       美丽的建筑网友交流42(王)   7  2<br />
3      0 如何了解日本民族网上交流43(王)   8  3<br />
> txt<br />
  MetaID                            fname fid ID<br />
1      0   从发改委的文件看政策的变化(任)   4  1<br />
2      0                   该不该降价(任)   6  2<br />
3      0                 听老柳侃管理(任)  11  3<br />
4      0 稳定、明确的政策预期更为重要(任)  12  4<br />
5      0   先拆还是先建,这是一门艺术(任)  13  5<br />
6      0   幸福指数——再次写给八零后(任)  16  6<br />
> txt<br />
   MetaID                                                 fname fid ID<br />
1       0                      IPAD现象预示了社会结构的变化(潘)   1  1<br />
2       0                              SOHO中国进驻上海外滩(潘)   2  2<br />
3       0                        房地产业要做受人尊重的行业(潘)   5  3<br />
4       0                商业地产与住房是两个完全不同的市场(潘)   9  4<br />
5       0                              世界正经历分娩之阵痛(潘)  10  5<br />
6       0                现在中国房地产市场上“尖叫”声一片(潘)  14  6<br />
7       0                                信仰改变了我的生命(潘)  15  7<br />
8       0               银河SOHO和光华路SOHO2通过LEED预认证(潘)  17  8<br />
9       0                     银河SOHO开盘三天销售46.75亿元(潘)  18  9<br />
10      0 致《酥油》作者: 你的爱和我们的感受构成世界的力量(潘)  19 10<br />
> 
</p>

结果:

> ##  任志强最喜欢的用词:<br />
> inspect(dtm_rzq[,j])<br />
A document-term matrix (6 documents, 10 terms)<br />
Non-/sparse entries: 41/19<br />
Sparsity           : 32%<br />
Maximal term length: 2<br />
Weighting          : term frequency (tf)<br />
    Terms<br />
Docs 价格 企业 租赁 发展 改革 没有 社会 一代 知道 中国<br />
   1    0    1    5    4    7    0    3    0    0    6<br />
   2   31    2    0    3    1    7    4    0    4   15<br />
   3    0   42    0    4    0    5    4    0    0    2<br />
   4    9    1    0    0    0    7    4    0    3    4<br />
   5    1    0   25    3    0    6    4    0    2    4<br />
   6    1    5    0   25   48   30   55   41   35   51</p>
<p>> ##  潘石屹最喜欢的用词:<br />
> inspect(dtm_psy[,j])<br />
A document-term matrix (10 documents, 9 terms)<br />
Non-/sparse entries: 49/41<br />
Sparsity           : 46%<br />
Maximal term length: 4<br />
Weighting          : term frequency (tf)<br />
    Terms<br />
Docs 一个 商业 上海 外滩 项目 房地产 市场 土地 soho<br />
  1    17   12    0    0    0      4    4    1    1<br />
  2     6   17   15   27   21      1    2    2    6<br />
  3     8    0    0    0    2     11    2   10    0<br />
  4     6   16    0    0    2      0    5    0   13<br />
  5    10    2    0    0    6      0    0    0    9<br />
  6     5    4    3    0    1     17   37   15    0<br />
  7     5    0    0    0    1      0    1    0    0<br />
  8     1    0    0    0    8      0    0    0    7<br />
  9     1   15    0    0    4      0    9    0   18<br />
  10    7    0    0    0    0      0    0    1    0<br />
> ##  王石最喜欢的用词<br />
> inspect(dtm_ws[,j])<br />
A document-term matrix (3 documents, 16 terms)<br />
Non-/sparse entries: 17/31<br />
Sparsity           : 65%<br />
Maximal term length: 2<br />
Weighting          : term frequency (tf)<br />
    Terms<br />
Docs 冰川 穿越 攀登 融化 珠峰 处理 东京 焚烧 垃圾 等级 了解 日本 喜欢 相扑<br />
   1   18    6    4    8    4    0    0    0    0    0    0    0    0    0<br />
   2    0    0    0    0    0    4    4    8   11    0    0    1    0    0<br />
   3    0    0    0    0    0    0    0    0    0    4    4    7    4   10<br />
    Terms<br />
Docs 运动 秩序<br />
   1    0    0<br />
   2    0    0<br />
   3    4    6
</p>

由此看来王石仍然在到处玩儿,怪不得从万科A到万科B,再到万科债券08G1、08G2都跌的一塌糊涂。

任志强的兴趣仍在研究国家政策,忧国忧民啊!

老潘的工作重点已经转到上海的商业地产了。

好吧,现在再用支持向量机的方法对上面的数据建模,看是否能分辨出某些话是谁说的:

> library(e1071)<br />
> ##  生成训练用的数据   ##</p>
<p>………………<br />
> tt <- rbind(tt,tt1)<br />
><br />
> tt[is.na(tt)]<-0<br />
> tt[,"作者"] <- factor(tt[,"作者"])<br />
> model <- svm(作者 ~ ., data = tt[c(1:4,7:14,17:18),], kernel = "sigmoid")<br />
> summary(model)<br />
Call:<br />
svm(formula = 作者 ~ ., data = tt[c(1:4, 7:14, 17:18), ], kernel = "sigmoid")</p>
<p>Parameters:<br />
   SVM-Type:  C-classification<br />
SVM-Kernel:  sigmoid<br />
       cost:  1<br />
      gamma:  0.01666667<br />
     coef.0:  0<br />
Number of Support Vectors:  10<br />
( 4 4 2 )</p>
<p>Number of Classes:  3<br />
Levels:<br />
潘石屹 任志强 王石<br />
> ##   模型拟合测试  ##<br />
> ##  训练集(样本内)拟合     ##<br />
> pred <- predict(model, tt[c(1:4,7:14,17:18),1:length(hh)])<br />
> table(pred, tt[c(1:4,7:14,17:18),"作者"])</p>
<p>pred     潘石屹 任志强 王石<br />
  潘石屹      7      0    0<br />
  任志强      1      4    0<br />
  王石        0      0    2<br />
> ##  测试集(样本外)预测     ##<br />
> pred <- predict(model, tt[c(5:6,15:16,19),1:length(hh)])<br />
> table(pred, tt[c(5:6,15:16,19),"作者"])</p>
<p>pred     潘石屹 任志强 王石<br />
  潘石屹      2      0    0<br />
  任志强      0      2    0<br />
  王石        0      0    1
</p>

训练集中有一个错的,但预测集中全中。

*******************************************************

哪么随机找两段他们的话看能判断出吗?

><br />
> test <- c("昨天休息了一天,驻地村子现在很大,二年前很小,自首位成功登上珠穆朗玛峰的探险家埃德蒙.希拉里组织义工建立学校医疗诊所,当地条件开始显著改善,目前这里三分之一的当地人已经移民国外,境外一些人士建立了一些家庭小旅馆,卫生条件不错,新西兰狮子会建立了一家小卫生所,以改善当地的医疗条件。这些让我体会到登山这项运动对当地生活条件改善的有益影响。")<br />
><br />
………………<br />
> tt1[,c(test_h)] <- test_tt[,c(test_h)]<br />
> tt1[is.na(tt1)]<-0<br />
> predict(model, tt1)<br />
   1<br />
王石<br />
Levels: 潘石屹 任志强 王石<br />
>


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

++++++++++++++++++++++++++++++++++++++++
> test <- c("2007年出台的“第二套住房的信贷”新政,让中国的房地产市场调头直下,在“两防”的政策推力和美国的金融危机双重作用之下,让中国的宏观经济也随之调头直下,GDP快速下降到6.3%,从而让中国政府不得不用四万亿元投资、放量的货币信贷和解封“第二套住房信贷”改为0.7倍信贷降息和对改善性住房(实际的第二套)信贷给以支持,才让中国的房地产和宏观经济从谷底翻转恢复到保八之上。<br />
+ ")<br />
……………………<br />
> tt1[,c(test_h)] <- test_tt[,c(test_h)]<br />
> tt1[is.na(tt1)]<-0<br />
> predict(model, tt1)<br />
     1<br />
任志强<br />
Levels: 潘石屹 任志强 王石<br />
>


也对了,是《何需分清几套房 (2010-4-29 9:38:52) 》中的一段话
</p>

那么下面这段文字是谁写的呢?

test <- c("经常有人问我第一桶金怎么来的,从哪里得到的,有多少。其实每次有人问我这个问题时,我都想说,人的第一桶金是自信。即使你没钱也不要怕,自信就是你的资本。也有人在自信前面加了一个不好的修饰语,叫盲目自信,我不太爱听。我说过很多次自我的害处,但我认为与自我有点关系的不多的好东西之一,就是自信。自信当然有自我意识,还有信,相信的信。相信,是正面的、健康的。要相信自己。一个相信自己的人才会相信他人,相信未来。")</p>
<p>> predict(model, tt1)<br />
     1<br />
潘石屹<br />
Levels: 潘石屹 任志强 王石
</p>

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

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

再根据他们所用的词频看看他们三人之关系谁更近一点:

> dist(tt_s)<br />
..........潘石屹   任志强<br />
任志强 243.6945<br />
王石   161.1552 204.2890
</p>

根据新浪微博的记录文字挖掘的娱乐圈关系图,关系近的人不一定认识,但性情、志趣相近,在一起一定有共同语言。

[/img]

经过因子分析后重新分类:

[/img]

[attachment=206600,420] [attachment=206600,421]

2 个月 后

是啊,顶起来[s:19]

7 天 后

现在中文分词软件已经直接放到RQDAtm程序包中(https://r-forge.r-project.org/R/?group_id=137),不需要另外安装。

7 天 后

回复 第11楼 的 cloud_wei:这个帖子一出来我就给加了标签。不过对这方面了解的人似乎不多,慢慢就沉了[s:11]

分类标签多了机器慢啊

15 天 后

不错,结合RCurl和XML包就更方便了,用文件管理网络上的文本似乎走了弯路。反正要用中科院那个分词的包,如果能在lucene上直接做全文检索甚至爬虫就更好了

回复 第16楼 的 leejian:

"用文件管理网络上的文本似乎走了弯路"

这是指?

回复 第17楼 的 sociology:

如果是分析网络上的文本,可以直接读成DOM树,提纯分析什么的都很方便,中间或者最终结果存入DB可能更好管理。不过如果来源本来就是文本文件就没什么问题。

6 个月 后

我看了作者在人大经济论坛上分享的挖掘程序贴,竟然要50个论坛币是不是多了点……能不能分享给广大劳苦民众呢?[s:18]

1 个月 后

最近在试这个,发现RQDA包里好像没有文本相关的函数,是因为都在RQDAtm或RQDA2tm里吗?windows版本的这两个包貌似还没推出。想问下tm中是只有英文的文本处理功能的,RQDAtm的中文分词功能是源自哪里?