ixa-ehu / ixa-pipe-pos

IXA pipes Part of Speech tagger and Lemmatizer (http://ixa2.si.ehu.es/ixa-pipes)
Apache License 2.0
17 stars 15 forks source link

Added support for loading models from other directories #1

Closed Neuw84 closed 9 years ago

Neuw84 commented 9 years ago

He añadido la carga de modelos desde directorios externos, tocando lo menos posible tu código (dos metodos en resources) y en las properties del annotatte una variable más.

ragerri commented 9 years ago

Los modelos los puedes cargar desde donde quieras, no hace falta cambiar el código, simplemente darle el path del modelo a las Properties. De todas maneras, no puedo ver lo que has cambiado porque en el diff me aparecen cambiadas las dos clases enteras.

Neuw84 commented 9 years ago

El modelo ya veo que si via lo de las Properties si, pero si no me equivocado a la hora de cargar los diccionarios lo hace desde un directorio por defecto. Al final he añadido un parametro más a las Properties (opcional) llamado directory. Luego si esta definido a la hora de cargar los diccionarios he añadido dos metodos en la clase resources.

 public final URL getBinaryTaggerDictFromDir(String directory, String lang) {
       URL dictURL = null;
        try {
            if (lang.equalsIgnoreCase("es")) {
                dictURL = new File(directory + "/lemmatizer-dicts/freeling/spanish-monosemic.dict").toURI().toURL();
            }
            if (lang.equalsIgnoreCase("gl")) {
                dictURL = new File(directory + "/lemmatizer-dicts/ctag/galician-monosemic.dict").toURI().toURL();
            }
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
        return dictURL;
     }           } 

y el otro

  public final URL getBinaryDictFromDir(String directory, final String lang) {
        URL dictURL = null;
        try {

            if (lang.equalsIgnoreCase("en")) {
                dictURL = new File(directory + "lemmatizer-dicts/language-tool/english.dict").toURI().toURL();
            }
            if (lang.equalsIgnoreCase("es")) {
                dictURL = new File(directory + "lemmatizer-dicts/freeling/spanish.dict").toURI().toURL();
            }
            if (lang.equalsIgnoreCase("gl")) {
                dictURL = new File(directory + "lemmatizer-dicts/ctag/galician.dict").toURI().toURL();
            }
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }

        return dictURL;

}

a la hora de cargarlos en la clase Annotate lo que hago es ver si en properties esta definido el Dir, y si lo esta a la hora de cargar los diccionarios llamo a estos metodos en vez de a los de por defecto

La modificacion del constructor (un if al fin y al cabo)

 public Annotate(final Properties properties) throws IOException {
        this.lang = properties.getProperty("language");
        this.multiwords = Boolean.valueOf(properties.getProperty("multiwords"));
        this.dictag = Boolean.valueOf(properties.getProperty("dictag"));
        if (properties.getProperty("directory") != null) {
            directory = properties.getProperty("directory");
        }
        if (this.multiwords) {
            this.multiWordMatcher = new MultiWordMatcher(properties);
        }
        if (this.dictag) {
            loadMorphoTaggerDicts(properties);
        }
        loadLemmatizerDicts(properties);
        this.morphoFactory = new MorphoFactory();
        this.posTagger = new MorphoTagger(properties, this.morphoFactory);
    }

A la hora de cargar los diccionarios un if else sencillo tambien

private void loadLemmatizerDicts(final Properties props) {
        final Resources resources = new Resources();
        final URL binLemmatizerURL;
        if (directory == null) {
            binLemmatizerURL = resources.getBinaryDict(this.lang);
        } else {
            binLemmatizerURL = resources.getBinaryDictFromDir(directory, this.lang);
        }
        if (binLemmatizerURL == null) {
            System.err
                    .println("ERROR: No binary lemmatizer dictionary available for language "
                            + this.lang + " in src/main/resources!!");
            System.exit(1);
        }
        try {
            this.dictLemmatizer = new MorfologikLemmatizer(binLemmatizerURL,
                    this.lang);
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }

No se que ha pasado que se ha movido toda la clase supongo que igual alguna linea que igual he quitado y asi es imposible ver los cambios

ragerri commented 9 years ago

Closed.