1

我正在尝试将一组关于特定主题的 Java 新闻文章聚集在一起。我使用 Crawler4J 抓取了有关特定主题的新闻网站,推出了我自己的 TF/IDF 实现与语料库进行比较(有一些原因,我没有使用内置的 Weka 或其他 TF/IDF 实现,但它们可能已经出局了这个问题的范围)并应用了一些其他特定于域的逻辑,这让我为每个文档留下了一袋单词+权重(我将其存储在值介于 0 和 1 之间的 Map 中)。我想通过查看单词权重来对类似主题的文章进行聚类,因此我开始使用 Weka 的 EM 和 SimpleKMeans 聚类器。问题是我得到了相当不起眼的结果,而且我

例如,在一个包含约 300 篇文章的玩具数据集中,如果我将单词修剪到每个文档中的前 20 个,然后使用完整的单词集作为特征,我最终会得到约 2k 个独特特征。我将每篇文章用作训练实例,并尝试一些不同的参数来调整 SimpleKMeans 集群器(例如 ~20-30 个集群,最大迭代 100 次)。当我一目了然地查看数据时,我发现很多文章的关键词似乎非常密切相关,所以我期望高质量的结果和包含约 5-10 篇文章的集群。不幸的是,结果通常是一个集群有超过一半的文章,一堆集群每个有 1 篇文章,以及一些散乱者有 2-5 篇左右的文章。

这些结果是预期的,还是有办法获得更高质量的结果?请注意,我还研究了 LingPipe 和其他提供集群功能的框架,并尝试滚动我自己的 EM 实现(取得了适度但不是很大的成功)。提前感谢您的帮助!

4

3 回答 3

6

有几个技巧可以使k均值适用于文本:

  1. 摆脱仅出现在少数文档(具有低 df)中的术语。这些人为地放大了向量空间中的距离。
  2. 规范化向量。这有点帮助,因为它消除了文档之间的长度差异。正如@Anony-Mousse 所指出的,它还使文档向量具有相似的差异。
  3. 在进行实际聚类之前,使用LSA执行降维,也就是截断的SVD 。这很有帮助。(一定要标准化 LSA 结果。)

归一化为什么起作用的简短解释:假设您有三个文档 {d₁, d₂, d₃} 和小词汇表 {cat, dog, tax}。术语文档矩阵(原始计数或 tf-idf,没关系)看起来像

   | cat | dog | tax
d₁ | 100 | 100 |   0
d₂ |  10 |  10 |   0
d₃ |   0 |   0 | 100

现在我们要做2-means。我们可以合理地期望找到一个宠物集群 {d₁, d₂} 和一个金融单例集群 {d₃}。然而,对之间的距离是

D(d₁, d₂) = 127.28
D(d₁, d₃) = 173.21
D(d₂, d₃) = 101.00

因此,像k -means 这样的基于密度的方法倾向于将 d₂ 与 d₃ 分组。通过对向量进行归一化,您可以有效地将 d₁ 和 d₂ 映射到同一个向量 [0.71, 0.71, 0] ,因此 D(d₁, d₂) = 0 并且它们将始终位于同一个簇中。

(应用于归一化向量的k均值有时称为“球形” k均值,因为单位向量位于以原点为中心的超球面上。)

于 2013-06-12T15:37:40.253 回答
2

如果你有词袋和它们的权重,那么你应该首先计算它们之间的一些相似性度量。例如 Jacquard Similarity、Cosine Similarity....然后有了这个基础,您可以使用 K-Means 或其他聚类算法对您的文章进行聚类。

如果您知道新闻文章只能是固定类型,如体育、娱乐、历史、政治等,那么我建议您使用分类算法而不是聚类算法,这将增加您获得良好和令人印象深刻的结果的可能性。

如果真的想使用聚类算法,请使用一些可以产生动态聚类的扩展算法(最近邻,遗传算法,质量阈值,最小生成树......)。

于 2013-07-09T12:08:16.343 回答
1

k-means 和 EM 模型都通过它们的平均向量聚类,相似性基于欧几里得。马氏距离。

问题是,对于稀疏数据,平均值可能不合理。这一点从手段比文档稀疏的事实中可以看出。此外,甚至可能出现这些装置变得比实际文档更相似的情况。

所以恕我直言,您只是为您的数据使用了不合适的聚类算法。有时它可能工作正常,但有时它会失败,因为该方法是为每个轴上相同方差的密集数据设计的。

于 2013-06-12T10:57:44.837 回答