2011-09-16 15 views
1

的群集我有一个(不完全)聚集串数据,其中在一个集群中的项目可能是这样的:高效地选择一个标题(集群的中心)的字符串

[ 
    Yellow ripe banana very tasty, 
    Yellow ripe banana with little dots, 
    Green apple with little dots, 
    Green ripe banana - from the market, 
    Yellow ripe banana, 
    Nice yellow ripe banana, 
    Cool yellow ripe banana - my favourite, 
    Yellow ripe, 
    Yellow ripe 
], 

其中最优标题将是'黄色成熟的香蕉'

目前,我正在使用简单的启发式方法 - 在SQL GROUP BY的帮助下选择最常用的或最短的名称(如果绑定)。我的数据包含大量此类群集,它们频繁更改,并且每次向群集中添加或删除新的水果时,群集的标题都必须重新计算。

我想提高两件事情:

(1)效率 - 例如,新的水果名称比较仅集群的称号,并避免每次所有的水果称号的分组/短语集群。

(2)精密 - 而不是寻找最常见的全名,我想提取最常见的词组。目前的算法会选择'Yellow ripe',它重复2次,是最常见的完整短语;然而,正如这句话,'黄熟香蕉'是在给定的集合中最常见的。

我想使用Solr + Carrot2(没有经验的第二个)。在这一点上,我不需要对文档进行聚类 - 它们已经根据其他参数进行聚类 - 我只需要选择中心词组作为聚类的中心/标题。

任何输入是非常感激,谢谢!

+0

你有没有已知水果的清单?或者你以某种方式发现?因为其中一些琴弦实际上并没有在那里结果。 –

回答

1

Solr提供了一个称为ShingleFilter的分析组件,您可以使用它来从相邻单词组中创建令牌。如果你把它放在你的分析链中(例如,当你为它编制索引时将它应用到传入的文档中),然后计算结果字段的方面,查询仅限于“水果集群”,你将能够获得所有明显的带状疱疹以及它们的出现频率 - 我想你甚至可以按频率对它们进行检索 - 我可以很容易地使用它来推导出你想要的标题。然后,当你添加一个新的水果时,它的带状疱疹将在下一次自动包含在方面的计算中。

只是有点这个建议的更为具体的版本:

创建两个字段:fruit_shingle和CLUSTER_ID。

使用ShingleFilter和任何其他可能需要的处理来配置fruit_shingle(例如在ShingleFilter之前使用可能的StandardTokenizer标记字边界)。

将cluster_id配置为唯一ID,使用您用来识别群集的任何数据。

对于每个新的水果,将其文本存储在fruit_shingle中,并将其ID存储在cluster_id中。

然后检索查询的方面:“cluster_id:”,您将获得单词,单词对,单词三联体等(带状疱疹)的列表。我相信你可以将ShingleFilter配置成最大长度。按照您认为合适的长度和/或频率组合对各个面进行排序,并将其用作果实群的“标题”。

相关问题