Вопрос

Мне нужно какое -то решение в Java для следующих требований:

  1. Поиск в тексте для определенных терминов (каждый термин может быть 1-3 слова). Например: {"Привет, мир", "Привет"}. Матч должен быть точным.
  2. Существует около 500 типов групп терминов, каждая из которых содержит около 30 терминов.
  3. Каждый текст может содержать до 4000 слов.

Производительность является важной проблемой.

Спасибо, Род

Это было полезно?

Решение

Я сделал что -то подобное для на заказ спам -фильтра.

Техника, которую я обнаружил простой, так и быстрым, есть:

  1. Сначала разделите входной файл на слова.
  2. Вызов intern() на каждом словом, чтобы упростить сравнения на шаге 3.
  3. Создать Term класс, инкапсулируя массив до трех строк. Его equals() Метод может провести сравнение указателей на строках, а не вызовать String.equals(). Анкет Создать Term экземпляр для каждой группы из 2 или 3 последовательных слов на входе.
  4. Использовать Multimap (из коллекций Google), чтобы отобразить каждый термин с набором файлов, в которых он появляется.

Другие советы

Используйте выражения режима. Видеть: http://java.sun.com/docs/books/tutorial/essential/regex/

Кажется, есть две части в этом. Определять приличный алгоритм и реализация его на Java. (На данный момент давайте оставим в стороне идею, которая, несомненно, там »кто -то уже реализовал это, и вы, вероятно, можете найти некоторые идеи.)

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

Начните с самой простой, что вы можете подумать, что работает. Измерить это. Вы можете получить удивительный результат, что это достаточно хорошо. Остановись прямо там! Например, это действительно глупо:

 read text into String (4k, that's not too big)

 for each term
     use regexp to find matches in text

Но это вполне может дать подзадачное время отклика. Ваши пользователи действительно заботятся, если вы получите отклик на 200 мс до 100 мс? Сколько они заплатят за это?

Другой подход. Интересно, что это быстрее?

 prepare a collection of terms keyed by first word

 tokenize the text

 for each token
    find terms that match
    check for match (using look ahead for multi-word terms)

Что касается реализации в Java. Отдельная проблема задайте конкретные вопросы, если вам нужно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top