Это не домашняя работа; Я пытаюсь упростить и улучшить существующий неуклюжий графический интерфейс, написанный на C # / Winform / Sql Server 2008. Было бы здорово, если бы вы могли предложить что-то специфическое для этих технологий, но если бы вы могли указать мне на что-то еще, такое как Java / Решение MySql, тогда я тоже буду этому рад.
Был задан похожий вопрос, но вопрос / ответ был не таким продвинутым, как то, что я ищу: Учитывая список слов - какой будет хороший алгоритм для завершения слов в Java? Компромиссы: скорость / эффективность / объем памяти
Скажем, у меня есть таблица, содержащая информацию о книге: название, имя автора, описание. Я знаю, что все три не обязательно принадлежат к одной и той же таблице, но давайте предположим, что имеет смысл сделать это таким образом. Поэтому, когда пользователь вводит что-то (скажем, «Hari po») в текстовое поле / комбинированный список или в какой-либо пользовательский элемент управления, первое, что он должен получить в качестве первого предложения, - это, вероятно, «Гарри Поттер», соответствующее описание и автор. Для простоты давайте ограничимся поиском только по названию. Обратите внимание, что мне все равно, что «Хари» звучит как «Гарри» - приложение не нацелено на не носителей языка, но меня волнует тот факт, что «Хари по» находится всего в нескольких нажатиях клавиши «Гарри По». Итак, на ум приходит http://en.wikipedia.org/wiki/Levenshtein_distance, но это не совсем то, что мне нужно, потому что я хотел бы получить значимые результаты, как только я начну печатать (подумайте о предложении Google с другой целью). Мне нужен какой-то модифицированный алгоритм расстояния Левенштейна, который хорошо работает с частичным соответствием и не предполагает, что то, что я печатаю, должно быть в начале текста, который я пытаюсь сопоставить. Например, книга может называться «Как мальчик по имени Гарри Поттер влияет на наше общество», и я хочу, чтобы этот заголовок всплыл в поиске, однако я бы хотел увидеть что-то вроде «Гарри Поттер и Орден «Феникс» поднимаются наверх, потому что мой запрос начинается с этого.
Я мог бы несколько раз попробовать расстояние Левенштейна для всех возможных подстрок с длиной запроса +/- 2, а затем как-то взвесить их, где в строке появляется подстрока «сортировать», а затем выбрать максимальное значение. коэффициент совпадения. Моя первая задача - сделать это неэффективно. Во-вторых, должен быть способ получить лучшие результаты, даже если скорость не была проблемой. В-третьих, кто-то наверняка делал нечто подобное раньше, так зачем изобретать велосипед?
Количество уникальных строк в базе данных будет составлять до 20 000. То, что мне нужно, это что-то вроде предложения поиска Google или Visual Studio 2010 IntelliSense (автозаполнение кода), за исключением того, что он не должен пытаться вспомнить, что пользователь вводил в прошлом, и корректировать предложение, основываясь на этом. Нет необходимости выполнять расширение запроса; просто работаю с актуальным контентом. С точки зрения пользователя он должен работать аналогично поиску в Google и IntelliSense, например, он должен придумать ряд ранжированных вариантов, а также придумать разумный способ сократить этот список в нужной точке (например, если на самом деле ничего не соответствует запросу, то ничего не предлагайте, а не показывайте лучшее из худших совпадений) , а также, если первые несколько результатов имеют сильный рейтинг, но последующие имеют гораздо более слабый результат относительно лучших результатов, то, возможно, скрыть слабые.
Возможно, вам известен инструмент / библиотека с открытым исходным кодом разумного размера с открытым и читабельным исходным кодом, из которого я могу получить идеи?
Мой следующий вопрос будет о том, как наилучшим образом справиться с ситуацией, когда поисковый термин может применяться либо к названию, и / или автору, и / или описанию, но я подозреваю, что мой текущий вопрос уже загружен.
Пожалуйста, задавайте уточняющие вопросы, если что-то не понятно о том, что я делаю.