Недавно я познакомился с ElasticSearch агрегацией значительных терминов и был удивлен, насколько хороша и уместна эта метрика. Для тех, кто не знаком с этим, это довольно простая концепция - для данного запроса (набор переднего плана) данное свойство оценивается по статистической значимости фонового набора.
Например, если мы запрашивали наиболее важные виды преступлений в Британской транспортной полиции:
C = 5,064,554 -- total number of crimes
T = 66,799 -- total number of bicycle thefts
S = 47,347 -- total number of crimes in British Transport Police
I = 3,640 -- total number of bicycle thefts in British Transport Police
Обычно кражи велосипеда представляют только 1% преступлений (66 799/5 064 554), но для британской транспортной полиции, которые занимаются преступностью на железных дорогах и станциях, 7% преступлений (3,640/47,347) - это кража велосипеда. Это значительное семикратное увеличение частоты.
Значение для "кражи велосипеда" было бы [(I/S) - (T/C)] * [(I/S) / (T/C)] = 0.371...
Где:
- C - количество всех документов в коллекции
- S - количество документов, соответствующих запросу
- T - количество документов с определенным термином
- I - это число документов, которые пересекают как S, так и T
По практическим соображениям (явное количество данных, которые у меня есть и огромные требования к памяти ElasticSearch), я ищу, чтобы реализовать значительное агрегирование терминов в SQL или непосредственно в коде.
Я искал некоторые способы потенциально оптимизировать этот тип запросов, в частности, уменьшая требования к памяти и увеличивая скорость запросов за счет некоторого запаса погрешности - но пока я его не разорвал. Мне кажется, что:
- Переменные C и S легко кэшируются или могут быть запрошены.
- Переменная T может быть получена из Count-Min Sketch вместо запроса к базе данных.
- Переменная I, однако, невозможно получить с помощью эскиза Count-Min от T.
Я также смотрел MinHash, но из описания кажется, что его здесь нельзя было использовать.
Кто-нибудь знает о некотором умном алгоритме или структуре данных, которые помогают решить эту проблему?