Как обучить максимальный классификатор

[Стек проекта: Java, Opennlp, Elasticsearch (хранилище данных), twitter4j для чтения данных из twitter]

Я намерен использовать максимальный классификатор для классификации твитов. Я понимаю, что первый шаг - тренировка модели. Из документации я обнаружил, что у нас есть метод поезда на основе GISTrainer для обучения модели. Мне удалось собрать простой кусок кода, который использует максимальный классификатор opennlp для обучения модели и прогнозирования результата.

Я использовал два файла postive.txt и absolute.txt для обучения модели

Содержание Positive.txt

positive    This is good
positive    This is the best
positive    This is fantastic
positive    This is super
positive    This is fine 
positive    This is nice

Содержание негатива. Текст

negative    This is bad
negative    This is ugly
negative    This is the worst
negative    This is worse
negative    This sucks

И методы Java ниже приводят к результату.

@Override
public void trainDataset(String source, String destination) throws Exception {
    File[] inputFiles = FileUtil.buildFileList(new File(source)); // trains both positive and negative.txt
    File modelFile = new File(destination);
    Tokenizer tokenizer = SimpleTokenizer.INSTANCE;
    CategoryDataStream ds = new CategoryDataStream(inputFiles, tokenizer);
    int cutoff = 5;
    int iterations = 100;
    BagOfWordsFeatureGenerator bowfg = new BagOfWordsFeatureGenerator();
    DoccatModel model = DocumentCategorizerME.train("en", ds, cutoff,iterations, bowfg);
    model.serialize(new FileOutputStream(modelFile));
}

@Override
public void predict(String text, String modelFile) {
    InputStream modelStream = null;
    try{
        Tokenizer tokenizer = SimpleTokenizer.INSTANCE;
        String[] tokens = tokenizer.tokenize(text);
        modelStream = new FileInputStream(modelFile);
        DoccatModel model = new DoccatModel(modelStream);
        BagOfWordsFeatureGenerator bowfg = new BagOfWordsFeatureGenerator(); 
        DocumentCategorizer categorizer = new DocumentCategorizerME(model, bowfg);
        double[] probs   = categorizer.categorize(tokens);
        if(null!=probs && probs.length>0){
            for(int i=0;i<probs.length;i++){
                System.out.println("double[] probs index  " + i + " value " + probs[i]);
            }
        }
        String label = categorizer.getBestCategory(probs);
        System.out.println("label " + label);
        int bestIndex = categorizer.getIndex(label);
        System.out.println("bestIndex " + bestIndex);
        double score = probs[bestIndex];
        System.out.println("score " + score);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    finally{
        if(null!=modelStream){
            try {
                modelStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    try {
        String outputModelPath = "/home/**/sd-sentiment-analysis/models/trainPostive";
        String source = "/home/**/sd-sentiment-analysis/sd-core/src/main/resources/datasets/";
        MaximunEntropyClassifier me = new MaximunEntropyClassifier();
        me.trainDataset(source, outputModelPath);
        me.predict("This is bad", outputModelPath);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

У меня есть следующие вопросы.

1) Как итеративно обучать модель? Кроме того, как я могу добавить новые предложения / слова в модель? Существует ли определенный формат для файла данных? Я обнаружил, что файл должен содержать как минимум два слова, разделенных вкладкой. Мое понимание верно? 2) Существуют ли общедоступные наборы данных, которые я могу использовать для обучения модели? Я нашел несколько источников для обзоров фильмов. Проект, над которым я работаю, включает в себя не только обзоры фильмов, но и другие вещи, такие как обзоры продуктов, настроения брендов и т. Д. 3) Это в некоторой степени помогает. Есть ли рабочий пример где-нибудь в открытом доступе? Я не мог найти документацию для Maxent.

Пожалуйста, помогите мне. Я вроде заблокирован на это.

2 ответа

1) вы можете хранить образцы в базе данных. Я использовал накопленный один раз для этого. Затем через некоторый интервал вы перестраиваете модель и перерабатываете свои данные. 2) формат: образец имени новой строки. Нет вкладок 3) звучит так, как будто вы хотите объединить общее настроение с темой или сущностью. Вы можете использовать поиск по имени или просто регулярное выражение, чтобы найти сущность или добавить сущность в метки вашего класса, чтобы doccat включал название продукта и т. Д., Тогда ваши образцы должны быть очень конкретными

AFAIK, вы должны полностью переобучить модель MaxEnt, если хотите добавить новые обучающие образцы. Это не может быть сделано постепенно в режиме онлайн.

Формат ввода по умолчанию для opennlp maxent представляет собой текстовый файл, где каждая строка представляет один образец. Образец состоит из токенов (функций), разделенных пробелами. Во время обучения первый токен представляет результат.

Взгляните на мой минимальный рабочий пример здесь: Обучение моделей с использованием openNLP maxent

Другие вопросы по тегам