Классификация данных с помощью наивных байесов с использованием LingPipe

Я хочу классифицировать определенные данные в разные классы на основе их содержания. Я сделал это, используя наивный байесовский классификатор, и я получил вывод как лучшую категорию, к которой он принадлежит. Но теперь я хочу классифицировать новости, отличные от тех, что были на тренировочном наборе, в класс "другие". Я не могу вручную добавить все / все данные, кроме данных об обучении, в определенный класс, поскольку у него огромное количество других категорий. Так есть ли способ классифицировать другие данные?.

private static File TRAINING_DIR = new File("4news-train");
private static File TESTING_DIR = new File("4news-test");
private static String[] CATEGORIES = { "c1", "c2", "c3", "others" };

private static int NGRAM_SIZE = 6;

public static void main(String[] args) throws ClassNotFoundException, IOException {
    DynamicLMClassifier<NGramProcessLM> classifier = DynamicLMClassifier.createNGramProcess(CATEGORIES, NGRAM_SIZE);
    for (int i = 0; i < CATEGORIES.length; ++i) {
        File classDir = new File(TRAINING_DIR, CATEGORIES[i]);
        if (!classDir.isDirectory()) {
            String msg = "Could not find training directory=" + classDir + "\nTraining directory not found";
            System.out.println(msg); // in case exception gets lost in shell
            throw new IllegalArgumentException(msg);
        }

        String[] trainingFiles = classDir.list();
        for (int j = 0; j < trainingFiles.length; ++j) {
            File file = new File(classDir, trainingFiles[j]);
            String text = Files.readFromFile(file, "ISO-8859-1");
            System.out.println("Training on " + CATEGORIES[i] + "/" + trainingFiles[j]);
            Classification classification = new Classification(CATEGORIES[i]);
            Classified<CharSequence> classified = new Classified<CharSequence>(text, classification);
            classifier.handle(classified);
        }
    }
}

2 ответа

Решение

Просто сериализовать объект... это значит записать промежуточный объект в файл, и это будет ваша модель...

Тогда для тестирования вам просто нужно передать данные в модель, не нужно каждый раз тренироваться... Это будет для вас гораздо проще

Наивный Байес дает вам "уверенность" в каждой классификации, так как она вычисляет

P(y|x) ~ P(y)P(x|y)

До нормализации по P(x) это вероятность x быть частью класса y, Вы можете просто обрезать это значение и сказать, что

cl(x) = "other" iff max_{over y}(P(y|x)) < T

где T может быть, например, минимальная уверенность в тренировочном наборе

T = min_{over x and y in Training set}( P(y|x) )
Другие вопросы по тегам