#java #autocomplete #sentence
#java #автозаполнение #предложение
Вопрос:
Допустим, у меня есть около 1000 предложений, которые я хочу предложить в качестве предложений, когда пользователь вводит текст в поле.
Я думал о запуске lucene in memory search
, а затем о передаче результатов в suggestions set
.
trigger
Для запуска поиска будут space char
и exit from the input field
.
Я намерен использовать это с GWT
, чтобы клиент с просто получал результаты с сервера.
Я не хочу делать то, что делает Google; где они дополняют каждое слово, а затем вносят предложения по каждому набору ключевых слов. Я просто хочу проверить ключевые слова и сделать предложения на основе этого. Вроде как когда я набираю заголовок для вопроса здесь, в stackoverflow.
Кто-нибудь делал что-то подобное раньше? Есть ли уже библиотека, которую я мог бы использовать?
Комментарии:
1. Я хотел бы уточнить, что вы не имеете в виду поведение SuggestBox , вместо этого предложения представлены в отдельном элементе пользовательского интерфейса? Я мог бы посмотреть, как вы могли бы определить SuggestOracle, который предоставляет предложения, и настроить поле предлагать, чтобы предлагать только тогда, когда последнее изменение было символом пробела.
Ответ №1:
Я работал над аналогичным решением. Эта статья под названием «Эффективное предсказание фразы» была для меня весьма полезной. Вам также нужно будет расставить приоритеты для предложений
Комментарии:
1. есть ли у этого Java-реализация, или вы можете предложить какой-нибудь открытый исходный код
Ответ №2:
Если у вас всего 1000 предложений, вам, вероятно, не нужен такой мощный индексатор, как lucene. Я не уверен, хотите ли вы выполнять предложения «завершить предложение» или «предложить другие запросы с теми же ключевыми словами». Предложения. Вот решения для обоих:
Предполагая, что вы хотите завершить предложение, введенное пользователем, тогда вы могли бы поместить все свои строки в SortedSet
и использовать tailSet
метод для получения списка строк, которые «больше», чем входная строка (поскольку компаратор строк считает более длинную строку, A
которая начинается со string B
, «больше», чем B
). Затем выполните итерацию по нескольким верхним элементам набора, возвращаемого tailSet
, чтобы создать набор строк, в которых первые inputString.length()
символы соответствуют входной строке. Вы можете остановить итерацию, как только первые inputString.length()
символы не совпадут с входной строкой.
Если вы хотите использовать предложения по ключевым словам вместо предложений «завершить предложение», то накладные расходы зависят от длины ваших предложений и количества уникальных слов в предложениях. Если этот набор достаточно мал, вам сойдет с рук HashMap<String,Set<String>>
, где вы сопоставили ключевые слова с предложениями, которые их содержали. Тогда вы могли бы обрабатывать многословные запросы, пересекая наборы.
В обоих случаях я бы, вероятно, сначала преобразовал все строки в нижний регистр (при условии, что это уместно в вашем приложении). Я также не думаю, что какое-либо из решений будет масштабироваться до сотен тысяч предложений. Делает ли любой из них то, что вы хотите? Рад предоставить код, если он вам понравится.