加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

R语言做文本挖掘 Part3文本聚类

发布时间:2020-12-14 02:43:06 所属栏目:大数据 来源:网络整理
导读:Part3文本聚类 分类和聚类算法,都是数据挖掘中最常接触到的算法,分类聚类算法分别有很多种。可以看下下面两篇文章对常见的分类聚类算法的简介: 分类算法:http://www.voidcn.com/article/p-sfzgdwcd-pp.html 聚类算法:http://blog.chinaunix.net/uid-102

Part3文本聚类


分类和聚类算法,都是数据挖掘中最常接触到的算法,分类聚类算法分别有很多种。可以看下下面两篇文章对常见的分类聚类算法的简介:

分类算法:http://www.voidcn.com/article/p-sfzgdwcd-pp.html

聚类算法:http://blog.chinaunix.net/uid-10289334-id-3758310.html

文本分类聚类会要用到这些算法去实现,暂时不用深究算法细节,R中已经有成熟的可以直接调用的这些算法了。大概说下分类和聚类的差异,照我的理解,分类算法和聚类算法最后实现的效果是相同的,都是给一个集合划分成几个类别。不同的是分类算法是根据已知的确定类别去做划分,所以分类需要训练集,有训练、测试、预测这个过程;而聚类则未规定类别,它是基于给定集合的里面的内容,根据内容的相似度去给集合划分成指定的几个类(你可以指定划分成多少个类,而不是指定有哪些类),这些相似度的测量就是聚类算法的核心,这个度量标准可以是欧几里得距离、是曼哈顿距离、是切比雪夫距离等等。它们分别叫做有监督分类和无监督分类,这种说法不是很确切,参考这个文章分类与聚类,监督学习与无监督学习,有其差异的说明。

?

还是用Part2里面的例子。做聚类不需要训练集,将文本内容做完分词处理,也就是Part2里面2.对某品牌官微做分词,这里处理完得到的结果hlzjTemp,用这个做接下来的聚类工作。下图(图片来源:玩玩文本挖掘)是一个文本挖掘的过程,不管是分类还是聚类,都要经历前面一个过程将文本转为为Tem-Document Matrix。然后再做后续分析Analysis,及分类或者聚类。另一个参考:R语言进行中文分词和聚类


聚类算法是针对数值型变量的,先要将文本数据转换为matrix—数据矩阵。过程如下,这里需要用到tm软件包,先安装该软件包并加载。tm包中的Corpus()方法就是用来将文本转换为语料库的方法。DocumentTermMatrix()方法,显然就是将语料库转换为文档-词条矩阵,然后再将文档-词条矩阵转换为普通矩阵,过程如下:

>library(tm)

载入需要的程辑包:NLP

>corpus? <-Corpus(VectorSource(hlzjTemp))

> hlzj.dtm<- DocumentTermMatrix(corpus,control=list(wordLengths=c(1,Inf)))

>hlzj.matrix <- as.matrix(hlzj.dtm)

补充说明:这个过程可能会遇到很多问题,没有详细的说明,附上两个参考:用tm进行文本挖掘、R语言文本挖掘。

接下来就是做聚类了,聚类算法有很多,常见的几种做聚类的方法

1.??????kmeans()

方法的介绍参考:http://blog.sina.com.cn/s/blog_4ac9f56e0101h8xp.html。运行结果kmeansRes是一个list,names方法可以查看到kmeansRes的所有维度或者说组件,其中第一个cluster就是对应的分类结果,我们可以查看到前三十个聚类的结果,第一排对应着行号,第二排对应着聚类的结果1-5分别代表1-5类。然后我们可以将原始微博和聚类结果赋值给一个新的list变量,这样我们就能看到聚类结果和每条微博对应的关系了。最后将这个新的list变量hlzj.kmeansRes导出到本地,就能很方便地查看到聚类结果了。当然我们也可以通过fix()方法查看hlzj.kmeansRes的内容,如图所示,content是原微博内容,type是聚类结果。每个类别对应的文本数据的特点就要靠我们自己来总结了,这是聚类的一个不足的地方。

