我有一个(不完美的)群集字符串数据,其中一个群集中的项目可能如下所示:
[
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
],
最佳标题是'Yellow ripe banana'。
目前,我正在使用简单的启发式方法 - 在SQL GROUP BY的帮助下,选择最常见或最短的名称(如果是平局)。我的数据包含大量此类群集,它们经常更改,并且每次在群集中添加或删除新水果时,都必须重新计算群集的标题。
我想改进两件事:
(1)效率 - 例如,仅将新的水果名称与群集的标题进行比较,并且每次都避免对所有水果标题进行分组/短语聚类。
(2)精确度 - 我想提取最常用的短语,而不是寻找最常见的完整名称。目前的算法选择“黄色成熟”,重复2次,是最常见的完整短语;然而,正如短语“黄色成熟香蕉”在给定集合中最常见。
我正在考虑使用Solr + Carrot2(第二次没有经验)。此时,我不需要对文档进行聚类 - 它们已经基于其他参数进行聚类 - 我只需要选择中心短语作为聚类的中心/标题。
非常感谢任何输入,谢谢!
答案 0 :(得分:1)
Solr提供了一个名为ShingleFilter的分析组件,您可以使用它来从相邻单词组中创建标记。如果你把它放在你的分析链中(即在索引时将它应用于传入的文档),然后使用仅限于“水果群集”的查询计算结果字段的构面,您将能够获得所有的列表明显的带状疱疹及其出现频率 - 我认为你甚至可以按频率检索它们 - 你可以轻松地使用它我想要得到你想要的标题。然后当你添加一个新的水果时,它的带状疱疹将在下一次自动包含在方面计算中。
这个提案的更具体版本:
创建两个字段:fruit_shingle和cluster_id。
使用ShingleFilter配置fruit_shingle以及您可能需要的任何其他处理(例如,在ShingleFilter之前使用StandardTokenizer对字边界进行标记)。
将cluster_id配置为唯一ID,使用您用于识别群集的任何数据。
对于每个新水果,将其文本存储在fruit_shingle中,并将其ID存储在cluster_id中。
然后检索查询的facets:“cluster_id:”,您将获得单词,单词对,单词三元组等的列表(带状疱疹)。我相信你可以配置ShingleFilter有一个最大长度。通过您认为合适的长度和/或频率的某种组合对构面进行排序,并将其用作果实群集的“标题”。