Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Weka的Java文档聚类_Java_Cluster Analysis_Classification_Weka_K Means - Fatal编程技术网

基于Weka的Java文档聚类

基于Weka的Java文档聚类,java,cluster-analysis,classification,weka,k-means,Java,Cluster Analysis,Classification,Weka,K Means,我试图用Java将一组关于特定主题的新闻文章进行分类。我使用Crawler4J对某个特定主题的新闻站点进行了爬网,将我自己的TF/IDF实现与语料库进行了比较。我没有使用内置的Weka或TF/IDF的其他实现是有原因的,但它们可能超出了这个问题的范围,并应用了一些其他特定于领域的逻辑,这给我留下了一个单词+权重包,我将每个文档存储在一个值介于0和1之间的映射中。我想通过查看单词权重来对类似主题的文章进行聚类,因此我开始使用Weka的EM和SimpleKMeans聚类器。问题是,我得到的结果并不令

我试图用Java将一组关于特定主题的新闻文章进行分类。我使用Crawler4J对某个特定主题的新闻站点进行了爬网,将我自己的TF/IDF实现与语料库进行了比较。我没有使用内置的Weka或TF/IDF的其他实现是有原因的,但它们可能超出了这个问题的范围,并应用了一些其他特定于领域的逻辑,这给我留下了一个单词+权重包,我将每个文档存储在一个值介于0和1之间的映射中。我想通过查看单词权重来对类似主题的文章进行聚类,因此我开始使用Weka的EM和SimpleKMeans聚类器。问题是,我得到的结果并不令人印象深刻,我正试图找出是否可以做些什么来更好地调整集群

例如,在一个约300篇文章的玩具数据集中,如果我将每个文档中的单词删减到前20位,然后将整个单词集用作特征,我最终会得到约2k个独特的特征。我将每一篇文章都用作一个训练实例,并尝试使用一些不同的参数来优化SimpleKMeans clusterer,例如~20-30个集群,最多迭代100次。当我一目了然地查看数据时,我发现许多文章的关键词似乎非常密切相关,因此我希望得到高质量的结果和一系列包含约5-10篇文章的聚类。不幸的是,结果通常是一个簇中有超过一半的文章,一堆簇中每个簇中有1篇文章,还有一些散居者有2-5篇文章左右


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

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

问题是,对于稀疏数据,平均值可能不合理。这一点可以从以下事实中得到最好的证明,即手段比文件少。此外,甚至可能出现的情况是,这些方法彼此之间的相似性大于实际文件


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

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

问题是,对于稀疏数据,平均值可能不合理。这一点可以从以下事实中得到最好的证明,即手段比文件少。此外,甚至可能出现的情况是,这些方法彼此之间的相似性大于实际文件


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

有几个技巧可以使k-means适用于文本:

去掉只出现在少数df较低的文档中的术语。这些人为地放大了向量空间中的距离。 规范化向量。这有点帮助,因为它消除了文档之间的长度差异。正如@Anony Mouse所指出的,它还使文档向量具有类似的方差。 在进行实际聚类之前,使用(也称为截断)执行降维。这很有帮助。确保LSA结果也正常化。 简要说明规范化工作的原因:假设您有三个文档{d₁, D₂, D₃}, 还有很小的词汇{cat,dog,tax},术语document matrix raw counts或tf idf看起来无关紧要

   | cat | dog | tax
d₁ | 100 | 100 |   0
d₂ |  10 |  10 |   0
d₃ |   0 |   0 | 100
现在我们要做2-means,我们可以合理地期望找到一个pets集群{d₁, D₂} 和一个金融单态集群{d₃}. 但是,对之间的距离是

D(d₁, d₂) = 127.28
D(d₁, d₃) = 173.21
D(d₂, d₃) = 101.00
因此,基于密度的方法,如k-means,将倾向于将d分组₂ 与d₃. 通过规范化向量,可以有效地映射₁ 和d₂ 到同一个向量[0.71,0.71,0]so Dd₁, D₂ = 0,并且它们将始终位于同一个群集中


应用于规范化向量的k-均值有时称为球面k-均值,因为单位向量位于以原点为中心的超球面上。

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