> k <- 5

> kmeansRes <- kmeans(hlzj.matrix,k) #k是聚类数

> mode(kmeansRes)#kmeansRes的内容

[1]"list"

> names(kmeansRes)

[1]"cluster"?????"centers"?????"totss"???????"withinss"???

[5]"tot.withinss" "betweenss"??? "size"???????? "iter"???????

[9]"ifault"

> head(kmeansRes$cluster,10)

?1?2? 3? 4?5? 6? 7?8? 9 10

?1?1? 1? 2?1? 5? 2?1? 1? 5

> kmeansRes$size #每个类别下有多少条数据

[1]? 327 ?1159?? 63??63?? 27

>hlzj.kmeansRes <- list(content=hlzj,type=kmeansRes$cluster)

> write.csv(hlzj.kmeansRes,"hlzj_kmeansRes.csv")

> fix(hlzj.kmeansRes)



2.??????hclust()。

方法详细介绍,过程不再细说http://blog.sina.com.cn/s/blog_615770bd01018dnj.html,这个方法可以用plot()来查看聚类结果图,但是在数据量挺多的时候,图的上面的内容都挤在一起看不清楚了,这种情况下,还是直接查看聚类结果比较好。同样,将原始数据hlzj和分类结果放在一起hlzj.hclustRes来看。可以看出类跟kmeans的聚类结果有些接近,说明微博的特征还是挺明显的。

> d <- dist(hlzj.matrix,method="euclidean")

> hclustRes <- hclust(d,method="complete")

> hclustRes.type <- cutree(hclustRes,k=5) #按聚类结果分5个类别

> length(hclustRes.type)

[1] 1639

> hclustRes.type[1:10]

?1?2? 3? 4?5? 6? 7?8? 9 10

?1?1? 1? 2?1? 2? 3?1? 1? 2

> hlzj.hclustRes <- list(content=hlzj,type=hclustRes.type)

> hlzj.hclustRes <- as.data.frame(hlzj.hclustRes)

>fix(hlzj.hclustRes)



?

3.??????kernel聚类,方法specc()

软件包kernlab中的specc()方法可以实现kernel聚类算法。查看这个包的说明文档,见链接http://127.0.0.1:25210/library/kernlab/doc/kernlab.pdf,这是本机的帮助文档,不知道大家的地址是不是都一致的,也可以输入??kernel查看帮助文档能看到。网上能够找到的翻译后的方法说明http://www.biostatistic.net/thread-49108-1-1.html。这个聚类结果五个分类的统计如下,第四个类别有1402个,其他分类分别是135,55,24和23,所以截图中看到前面23个都是4类下,用这个聚类可能效果不是很理想。具体实现过程如下:

> stringkern <-stringdot(type="string")

> kernelRes <-specc(hlzj.matrix,centers=5,kernel=stringkern)

> mode(kernelRes)

[1] "numeric"

> length(kernelRes)

[1] 1639

> kernelRes[1:10]

?1? 2?3? 4? 5? 6? 7?8? 9 10

?4? 4?4? 4? 4? 4? 4?4? 4? 4

> table(kernelRes)

kernelRes

?? 1??? 2???3??? 4??? 5

?135?? 55??24 1402?? 23

>temp <-t(kernelRes) #行列转换

> hlzj.kernelRes<-list(cotent=hlzj,type=temp[1:1639]

> hlzj.kernelRes <-as.data.frame(hlzj.kernelRes)

> fix(hlzj. kernelRes)

?

4.??????除此之外。

fpc软件包中的dbscan()方法可以实现dbscan聚类,还有其他的聚类方法,就不一一介绍了,优劣取舍要在实际应用中去控制了。

?

有什么可以改进的地方欢迎指正,转载请注明来源。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读