Джава. Поиск слов во входном тексте на сервере. Идеи для реализации - PullRequest
2 голосов
/ 01 ноября 2011

Например, у меня такая ситуация:

на сервере у нас есть список слов:

{'word1', 'word2', 'word3', 'word4'}

Пользователь отправляет запрос на сервер с текстом:

"some text here word1. many many other text word4"

Сервер должен обработать этот входной текст, найти все слова в этом тексте из списка серверов, отметить эти слова и отправить полученный текст пользователю:

"some text here <mark>word1<mark>. many many other text <mark>word4<mark>"

Это основная идея, основная концепция.В этот момент я должен реализовать эту логику.

Итак, я прошу вас о помощи.

Мне необходимо определиться с технологиями и инструментами.

Какие инструменты вы можете порекомендовать для этой задачи?

Ответы [ 3 ]

2 голосов
/ 01 ноября 2011

Есть много открытых вопросов, например, что именно разделяет слова.Например, вы хотите выделить «полный» в «полный текст»?

  1. Однако вот очень простая идея:
  2. Собрать слова серверов в HashSet,
  3. Разобрать каждый запрос, т.е. определить слова в соответствии с тем, что вы хотите в качестве разделителей,(линейный)
  4. Для каждого членства проверки токена / слова в HashMap (O (1))
  5. Введите слово или слово, включая ваши отмеченные теги, в вывод.

Кстати: Lucene, Solr и т. Д. Здесь не сильно помогут.Конечно, вы можете использовать их, но это не имеет смысла.Их сила заключается в создании индекса text .Текст может означать ОГРОМНОЕ количество данных.Набор слов ограничен диктонарой языка.Обычно это шутка для компьютеров.Простой HashSet должен удовлетворить ваши потребности.

2 голосов
/ 01 ноября 2011

Вот наивное решение:

for (String word : words) {
    text = text.replaceAll(word, "<mark>" +word + "</mark>");
}

Лучшее решение должно использовать регулярное выражение, чтобы избежать замены фрагментов слова, например wo<mark>man</mark>.Вы должны создать регулярное выражение, как "\\b" + word + "\\b".

Но я бы посоветовал вам проверить готовые к использованию движки, такие как Solr (или Lucine).

1 голос
/ 01 ноября 2011

Самый простой способ сделать это - использовать String.replaceAll.Вы можете объединить все ключевые слова в одно регулярное выражение и использовать обратную ссылку для включения исходного слова.Если ключевые слова содержат операторы регулярных выражений, вам придется их избегать.

Обычно вызывать String.replaceAll в цикле, потому что промежуточные результаты могут содержать совпадение, которого нет во входных данных.В качестве надуманного примера, предположим, что я хотел заменить «ab» на «b» и «bb» на «c».Таким образом, правильный вывод для «bab» будет «bb».Однако "bab" .replaceAll ("ab", "b"). ReplaceAll ("bb", "c") - это "c".По той же причине вы не захотите использовать String.replace в цикле, хотя это кажется самым простым способом выполнения поставленной задачи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...