(注意: 大家下载我的程序源码以后,可能需要从网络上下载一个新的ictclas3.0包,然后覆盖原工程文件中的ictclas3.0组件,可能是因为ictclas3.0的license许可,一份ictclas3.0包只可以在一台电脑中使用,目前已经有网友遇到了类似的问题。)
作者:finallyliuyu 转载使用等请注明出处
1。如何建立词袋子模型
前言:
园子里有很多人对聚类算法感兴趣,在GOOGLE检索里比较靠前的有
蛙蛙推荐:蛙蛙教你文本聚类 此版本代码用C#语言编写
以及洞庭散人根据上面这篇蛙蛙博文用C++语言实现的k-means算法。 基于kmeans 的文本聚类
那么读者会纳闷,既然有了上面的资料,我是否还有什么必要在这里嚼别人嚼过的馍,来显摆一个C++菜鸟的拙劣代码。。。
那么我就先来说说我这版k-means 与以上两个版本的不同吧。
以上两个版本,着重点在于 Kmeans聚类算法本身的实现,也就是蛙蛙和洞庭散人分别用了C#和C++语言实现了Kmeans算法,而称不上是真正意义上的文本聚类:1。他们没有嵌入分词组件,只是自己粗糙地写了个以空格作为分隔符的分词函数。2。他们没有真正意义上的语料库。他们的待聚类文本是自己写的几句话。
而我这版kmeans,并不是侧重于实现Kmeans算法本身的实现,而且借助于数据挖掘领域著名的开源组件weka来实现聚类算法。我的侧重点在于实现通用的文本预处理模块。所谓文本预处理包括分词-》去除停用词=》建立词袋子模型=》特征词选择=》建立文档向量模型(VSM)模型。最后将测试文本的VSM模型写成weka所要求的数据格式arff数据格式。我所强调的是提供一个开源的框架,只要完成我框架中所满足的要求配置就可以用此框架完成文本预处理工作,将训测试文档集合转化成arff数据格式然后调用weka,使用weka完成文本聚类工作。最后将weka计算得到的聚类中心取出来,对于测试样本集合中的每篇文章计算其与聚类中心的距离,完成聚类。
其次我还将提供真实的文本,提供了分属“娱乐”,“法制”,“教育”三个类别供六十六篇新闻作为测试语料库(注:此六十六篇新闻均为个人实现的网页正文提取软件采集,如果大家需要语料,那么可以下载我的毕设程序自行下载,详情请见《新闻类网页正文提取系列博文》)。给大家做演示。同时我会将源码,新闻上传到博客中供大家下载,研究和学习使用。
首先声明一点:在我的这套框架内,测试文本必须存放在数据库中(MSSQL server2000)。目前这套框架还有很多不完善的地方,就当抛砖引玉吧,希望园子里的高人和能人予以指点。
先给大家上两个截图,看看聚类效果吧。
测试语料库情况(部分截图):
聚类后的结果:
为了能让读者更清晰地观察测试样本集聚类前后情形,特提供语料数据库储存情况,聚类结果下载见:http://files.cnblogs.com/finallyliuyu/Cluster.rar
本系列博文将按如下规划展开 首先 分别介绍各各模块程序代码的含义, 其次介绍封装各个模块功能的类, 再次介绍该框架的使用说明,以及如何使用weka聚类,并且提供语料库和源代码下载。
各模块程序代码代码含义的介绍已经完成以下两个部分 见:
声明,这是本人用C++编写的第一个项目程序,希望大家只看思路,对于代码风格,形式批判接收,当然也欢迎大家多提意见,帮我提高编程能力。比如,我对如何函,变量,取个好名字一直很纠结。曾经接触过C,C++,C#,Java,Python,可是却犹如邯郸学步的那个人,看了众多的命名风格,学派,什么匈牙利命名法,什么简写法,什么第一个单词小写等等,把我弄的焦头烂额。。。希望大家多指点些函数命名的小窍门。
同时在这里感谢园友嗷嗷 以及Galactica 在写C++程序过程中给予我的无私的,及时的帮助,谢谢!