Это похоже на достаточно простую задачу классификации на основе ключевых слов. Поскольку вы используете Java, для этого следует рассмотреть следующие пакеты: Classifier4J , Weka или Lucene Mahout .
Classifier4J
Classifier4J поддерживает классификацию с использованием наивного байесовского и векторного пространства модели.
Как видно из этого фрагмента исходного кода по обучению и оценке с использованием наивного байесовского классификатора, пакет достаточно прост в использовании. Он также распространяется под либеральной лицензией на программное обеспечение Apache .
Weka
Weka - очень популярный инструмент для интеллектуального анализа данных. Преимущество его использования заключается в том, что вы сможете легко экспериментировать с использованием множества различных моделей машинного обучения , чтобы разделить книги по темам, включая наивный Байесовский , деревья решений , поддерживают векторные машины , k-ближайший сосед , логистическую регрессию и даже обучающийся на основе набора правил .
Вы найдете руководство по использованию Weka для категоризации текста здесь .
Однако Weka распространяется под GPL . Вы не сможете использовать его для программного обеспечения с закрытым исходным кодом, которое хотите распространять. Но вы все равно можете использовать его для поддержки веб-службы.
Lucene Mahout
Mahout разработан для машинного обучения с очень большими наборами данных. Он построен на основе Apache Hadoop и поддерживает контролируемую классификацию с использованием наивного Байеса.
Вы найдете руководство по использованию Mahout для классификации текста здесь .
Как и Classifier4J, Mahout распространяется под либеральной лицензией на программное обеспечение Apache .
Итак, вы хотите создать карту тегов, содержащую коллекцию книг?
РЕДАКТИРОВАТЬ:
Похоже, вы можете взглянуть на Модель векторного пространства , чтобы применить классификация категорий.
Либо Lucene , либо Classifier4j предлагают основу для этого.
Вы можете найти алгоритмы нечеткого сопоставления , такие как Soundex и Levenshtein.
Вы не хотите чего-то такого же простого?
Map<Tag, ArrayList<Book>> m = {};
for (Book b : books) {
for (tag t : b.taglist) {
m.get(t).add(b);
}
}
Теперь m.get("IT")
вернет все книги по IT и т.д....
Конечно, некоторые книги будут появляться в нескольких категориях, но это случается и в реальной жизни...