Tys*_*son 1 java classification cluster-analysis weka k-means
我正在尝试用Java编写一组关于特定主题的新闻文章.我使用Crawler4J抓取了有关特定主题的新闻网站,将我自己的TF/IDF实现与语料库进行比较(有理由说我没有使用内置的Weka或TF/IDF的其他实现,但它们可能已经出来了这个问题的范围)并应用了一些其他特定于域的逻辑,这些逻辑为每个文档留下了一袋单词+权重(我将其存储在值为0到1之间的Map中).我想通过查看单词权重来聚类关于类似主题的文章,所以我开始使用Weka的EM和SimpleKMeans群集.问题是我得到了相当不起眼的结果,而且我
例如,在约300篇文章的玩具数据集中,如果我将每个文档中的单词修剪为前20,然后使用完整的单词作为特征,我最终得到~2k独特的特征.我正在使用每篇文章作为训练实例,并尝试使用一些不同的参数来调整SimpleKMeans聚类器(例如~20-30个聚类,100个最大迭代).当我一目了然地看到数据时,我发现很多文章的关键词看起来非常密切相关,所以我期望高质量的结果和一堆包含~5-10篇文章的集群.不幸的是,结果通常是一个集群,其中有一半的文章,一堆集群各有一篇文章,还有一些散落者有2-5篇左右的文章.
这些结果是预期的,还是有办法获得更高质量的结果?请注意,我还研究了LingPipe和其他提供集群功能的框架,并使用滚动我自己的EM实现(具有适度但不是很大的成功).在此先感谢您的帮助!
有几种技巧可以使k -means适用于文本:
简单解释为什么规范化有效:假设你有三个文件{d 1,d 2,d 3},以及微小的词汇{cat,dog,tax}.术语 - 文档矩阵(原始计数或tf-idf,无关紧要)看起来像
| cat | dog | tax
d? | 100 | 100 | 0
d? | 10 | 10 | 0
d? | 0 | 0 | 100
Run Code Online (Sandbox Code Playgroud)
现在我们要做2-means.我们可以合理地期望找到一个宠物群{d 1,d 2}和一个融资单群{d 3}.但是,对之间的距离是
D(d?, d?) = 127.28
D(d?, d?) = 173.21
D(d?, d?) = 101.00
Run Code Online (Sandbox Code Playgroud)
所以像k -means 这样的基于密度的方法倾向于用d 3对d 2进行分组.通过对矢量进行归一化,可以有效地将d 1和d 2映射到相同的矢量[0.71,0.71,0],因此D(d 1,d 2)= 0,它们将始终位于同一簇中.
(应用于归一化向量的k -means有时被称为"球形" k -means,因为单位向量位于以原点为中心的超球面上.)