Проблема классификации текста Java

У меня есть набор объектов Books, классы Книга определяется следующим образом:

Class Book{

String title;
ArrayList<tags> taglist;

}

Где title - название книги, например: Javascript для макетов.

и taglist - это список тегов для нашего примера: Javascript, jquery, "web dev",..

Как я уже сказал, есть множество книг, рассказывающих о разных вещах: ИТ, БИОЛОГИЯ, ИСТОРИЯ,... Каждая книга имеет название и набор тегов, описывающих ее.

Мне приходится классифицировать автоматически эти книги в отдельные наборы по темам, например:

ЭТО КНИГИ:

  • Java для чайников
  • Javascript для макетов
  • Узнать flash за 30 дней
  • Программирование на С++

ИСТОРИЧЕСКИЕ КНИГИ:

  • Мировые войны
  • Америка в 1960 году
  • Жизнь короля Мартина Лютера

БИОЛОГИЧЕСКИЕ КНИГИ:

  • ....

Вы, ребята, знаете алгоритм/метод классификации для применения к таким проблемам?

Решение состоит в том, чтобы использовать внешний API для определения категории текста, но проблема в том, что книги находятся на разных языках: французский, испанский, английский.

Ответ 1

Это выглядит как довольно простая задача классификации на основе ключевых слов. Поскольку вы используете Java, хорошие пакеты для рассмотрения будут Classifier4J, Weka, или Lucene Mahout,

Classifier4J

Classifier4J поддерживает классификацию с использованием наивных байесов и векторное пространство.

Как показано в этом фрагменте кода при обучении и подсчете с использованием его наивного классификатора Байеса, пакет разумно легко использовать. Он также распространяется под лицензией Apache Software License.

Weka

Weka - очень популярный инструмент для интеллектуального анализа данных. Преимущество использования этого заключается в том, что вы сможете легко экспериментировать с использованием многочисленных различных моделей машинного обучения, чтобы классифицировать книги по темам, включая наивный Байес, деревья решений, поддерживающие векторные машины, k-ближайший сосед, логистическая регрессия и даже установленный на основе набора правил.

Вы найдете руководство по использованию Weka для категоризации текста здесь.

Weka, однако, распространяется под GPL. Вы не сможете использовать его для программного обеспечения с закрытым исходным кодом, которое вы хотите распространять. Но вы все равно можете использовать его для поддержки веб-службы.

Lucene Mahout

Mahout предназначен для машинного обучения на очень больших наборах данных. Он построен поверх Apache Hadoop и поддерживает контролируемую классификацию с использованием наивных байесов.

Вы найдете учебное пособие, посвященное использованию Mahout для классификации текста здесь.

Подобно Classifier4J, Mahout распространяется под лицензией Apache Software License.

Ответ 2

Итак, вы хотите создать карту тегов, в которой содержится коллекция книг?

EDIT:

Похоже, вы можете взглянуть на Vector Space Model, чтобы применить классификацию категории.

Либо Lucene или Classifier4j предлагают основу для этого.

Ответ 3

Вам не нужно что-то простое?

Map<Tag, ArrayList<Book>> m = {};
for (Book b : books) {
    for (tag t : b.taglist) {
        m.get(t).add(b);
    }
}

Теперь m.get("IT") вернет все ИТ-книги и т.д.

Конечно, некоторые книги появятся в нескольких категориях, но это происходит и в реальной жизни...