教你文本聚类(参考http://www.kuqin.com/searchengine/20080511/8323.html)

来源:互联网 发布:挪威慢生活 知乎 编辑:程序博客网 时间:2024/06/13 02:59

参考 蛙蛙池塘 的 教你文本聚类 一文http://www.kuqin.com/searchengine/20080511/8323.html   以 Java 代码的形式予以实现。一下为我对此文的理解及源码。

 

   

 

    摘要:文本聚类是搜索引擎和语义web的基本技术,本文和大家一起学习一下简单的文本聚类算法,可能不能直接用于实际应用中,但对于想学搜索技术的初学者还是有一定入门作用的。下面简单列举该程序所涉及的内容:

   A》》TF/IDF权重

      TF-IDF(term frequency–inverse document frequency)

         这是一种用于信息检索的一种常用加权技术。它是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

 

          假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是 0.03 (3/100)。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是 10,000,000份的话,其文件频率就是 0.0001 (1000/10,000,000)。

 

         最后,TF-IDF分数就可以由计算词频除以文件频率而得到。以上面的例子来说,“母牛”一词在该文件集的TF- IDF分数会是 300 (0.03/0.0001)。这条公式的另一个形式是将文件频率取对数。(具体的计算原理,请参考维基百科tf–idf条目)

 

  B》》用余弦夹角计算文本相似度,用方差计算两个数据间欧式距离

 

          请参考 数学之美, 以便理解余玄相似度的实际理论应用。

 

  C》》用k-means进行数据聚类等数学和统计知识。关于这些概念可以去google,或者参考文本后的参考链接。

          请参考:http://beauty9235.javaeye.com/blog/161675

 

    文本聚类思路:计算两篇文档的相似度,最简单的做法就是用提取文档的TF/IDF权重,然后用余弦定理计算两个多维向量的距离。能计算两个文本间的距离后,用标准的k-means算法就可以实现文本聚类了,具体描述如下:

   

    1》文档预处理:1)文档分词;2)移除停用词;3)单词正规化处理

 

    2》分出的单词就作为索引项(或单词表),它们代表的就是向量空间的项向量

 

    3》计算项权值:这包括要计算1)词频 ; 2)倒排文件频率;3)TF-IDF权值

 

    4》计算文档之间的相似度,一般用余弦相似度(cosine similarity)一同使用于向量空间模型中,用以判断两份文件之间的相似性

测试:首先我们准备以下数据
===================
奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面
股民 要 清楚 自己 的 目的
印花税 之 股民 四季
杭州 股民 放 鞭炮 庆祝 印花税 下调
残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一
介绍 一 个 ASP.net MVC 系列 教程
在 asp.net 中 实现 观察者 模式 ,或 有 更 好 的 方法 (续)
输 大钱 的 股民 给 我们 启迪
Asp.Net 页面 执行 流程 分析
运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制
asp.net 控件 开发 显示 控件 内容
奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款
某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民
ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析
==================
很明显以上数据可以分为三类:asp.net,奥运和股民。

我们就写程序来实现它,蛙蛙池塘 已用 C# 实现了,但是为了加深理解,我将代码以Java的形式实现了一遍, 具体参见附件:

 

    下面对整个程序的思路作一下简单描述:

1. 首先要建立分词的方法,提取每个文本的词语,以便于其他方法的调用;

 

2. 建立构造在所有文本中出现过的词语的向量空间,以便于后面的相似度计算(该方法将调用 1中的方法变量所有的文本,然后构造词语   集合,得到词语的向量空间), 通过 Map<String, Integer> 构造每个词语的索引,便于到排序索引的建立。

 

3. 正向索引的获取:统计每个词语在每篇文档中的出现次数,描述如下:

       首先 1 中的方法提取文本中的词语,然后获得该文本的词语集合(即,消重);然后通过 Arrays.binarySearch  找到每个词语的位置,然后统计个数,记得每篇文章的词语的正向索引。

 

4. 实现到排序索引:(觉得很经典)

   调用 3 中的方法,构造到排序索引,并统计每个词语的文档频率 及 词语的最大文档频率(标准化处理每个词语的频率,为求 td/idf 做准备)

 

5. 其他地方的关键就在于 文本分词(在该例子中以 接口 实现, 以使的可以提供其他分词方法, 该类例子的实现只是以空    格的方式分割,分词方法正在研究中,希望与大家交流), K-nn聚类方法(该方法在原来的项目中做过,觉得优化空间不大,故只用原型)

 

聚类结果如下

Iteration 0...
Iteration 1...
Iteration 2...
-----------------
0  聚类成员是 :[2, 3, 7, 11]

印花税 之 股民 四季
杭州 股民 放 鞭炮 庆祝 印花税 下调
输 大钱 的 股民 给 我们 启迪
奥运 票务 网上 成功 订票 后 应 及时 到 银行 代售 网点 付款
-----------------
1  聚类成员是 :[0, 4, 9]

奥运 拳击 入场券 基本 分罄 邹市明 夺冠 对手 浮出 水面
残疾 女 青年 入围 奥运 游泳 比赛 创 奥运 历史 两 项 第一
运动员 行李 将 “后 上 先 下” 奥运 相关 人员 行李 实名制
-----------------
2  聚类成员是 :[1, 5, 6, 8, 10, 12, 13]

股民 要 清楚 自己 的 目的
介绍 一 个 ASP.net MVC 系列 教程
在 asp.net 中 实现 观察者 模式 ,或 有 更 好 的 方法 (续)
Asp.Net 页面 执行 流程 分析
asp.net 控件 开发 显示 控件 内容
某 心理 健康 站 开张 后 首 个 咨询 者 是 位 新 股民
ASP.NET 自定义 控件 复杂 属性 声明 持久性 浅析

 

   好了,写了这么多,我来列举下参考资料吧,当然也是对其他博主的知识产权的尊重,呵呵~

   http://www.cnblogs.com/onlytiancai/archive/2008/05/10/1191557.html

   http://blog.csdn.net/lkf0217/archive/2009/08/23/4475872.aspx

   http://mx19841031.javaeye.com/blog/224443

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Samule704/archive/2010/01/01/5116717.aspx

原创粉丝点击