2 votes

Chargement du modèle et classification de l'entrée à l'aide de Mallet

Je dispose déjà d'un modèle CRF que j'ai entraîné à l'aide de SimpleTagger.

        SimpleTagger.main(new String[] {
                "--train", "true",
                "--model-file", "/Desktop/crfmodel",
                "--threads",  "8",
                "--training-proportion", "0.8",
                "--weights", "dense",
                "--test", "lab",
//                "--orders", "2",
                "/Desktop/annotations.txt"
        });

J'ai l'intention de charger ce modèle et de l'utiliser pour le marquage. J'utilise ce code.

    public static void main(String[] args) throws Exception {

        //DOCS http://mallet.cs.umass.edu/classifier-devel.php

        Instance instance = getMyInstance();

        Classifier classifier = loadClassifier(Paths.get("/Desktop/crfmodel").toFile());

        Labeling labeling = classifier.classify(instance).getLabeling();
        Label l = labeling.getBestLabel();
        System.out.print(instance);
        System.out.println(l);
    }

    private static Classifier loadClassifier(File serializedFile)
            throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream (new FileInputStream(serializedFile));
        Classifier crf = (Classifier) ois.readObject();
        ois.close();

        return crf;
    }

Lorsque j'essaie de faire ce qui précède, j'obtiens l'erreur suivante

Exception in thread "main" java.lang.ClassCastException: cc.mallet.fst.CRF cannot be cast to cc.mallet.classify.Classifier
    at TagClassifier.loadClassifier(TagClassifier.java:77)
    at TagClassifier.main(TagClassifier.java:64)

L'erreur se produit dans la ligne

Classifier crf = (Classifier) ois.readObject();

Puis-je savoir pourquoi cela se produit ? Par ailleurs, s'il existe une méthode correcte et documentée pour étiqueter une entrée à l'aide d'un modèle entraîné, pouvez-vous partager des liens/documentation ? Merci beaucoup par avance !!!

2voto

Adithya Puram Points 118

Je pense avoir trouvé la solution en regardant le code de SimpleTagger.

        crfModel = loadClassifier(Paths.get("/Desktop/crfmodel").toFile());
        pipe = crfModel.getInputPipe();
        pipe.setTargetProcessing(false);
        String formatted = getFormattedQuery(q);

        Instance instance = pipe.pipe(new Instance(formatted, null, null, null));
        Sequence sequence = (Sequence) instance.getData();
        Sequence[] tags = tag(sequence, 3);

    private static Sequence[] tag(Sequence input, int bestK) {
        Sequence[] answers;
        if (bestK == 1) {
            answers = new Sequence[1];
            answers[0] = crfModel.transduce(input);
        } else {
            MaxLatticeDefault lattice = new MaxLatticeDefault(crfModel, input, null);
            answers = lattice.bestOutputSequences(bestK).toArray(new Sequence[0]);
        }
        return answers;
    }

0voto

David Mimno Points 1311

Ce sont des choses différentes, donc on ne peut pas en faire une pour l'autre. Un CRF infère des classes pour chaque élément d'une séquence, sa sortie est donc un tableau d'étiquettes. Un classificateur prend une entrée et renvoie une étiquette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X