2009-10-14 7 views
0

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

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

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

Спасибо, Род

+3

Звучит хорошо. Итак, что вы сделали, чтобы попытаться решить это? – AlbertoPL

ответ

3

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

Техника я нашел, чтобы быть простым и быстрым является:

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

+1 хороший ответ, а идея intern - полезный намек на реализацию. – djna

+0

Спасибо. Разрыв текста в терминах - хорошая идея.Сложность разумна таким образом (~ количество слов в тексте * максимальное количество слов в терминах (в моем случае 3)). – Rod

0

Кажется, есть две части. Вычисление достойного алгоритма и реализация его в 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. Отдельная проблема задает конкретные вопросы, если вам нужно.

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