Классификатор Стэнфорда, дающий неправильные результаты

#java #machine-learning #stanford-nlp #text-classification

Вопрос:

Я пытаюсь выполнить базовую классификацию текста с помощью классификатора Стэнфорда. Мой пример набора данных основан на ветчине или Спаме.

Это мой код:

 Properties props = new Properties();
ColumnDataClassifier cdc = new ColumnDataClassifier(props);

Classifier<String, String> cl = cdc.makeClassifier(cdc.readTrainingExamples("data.train"));

for (String line : ObjectBank.getLineIterator("data.test", "utf-8")) {
    Datum<String, String> d = cdc.makeDatumFromLine(line);
    System.out.println(line   "  ==>  "   cl.classOf(d));
}
 

Однако, какой бы текст я ни пытался классифицировать, он всегда классифицирует его как Ветчину. Следующее предложение явно является спамом, тем не менее оно классифицируется как Ветчина:

БЕСПЛАТНОЕ СООБЩЕНИЕ Активируйте свои 500 БЕСПЛАТНЫХ текстовых сообщений, ответив на это сообщение словом БЕСПЛАТНО Для условий и положений, посетите www.example.com

В чем моя ошибка?

Комментарии:

1. Тот факт, что есть несколько ошибок, неудивителен, но есть более серьезная проблема, поскольку она предсказывает каждый экземпляр с меткой большинства. Сначала вы можете проверить, правильно ли интерпретированы обучающие данные, т. Е. У каждого экземпляра есть метка, которую он должен иметь после readTrainingExamples . Я предполагаю, что там что-то идет не так, возможно, формат не соответствует ожиданиям функции. Также возникает вопрос о размере обучающего набора: если он слишком мал, классификатор, вероятно, будет по умолчанию все время использовать класс большинства.

Ответ №1:

Моя ошибка заключалась в том, что я не предоставил никаких свойств:

 Properties props = new Properties();
ColumnDataClassifier cdc = new ColumnDataClassifier(props);
 

Вы можете либо указать свойства непосредственно в коде:

 // set up pipeline properties
Properties props = new Properties();
// set the list of annotators to run
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,depparse,coref,kbp,quote");
// set a property for an annotator, in this case the coref annotator is being set to use the neural algorithm
props.setProperty("coref.algorithm", "neural");
 

Или вы можете предоставить файл свойств:

 ColumnDataClassifier cdc = new ColumnDataClassifier(propFile);