Соответствие большим наборам данных текста - как это сделать быстрее?

1

Я боюсь уже несколько недель на том, что будет лучшим подходом к проведению, как логически, так и технологически, при попытке сопоставить 2 больших набора текста непрерывным, вращающимся образом.

С одной стороны, у нас есть песни и их тексты (около 30 миллионов строк текста, каждая из которых составляет 1000 символов), а с другой - песни (примерно 20K с 50 символами каждая). Тексты песен песен относятся к тому, о чем песни.

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

В качестве гипотетического примера, согласно его лирике, песня "Unchained Melody" должна перейти в категорию:

  • Любовные песни
    • Для моей любимой, моя любовь
      • Чувствую себя одиноко

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

Итак, вопрос в том, какой возможный подход использовать для сопоставления всех этих текстов категорий со всеми этими текстами песен?

Пожалуйста, имейте в виду, что, естественно, тысячи песен выпускаются ежедневно в наши дни, и категории постоянно меняются/улучшаются даже с возможностью радикального изменения.

До сих пор я пробовал следующее:

  1. SQL Server 2014, который содержит категории, ссылаясь на поисковую систему Sphinx, которая содержит тексты текстов в полном текстовом индексе. Приложение, построенное поверх них, выполняет 20K запросов для текста одной песни (т.е. Получает релевантность каждой категории против текста песни), выбирая результат, который считается лучшим. Это означает, что 20K * 30M запросов для всех песен должны быть сопоставлены. Конечно, это занимает много времени на 40-ядерном компьютере + 256 ГБ оперативной памяти, и к тому времени появляются новые песни и возможна измененная/обновленная структура категорий.

  2. Это интересно: SQL Server 2014, который содержит тексты песен, ссылаясь на Sphinx, который содержит тексты категорий. Запрос для соответствия категории для каждой песни создается путем разделения текста песни на слова, с помощью оператора "ИЛИ" между ними, ранжирования результатов больше, если в строке найдено больше слов (содержащих текст категории и текст из полной дорожка). Результат: быстрее, так как только один большой запрос на песню, чтобы получить свою высшую категорию, но все еще не достаточно быстро, и немного менее точный.

  3. SQL Server 2014, в котором содержатся как тексты песен, так и категории, при включенном режиме полнотекстового поиска, при использовании первого подхода (без Sphinx, только SQL FT) в ограниченном наборе категорий, изначально исходивших из второго подхода (опять же, без Sphinx, просто SQL FT), и все разделилось на сотни асинхронных партий работы. Итак, это комбинация двух выше. Результат: более точный, и ему дана полная мощность, немного более скоростная, но все же недостаточно, как я считаю, это возможно. Для соответствия всем песням и текстам требуется около 3 дней.

Если у вас есть какая-то другая идея, которую я мог бы попробовать, я был бы очень признателен. Меня интересует точность (40%) и скорость (60%), и я действительно чувствую, что есть более простые способы выполнения этой работы.

  • 1
    звучит так, как будто вы пытаетесь классифицировать песню на основе текста. Я прав?
  • 0
    Это самая близкая вещь к тому, что я действительно пытаюсь сделать, что на самом деле намного сложнее. Но да, это можно смело считать правильным предположением.
Показать ещё 10 комментариев
Теги:
algorithm
full-text-search
sphinx

1 ответ

2
Лучший ответ

Лично я, вероятно, придерживаюсь вашего 1. но с двумя уточнениями

Пакетные обновления, а просто запустите один запрос для каждой комбинации категорий/документов. Запустите один запрос для каждой категории - и получите результаты для ВСЕХ документов. Меньше больших запросов. Есть оптимизация, которую вы можете сделать, чтобы сделать эти "большие" запросы весьма эффективными.

Delta Updates, а не каждый период, просто запускает "полный" процесс, периодически использует отдельную небольшую и конкретную систему. Тот, кто знает, как запускать более сфокусированные обновления, чтобы избежать повторения работы. Например:

  1. Вы добавляете новую категорию, можете просто запустить свой большой запрос, чтобы найти документы для этой категории. Удаленная категория просто делит записи. "Изменить" в категорию можно удалить, а затем вставить.

  2. Новые документы также могут быть специальным индексом sphinx, который ТОЛЬКО содержит новые документы (основная система индексирования + дельта может уже обеспечить это!). Затем запустите основной запрос для каждой категории против этого гораздо меньшего индекса дельта.

  3. возможно, даже может использовать "умозрительную" систему, чтобы сократить количество категорий, которые вам нужно выполнить. например, заглушить все слова из категорий в массовые вызовы BuildKeyword. Это возвращает вам обратные обращения за слово, с этим вы можете исключить категории, у которых нет НИКАКИХ совпадений (поэтому нет необходимости запускать основной запрос для многих категорий)

... Работай умом, а не силой

  • 0
    Да, я думал обо всем этом. Но я ленивый. Я пойду на работу тогда ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню