2011-04-29 17 views
18

Quiero POStagponer una oración en inglés y hacer algún procesamiento. Me gustaría usar openNLP. Lo tengo instalado¿Cómo usar OpenNLP con Java?

Cuando ejecuto el comando

I:\Workshop\Programming\nlp\opennlp-tools-1.5.0-bin\opennlp-tools-1.5.0>java -jar opennlp-tools-1.5.0.jar POSTagger models\en-pos-maxent.bin < Text.txt 

Da salida POSTagging la entrada en Text.txt

Loading POS Tagger model ... done (4.009s) 
My_PRP$ name_NN is_VBZ Shabab_NNP i_FW am_VBP 22_CD years_NNS old._. 


Average: 66.7 sent/s 
Total: 1 sent 
Runtime: 0.015s 

espero que ha instalado correctamente?

Ahora, ¿cómo hago esto POS etiquetado desde dentro de una aplicación java? He agregado openNLPtools, jwnl, maxent jar al proyecto, pero ¿cómo invoco el POStagging?

Respuesta

35

Aquí hay algunos (de edad) código de ejemplo Tiré juntos, con el código modernizado a seguir:

package opennlp; 

import opennlp.tools.cmdline.PerformanceMonitor; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer; 
import opennlp.tools.util.ObjectStream; 
import opennlp.tools.util.PlainTextByLineStream; 

import java.io.File; 
import java.io.IOException; 
import java.io.StringReader; 

public class OpenNlpTest { 
public static void main(String[] args) throws IOException { 
    POSModel model = new POSModelLoader().load(new File("en-pos-maxent.bin")); 
    PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent"); 
    POSTaggerME tagger = new POSTaggerME(model); 

    String input = "Can anyone help me dig through OpenNLP's horrible documentation?"; 
    ObjectStream<String> lineStream = 
      new PlainTextByLineStream(new StringReader(input)); 

    perfMon.start(); 
    String line; 
    while ((line = lineStream.read()) != null) { 

     String whitespaceTokenizerLine[] = WhitespaceTokenizer.INSTANCE.tokenize(line); 
     String[] tags = tagger.tag(whitespaceTokenizerLine); 

     POSSample sample = new POSSample(whitespaceTokenizerLine, tags); 
     System.out.println(sample.toString()); 

     perfMon.incrementCounter(); 
    } 
    perfMon.stopAndPrintFinalResult(); 
} 
} 

La salida es:

Loading POS Tagger model ... done (2.045s) 
Can_MD anyone_NN help_VB me_PRP dig_VB through_IN OpenNLP's_NNP horrible_JJ documentation?_NN 

Average: 76.9 sent/s 
Total: 1 sent 
Runtime: 0.013s 

Esto es, básicamente, trabajando de la clase POSTaggerTool incluido como parte de OpenNLP. El sample.getTags() es una matriz String que tiene los tipos de etiquetas.

Esto requiere acceso directo a los archivos de los datos de entrenamiento, lo cual es realmente, muy poco convincente.

Un código base actualizado para esto es un poco diferente

primer lugar, un POM Maven (y probablemente más útil.):

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.javachannel</groupId> 
    <artifactId>opennlp-example</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.opennlp</groupId> 
      <artifactId>opennlp-tools</artifactId> 
      <version>1.6.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>[6.8.21,)</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Y aquí está el código, escrito como una prueba, por lo tanto, se encuentra en ./src/test/java/org/javachannel/opennlp/example:

package org.javachannel.opennlp.example; 

import opennlp.tools.cmdline.PerformanceMonitor; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 
import java.util.stream.Stream; 

public class POSTest { 
    private void download(String url, File destination) throws IOException { 
     URL website = new URL(url); 
     ReadableByteChannel rbc = Channels.newChannel(website.openStream()); 
     FileOutputStream fos = new FileOutputStream(destination); 
     fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
    } 

    @DataProvider 
    Object[][] getCorpusData() { 
     return new Object[][][]{{{ 
       "Can anyone help me dig through OpenNLP's horrible documentation?" 
     }}}; 
    } 

    @Test(dataProvider = "getCorpusData") 
    public void showPOS(Object[] input) throws IOException { 
     File modelFile = new File("en-pos-maxent.bin"); 
     if (!modelFile.exists()) { 
      System.out.println("Downloading model."); 
      download("http://opennlp.sourceforge.net/models-1.5/en-pos-maxent.bin", modelFile); 
     } 
     POSModel model = new POSModel(modelFile); 
     PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent"); 
     POSTaggerME tagger = new POSTaggerME(model); 

     perfMon.start(); 
     Stream.of(input).map(line -> { 
      String whitespaceTokenizerLine[] = WhitespaceTokenizer.INSTANCE.tokenize(line.toString()); 
      String[] tags = tagger.tag(whitespaceTokenizerLine); 

      POSSample sample = new POSSample(whitespaceTokenizerLine, tags); 

      perfMon.incrementCounter(); 
      return sample.toString(); 
     }).forEach(System.out::println); 
     perfMon.stopAndPrintFinalResult(); 
    } 
} 

Este código en realidad no prueba nada - es una prueba de humo, en todo caso - pero debería servir como punto de partida. Otra cosa (potencialmente) buena es que descarga un modelo para usted si no lo tiene ya descargado.

+0

Gracias muy muy muy muy mucho .. Soy finalmente a la pista? ¿Puede decirme dónde puedo encontrar el significado de - NN MD, VB ... y todas estas etiquetas? – shababhsiddique

+0

¡No tengo ni idea! Estoy trabajando en eso ahora, porque me di cuenta, gracias a su pregunta, de cuán útil sería OpenNLP para una tarea propia. :) –

+2

Creo que esto te ayudará http://bulba.sdsu.edu/jeanette/thesis/PennTags.html – shababhsiddique

Cuestiones relacionadas