2016-03-22 4 views
0

Небольшой мой собственный проект - слепо создать поисковую систему с нуля без использования каких-либо внешних источников. Это в основном для обучения, и до сих пор у меня не было много проблем, когда у меня была и дилемма, и сложная проблема.Устранение плохого поиска на токенах в запросе

соблюдать этот случай:

Сюзи хочет искать «нечеткие медведь». Это нормально, функционирует так же хорошо, как и может. Тем не менее, Suzy завинчивается и набирает «fuzzybears». Прямо сейчас мой алгоритм поиска ломается, поскольку это интерпретируется как один токен, а не несколько токенов. Любой случай или комбинация слов, которые имеют хотя бы одно появление такого пробега на терне или склеенные жетоны, вызывает плохой результат поиска.

Для области, это то, что я пишу, используя комбинацию C# и T-SQL.

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

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

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

Главным образом, мне нужна скорость. Это действительно не должно быть красивым, но если это быстро и точно, я счастлив, даже если он занимает много места на диске.

Не спрашивайте здесь решения, но если кто-нибудь может указать мне в направлении, в котором я могу пойти, или было бы весьма полезно.

+0

Как насчет использования словаря слов и сравнения введенной строки с ним? – Pikoh

+0

Я думаю, что он уже пробовал это: «Во-первых, я использовал список, чтобы принять условия и создавать варианты», это не сработало. –

+0

Ну, я понимаю, что он генерирует его во время выполнения. Я имею в виду создание предварительно загруженного списка, например, английских слов и их комбинаций (это может быть много работы, но это нужно делать только один раз). Тогда, поиск маркеров там должен быть быстрым, я думаю – Pikoh

ответ

1

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

Таким образом, для поиска ответов, содержащих «Рассмотрите этот подход:», вы сокращаете фразу «рассматриваете этот подход», а затем обозначаете как «con», «sid», «er», «this», «ap», «творное». Если con и sid и er появляются рядом друг с другом, и в этом порядке вы нашли слово «подумать».

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

+0

Это замечательное решение! Спасибо! Тем не менее, мой текущий алгоритм поиска основан на формуле Levenshtein Distance, как вы думаете, он может работать вместе с вашим решением? – Myachizero

+0

Зависит от деталей вашей реализации, но я думаю, что он может быть адаптирован и, возможно, даже лучше работает в сочетании с расстояниями Левенштейна, поскольку они работают на уровне «слов», не определяя, что это за слово. Например, если вы пытаетесь сопоставить «Рассмотрите этот подход:» с заполненной опечатками «Conoider rhis entoach:», вы можете разбить его на слоги и сделать L-расстояние только на несогласованных слогах, для меньшего количества L-расстояний для вычисления , или вы можете полагаться на L-расстояния для всего и на ранжирование пространства как изменение нулевой стоимости (con sid er вносит свой вклад, устраняя два пробела). –

Смежные вопросы