2 votes

(Comment) puis-je utiliser les caractéristiques Bigram avec le classificateur de documents OpenNLP ?

(Comment) puis-je utiliser les caractéristiques Bigram avec le classificateur de documents OpenNLP ?

J'ai une collection de documents très courts (titres, expressions et phrases), et je voudrais ajouter des caractéristiques bigrammes, du type de celles utilisées dans l'outil LibShortText.

http://www.csie.ntu.edu.tw/~cjlin/libshorttext/

Est-ce possible ?

La documentation n'explique que la manière de procéder à l'aide du Name Finder en utilisant l'option

Générateur de caractéristiques de nom de bigramme()

et non le classificateur de documents

2voto

markg Points 963

Je crois que le formateur et le classificateur permettent des générateurs de caractéristiques personnalisés dans leurs méthodes, mais ils doivent être des implémentations de FeatureGenerator, et BigramFeatureGenerator n'en est pas une. J'ai donc fait un impl rapide en tant que classe interne ci-dessous Essayez ce code (non testé) quand vous en aurez l'occasion.

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.List;
    import opennlp.tools.doccat.DoccatModel;
    import opennlp.tools.doccat.DocumentCategorizerME;
    import opennlp.tools.doccat.DocumentSample;
    import opennlp.tools.doccat.DocumentSampleStream;
    import opennlp.tools.doccat.FeatureGenerator;
    import opennlp.tools.util.ObjectStream;
    import opennlp.tools.util.PlainTextByLineStream;

    public class DoccatUsingBigram {

      public static void main(String[] args) throws IOException {
        InputStream dataIn = new FileInputStream(args[0]);
        try {

          ObjectStream<String> lineStream =
                  new PlainTextByLineStream(dataIn, "UTF-8");
//here you can use it as part of building the model
          ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream);
          DoccatModel model = DocumentCategorizerME.train("en", sampleStream, 10, 100, new MyBigramFeatureGenerator());

          ///now you would use it like this

          DocumentCategorizerME classifier = new DocumentCategorizerME(model);
          String[] someData = "whatever you are trying to classify".split(" ");
          Collection<String> bigrams = new MyBigramFeatureGenerator().extractFeatures(someData);
          double[] categorize = classifier.categorize(bigrams.toArray(new String[bigrams.size()]));

        } catch (IOException e) {
          // Failed to read or parse training data, training failed
          e.printStackTrace();
        }

      }

      public static class MyBigramFeatureGenerator implements FeatureGenerator {

        @Override
        public Collection<String> extractFeatures(String[] text) {
          return generate(Arrays.asList(text), 2, "");
        }

        private  List<String> generate(List<String> input, int n, String separator) {

          List<String> outGrams = new ArrayList<String>();
          for (int i = 0; i < input.size() - (n - 2); i++) {
            String gram = "";
            if ((i + n) <= input.size()) {
              for (int x = i; x < (n + i); x++) {
                gram += input.get(x) + separator;
              }
              gram = gram.substring(0, gram.lastIndexOf(separator));
              outGrams.add(gram);
            }
          }
          return outGrams;
        }
      }
    }

J'espère que cela vous aidera...

0voto

madhawa Points 184

Vous pouvez utiliser la classe NGramFeatureGenerator.java dans OpenNLP[1] pour votre cas d'utilisation.

[1] https://github.com/apache/opennlp

Merci, Madhawa

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