Эффективный выбор заголовка (центр кластера) для кластера строк - PullRequest
1 голос
/ 16 сентября 2011

У меня есть (несовершенно) кластеризованные строковые данные, где элементы в одном кластере могут выглядеть следующим образом:

[ 
  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) Precision - вместо того, чтобы искать наиболее распространенное полное имя, я хотел бы извлечь наиболее распространенную фразу. Текущий алгоритм выбрал бы «Желтый спелый», который повторяется 2 раза и является наиболее распространенной полной фразой; однако, как фраза «Желтый спелый банан» является наиболее распространенным в данном наборе.

Я думаю об использовании Solr + Carrot2 (не получил опыта со вторым). На этом этапе мне не нужно кластеризовать документы - они уже сгруппированы на основе других параметров - мне нужно только выбрать центральную фразу в качестве центра / заголовка кластера.

Любой вклад очень ценится, спасибо!

1 Ответ

1 голос
/ 17 сентября 2011

Solr предоставляет компонент анализа, называемый ShingleFilter, который можно использовать для создания токенов из групп смежных слов. Если вы поместите это в свою цепочку анализа (то есть примените ее к входящим документам при их индексации), а затем вычислите фасеты для результирующего поля с запросом, ограниченным «кластером фруктов», вы сможете получить список всех различные черепицы вместе с частотой их появления - я думаю, что вы даже можете извлечь их отсортированные по частоте - которые вы можете легко использовать, я думаю, чтобы получить название, которое вы хотите. Затем, когда вы добавите новый фрукт, его черепица будет автоматически включена в вычисления фасетов в следующий раз.

Чуть более конкретная версия этого предложения:

создайте два поля: fruit_shingle и cluster_id.

Сконфигурируйте fruit_shingle с ShingleFilter и любой другой обработкой, которая вам может понадобиться (например, токенизация на границах слов с помощью, возможно, StandardTokenizer, до ShingleFilter).

Сконфигурируйте cluster_id как уникальный идентификатор, используя любые данные, которые вы используете для идентификации кластеров.

Для каждого нового фрукта сохраняйте его текст в fruit_shingle и его идентификатор в cluster_id.

Затем получите фасеты для запроса: "cluster_id:", и вы получите список слов, пар слов, триплетов слов и т. Д. (Черепица). Я думаю, вы можете настроить максимальную длину ShingleFilter. Сортируйте грани по некоторой комбинации длины и / или частоты, которую вы считаете подходящей, и используйте ее в качестве «названия» фруктовой грозди.

...