Лучшим решением было бы использовать существующую поисковую систему, такую как Lucene или одну из ее альтернатив (см. Каковы лучшие альтернативы Lucene? ).
Теперь, если выЕсли вы хотите реализовать это самостоятельно (это действительно большая и существующая проблема), вам следует взглянуть на концепцию Inverted Index .Это то, что используют Google и другие поисковые системы.Конечно, у них много дополнительных систем, но это основная.
Идея инвертированного индекса состоит в том, что для каждого ключевого слова (и синонимов) вы сохраняете идентификатор документов.которые содержат ключевое слово.Тогда очень легко найти соответствующие документы для набора ключевых слов, потому что вы просто вычисляете пересечение (или объединение в зависимости от того, что вы хотите сделать) их списка в инвертированном индексе.Пример:
Предположим, что это ваш инвертированный индекс:
smart: [42,35]
gain: [42]
profit: [55]
Теперь, если у вас есть запрос «умный, выигрыш», ваши соответствующие документы являются пересечением (или объединением) [42, 35] и [42].
Чтобы обработать синонимы, вам просто нужно расширить запрос, чтобы включить все синонимы для слов в исходном запросе.Исходя из вашего примера, ваш запрос станет «быстрее, быстрее, выигрыш, прибыль, прибыль».
Как только вы это реализовали, хорошим улучшением будет добавление веса TFIDF к вашемуключевые слова.По сути, это способ взвешивать редкие слова (программирование) больше, чем обычные ().
Другой подход - просто просмотреть все ваши документы и найти те, которые содержат ваши слова (или их синонимы).Инвертированный индекс будет НАМНОГО быстрее, потому что вам не нужно каждый раз просматривать все ваши документы.Отнимающая много времени операция строит индекс, который должен быть выполнен только один раз.