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成熟',重复2次,是最常见的完整短语;然而,正如短语“黄熟香蕉”是给定集合中最常见的。

我正在考虑使用 Solr + Carrot2(没有第二个经验)。此时,我不需要对文档进行聚类——它们已经根据其他参数进行了聚类——我只需要选择中心短语作为聚类的中心/标题。

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

4

1 回答 1

1

Solr 提供了一个称为 ShingleFilter 的分析组件,您可以使用它从相邻的单词组中创建标记。如果你把它放在你的分析链中(即当你索引它们时将它应用到传入的文档中),然后使用限制为“水果簇”的查询计算结果字段的方面,你将能够获得所有不同的带状疱疹及其出现频率 - 我认为您甚至可以按频率排序检索它们 - 我认为您可以轻松使用它来得出您想要的标题。然后,当您添加新水果时,它的带状疱疹将自动包含在下一次的刻面计算中。

这个提议的更具体的版本:

创建两个字段:fruit_shingle 和 cluster_id。

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

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

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

然后检索查询的构面:“cluster_id:”,您将获得单词、单词对、单词三元组等(带状疱疹)的列表。我相信,您可以将 ShingleFilter 配置为具有最大长度。按您认为合适的长度和/或频率的某种组合对刻面进行排序,并将其用作水果簇的“标题”。

于 2011-09-16T20:00:33.200 回答