Как я могу применить TF-IDF, если у меня есть только подмножество всех документов? - PullRequest
0 голосов
/ 01 июня 2018

Практическое применение:

У меня есть несколько баз данных, которые необходимо запрашивать из одного окна поиска.Некоторые из них у меня есть прямой доступ (они SQL Server / MySQL), другие я могу искать только через API.

В идеальном мире я бы внедрил все эти данные в Elasticsearch и использовал их для определения релевантности.К сожалению, у меня нет ресурсов, чтобы сделать это эффективно.Elastic занимает более 400 МБ ОЗУ только в режиме ожидания без добавления каких-либо фактических данных или выполнения запросов.Похоже, что большинство людей, использующих Elasticsearch в производстве, используют машины с 32–64 ГБ ОЗУ.Моя организация не имеет доступа ни к чему, кроме мощного, доступного для этого проекта.

Поэтому моя следующая идея - запрашивать все базы данных и подключаться к API, когда пользователь выполняет поиск.Затем мне нужно проанализировать результаты, определить релевантность и вернуть их пользователю.Я признаю, что это, вероятно, ужасный план с точки зрения производительности.Я надеюсь использовать memcached, чтобы сделать вещи более терпимыми.

В своих исследованиях по поиску алгоритмов для определения релевантности я наткнулся на tf-idf.Я хочу применить это к результатам, которые я получаю из всех баз данных.

Фактический вопрос

Насколько я понимаю, tf-idf состоит в том, что после токенизации каждого документа в корпусе вы выполняете анализ частоты термина, а затем умножаете его на обратноечастота документа для слов.Частота обратных документов рассчитывается путем деления общего количества документов на общее количество документов с термином.

Проблема в том, что, если я извлекаю документы из API, я не знаю истинного общего количества документов в корпусе.Я только когда вытягиваю подмножество, и, основываясь на способе извлечения этих документов, они естественным образом соглашаются со всеми условиями в них.Могу ли я применить tf-idf к этому, рассматривая пул документов, возвращаемых этими различными источниками, как единый корпус?Какой лучший способ пойти по этому поводу?

Бонусный вопрос

Если у вас есть предложение о том, как сделать это, не взламывая мое собственное поисковое решение или не используя Elasticsearch, я весь слух ...

1 Ответ

0 голосов
/ 02 июня 2018

Как вы заметили, Elasticsearch не предназначен для работы в условиях ограниченной памяти.Если вы хотите использовать Elasticsearch, но не можете настроить выделенный компьютер, вы можете рассмотреть возможность использования размещенного поискового решения (например, AWS Elasticsearch, Elastic Cloud, Algolia и т. Д.).Эти решения все еще стоят!

Есть две отличные альтернативы, которые требуют немного больше работы (но не так много, как написание вашего собственного поискового решения).Lucene - это настоящая поисковая система, над которой Elasticsearch написан.Он по-прежнему загружает довольно много базовых структур данных в память, поэтому, в зависимости от размера базовых данных, которые вы хотите проиндексировать, он все равно может исчерпать память.Но вы должны иметь возможность разместить немного больше данных в одном индексе Lucene, чем во всем экземпляре Elasticsearch.

Другой альтернативой, о которой я знаю немного меньше, является Sphinx.Это также поисковая система.И это также позволяет вам указать, сколько памяти выделить для использования.Он хранит остальные данные на диске.

...