去掉仅出现在少数df较低的文档中的术语。这些术语人为地放大了向量空间中的距离。 规范化向量。这有点帮助,因为它消除了文档之间的长度差异。它还使文档向量具有类似的差异,正如@Anony mouse所指出的。 在进行实际聚类之前,使用(也称为截断)执行降维。这非常有帮助。请确保 也要使LSA结果正常化。 简要说明规范化工作的原因:假设您有三个文档{d₁, D₂, D₃}, 还有很小的词汇{cat,dog,tax},术语document matrix raw counts或tf idf看起来无关紧要

   | cat | dog | tax
d₁ | 100 | 100 |   0
d₂ |  10 |  10 |   0
d₃ |   0 |   0 | 100
现在我们要做2-means,我们可以合理地期望找到一个pets集群{d₁, D₂} 和一个金融单态集群{d₃}. 但是,对之间的距离是

D(d₁, d₂) = 127.28
D(d₁, d₃) = 173.21
D(d₂, d₃) = 101.00
因此,基于密度的方法,如k-means,将倾向于将d分组₂ 与d₃. 通过规范化向量,可以有效地映射₁ 和d₂ 到同一个向量[0.71,0.71,0]so Dd₁, D₂ = 0,并且它们将始终位于同一个群集中


应用于规范化向量的k-均值有时被称为球形k-均值,因为单位向量位于以原点为中心的超球体上。

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

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


如果你真的想使用聚类算法,可以使用一些扩展的算法来生成动态聚类最近邻、遗传算法、质量阈值、最小生成树……

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

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


如果真的想使用聚类算法,可以使用一些扩展的算法来生成动态聚类最近邻、遗传算法、质量阈值、最小生成树……

在将tf idf向量输入k-means之前,您是否对它们进行了标准化?这通常有助于使用L2,即欧几里德标准化。还有语言模型weighting可能比tf-idf更有效。谢谢,我必须研究规范化,因为我一眼就不明白它的作用。看起来Weka提供了一个可能有用的规范化向量?在将tf-idf向量输入k-means之前,您是否对其进行了规范化?这通常有助于使用L2,也称为欧几里德规范化。还有语言模型weighting可能比tf-idf更有效。谢谢,我必须研究规范化,因为我一眼就不明白它的作用。看起来Weka提供了一个规范化向量,可能有用?谢谢你的回答,尽管我承认我不完全理解,并同意Larsman的问题。你能建议一个不同的聚类算法吗rithm和/或一种准备/过滤我应该实验的数据的方法?感谢您的回复,尽管我承认我不完全理解,并分享了Larsman的问题。您能建议一种不同的聚类算法和/或一种准备/过滤我应该实验的数据的方法吗?非常感谢您提供的信息。我已经很满意了NG,我的关键字的TFIDF值是0到1之间的浮动。虽然我在我的解释中提到了我的愚蠢选择,但是我愚蠢的最初的实现是考虑任何文章中的任何一个术语,并用它来进行聚类。我今晚将用LSA进行实验,例子非常稀少,所以任何点。在Java代码中使用LSA会非常有帮助。根据@Anony Mousse的问题,你有信心K-Means会很适合功能选择,还是我应该尝试其他Clusterer?我使用1/3修剪低频率,使用LSA减少维度,结果会稍微好一些。44%的文章仍然属于一个Clusterer、 但是有7个集群包含5个以上的文章,它们似乎更适合数据。我如何将post LSA实例映射到我的原始实例?我是否依赖索引并假设顺序得到保留?@Tyson:没有理由不保留顺序,除非你有一个真正的错误实现。非常感谢这些信息。我已经很正常了虽然我的关键词的TFIDF值在0到1之间浮动,但是我的特征选择非常愚蠢,正如我在我的解释中提到的,我愚蠢的最初的实现是考虑任何文章中的任何一个术语,并用它来进行聚类。在Java代码中使用LSA将非常有帮助
-Mousse的问题是,你有信心K-Means会很适合功能选择吗?还是我应该尝试其他Clusterer?我使用1/3微调低频,使用LSA降低维度,结果会稍微好一点。44%的文章仍然属于一个集群,但有7个集群包含5篇以上的文章,这似乎更适合数据。如何将post LSA实例映射到原始实例?我是否依赖索引并假设顺序被保留?@Tyson:没有理由不保留顺序,除非你有一个真正的错误实现。