Текстовая классификация на Java
-
21-09-2019 - |
Вопрос
Мне нужно какое -то решение в Java для следующих требований:
- Поиск в тексте для определенных терминов (каждый термин может быть 1-3 слова). Например: {"Привет, мир", "Привет"}. Матч должен быть точным.
- Существует около 500 типов групп терминов, каждая из которых содержит около 30 терминов.
- Каждый текст может содержать до 4000 слов.
Производительность является важной проблемой.
Спасибо, Род
Решение
Я сделал что -то подобное для на заказ спам -фильтра.
Техника, которую я обнаружил простой, так и быстрым, есть:
- Сначала разделите входной файл на слова.
- Вызов
intern()
на каждом словом, чтобы упростить сравнения на шаге 3. - Создать
Term
класс, инкапсулируя массив до трех строк. Егоequals()
Метод может провести сравнение указателей на строках, а не вызоватьString.equals()
. Анкет СоздатьTerm
экземпляр для каждой группы из 2 или 3 последовательных слов на входе. - Использовать
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. Отдельная проблема задайте конкретные вопросы, если вам нужно.