OpenNLP - Satzerkennung

Bei der Verarbeitung einer natürlichen Sprache ist die Entscheidung über Anfang und Ende der Sätze eines der zu behandelnden Probleme. Dieser Vorgang ist bekannt alsSEntenz Boundary DIsambiguierung (SBD) oder einfach Satzbruch.

Die Techniken, mit denen wir die Sätze im angegebenen Text erkennen, hängen von der Sprache des Textes ab.

Satzerkennung mit Java

Wir können die Sätze im angegebenen Text in Java mithilfe von regulären Ausdrücken und einer Reihe einfacher Regeln erkennen.

Nehmen wir zum Beispiel an, ein Punkt, ein Fragezeichen oder ein Ausrufezeichen beenden einen Satz im angegebenen Text, dann können wir den Satz mit dem aufteilen split() Methode der StringKlasse. Hier müssen wir einen regulären Ausdruck im String-Format übergeben.

Das folgende Programm ermittelt die Sätze in einem bestimmten Text mithilfe von regulären Java-Ausdrücken (split method). Speichern Sie dieses Programm in einer Datei mit dem NamenSentenceDetection_RE.java.

public class SentenceDetection_RE {  
   public static void main(String args[]){ 
     
      String sentence = " Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
     
      String simple = "[.?!]";      
      String[] splitString = (sentence.split(simple));     
      for (String string : splitString)   
         System.out.println(string);      
   } 
}

Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie mit den folgenden Befehlen an der Eingabeaufforderung aus.

javac SentenceDetection_RE.java 
java SentenceDetection_RE

Bei der Ausführung erstellt das obige Programm ein PDF-Dokument mit der folgenden Meldung.

Hi 
How are you 
Welcome to Tutorialspoint 
We provide free tutorials on various technologies

Satzerkennung mit OpenNLP

Um Sätze zu erkennen, verwendet OpenNLP ein vordefiniertes Modell, eine Datei mit dem Namen en-sent.bin. Dieses vordefinierte Modell ist darauf trainiert, Sätze in einem bestimmten Rohtext zu erkennen.

Das opennlp.tools.sentdetect Das Paket enthält die Klassen und Schnittstellen, die zur Ausführung der Satzerkennungsaufgabe verwendet werden.

Um einen Satz mithilfe der OpenNLP-Bibliothek zu erkennen, müssen Sie -

  • Laden Sie die en-sent.bin Modell mit dem SentenceModel Klasse

  • Instanziieren Sie die SentenceDetectorME Klasse.

  • Erkennen Sie die Sätze mit dem sentDetect() Methode dieser Klasse.

Im Folgenden sind die Schritte aufgeführt, die zum Schreiben eines Programms ausgeführt werden müssen, das die Sätze aus dem angegebenen Rohtext erkennt.

Schritt 1: Laden des Modells

Das Modell zur Satzerkennung wird durch die genannte Klasse dargestellt SentenceModel, die zum Paket gehört opennlp.tools.sentdetect.

So laden Sie ein Satzerkennungsmodell:

  • Erstelle ein InputStream Objekt des Modells (Instanziieren Sie den FileInputStream und übergeben Sie den Pfad des Modells im String-Format an seinen Konstruktor).

  • Instanziieren Sie die SentenceModel Klasse und bestehen die InputStream (Objekt) des Modells als Parameter für seinen Konstruktor, wie im folgenden Codeblock gezeigt -

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Schritt 2: Instanziieren der SentenceDetectorME-Klasse

Das SentenceDetectorME Klasse des Pakets opennlp.tools.sentdetectenthält Methoden zum Aufteilen des Rohtextes in Sätze. Diese Klasse verwendet das Maximum-Entropy-Modell, um Satzende-Zeichen in einer Zeichenfolge auszuwerten und festzustellen, ob sie das Ende eines Satzes bedeuten.

Instanziieren Sie diese Klasse und übergeben Sie das im vorherigen Schritt erstellte Modellobjekt, wie unten gezeigt.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Schritt 3: Erkennen des Satzes

Das sentDetect() Methode der SentenceDetectorMEKlasse wird verwendet, um die Sätze im übergebenen Rohtext zu erkennen. Diese Methode akzeptiert eine String-Variable als Parameter.

Rufen Sie diese Methode auf, indem Sie das String-Format des Satzes an diese Methode übergeben.

//Detecting the sentence 
String sentences[] = detector.sentDetect(sentence);

Example

Es folgt das Programm, das die Sätze in einem bestimmten Rohtext erkennt. Speichern Sie dieses Programm in einer Datei mit dem NamenSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionME { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
    
      //Detecting the sentence
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);  
   } 
}

Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:

javac SentenceDetectorME.java 
java SentenceDetectorME

Bei der Ausführung liest das obige Programm den angegebenen String und erkennt die darin enthaltenen Sätze und zeigt die folgende Ausgabe an.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Erkennen der Positionen der Sätze

Wir können die Positionen der Sätze auch mit der sentPosDetect () -Methode von ermitteln SentenceDetectorME class.

Im Folgenden sind die Schritte aufgeführt, die zum Schreiben eines Programms ausgeführt werden müssen, das die Positionen der Sätze aus dem angegebenen Rohtext erkennt.

Schritt 1: Laden des Modells

Das Modell zur Satzerkennung wird durch die genannte Klasse dargestellt SentenceModel, die zum Paket gehört opennlp.tools.sentdetect.

So laden Sie ein Satzerkennungsmodell:

  • Erstelle ein InputStream Objekt des Modells (Instanziieren Sie den FileInputStream und übergeben Sie den Pfad des Modells im String-Format an seinen Konstruktor).

  • Instanziieren Sie die SentenceModel Klasse und bestehen die InputStream (Objekt) des Modells als Parameter für seinen Konstruktor, wie im folgenden Codeblock gezeigt.

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Schritt 2: Instanziieren der SentenceDetectorME-Klasse

Das SentenceDetectorME Klasse des Pakets opennlp.tools.sentdetectenthält Methoden zum Aufteilen des Rohtextes in Sätze. Diese Klasse verwendet das Maximum-Entropy-Modell, um Satzende-Zeichen in einer Zeichenfolge auszuwerten und festzustellen, ob sie das Ende eines Satzes bedeuten.

Instanziieren Sie diese Klasse und übergeben Sie das im vorherigen Schritt erstellte Modellobjekt.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Schritt 3: Ermitteln der Position des Satzes

Das sentPosDetect() Methode der SentenceDetectorMEDie Klasse wird verwendet, um die Positionen der Sätze im übergebenen Rohtext zu ermitteln. Diese Methode akzeptiert eine String-Variable als Parameter.

Rufen Sie diese Methode auf, indem Sie das String-Format des Satzes als Parameter an diese Methode übergeben.

//Detecting the position of the sentences in the paragraph  
Span[] spans = detector.sentPosDetect(sentence);

Schritt 4: Drucken der Sätze

Das sentPosDetect() Methode der SentenceDetectorME Klasse gibt ein Array von Objekten des Typs zurück Span. Die Klasse namens Span of theopennlp.tools.util Paket wird verwendet, um die Start- und End-Ganzzahl von Mengen zu speichern.

Sie können die vom sentPosDetect() Methode im Span-Array und drucken Sie sie aus, wie im folgenden Codeblock gezeigt.

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

Example

Es folgt das Programm, das die Sätze im angegebenen Rohtext erkennt. Speichern Sie dieses Programm in einer Datei mit dem NamenSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
  
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span;

public class SentencePosDetection { 
  
   public static void main(String args[]) throws Exception { 
   
      String paragraph = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the raw text 
      Span spans[] = detector.sentPosDetect(paragraph); 
       
      //Printing the spans of the sentences in the paragraph 
      for (Span span : spans)         
         System.out.println(span);  
   } 
}

Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:

javac SentencePosDetection.java 
java SentencePosDetection

Bei der Ausführung liest das obige Programm den angegebenen String und erkennt die darin enthaltenen Sätze und zeigt die folgende Ausgabe an.

[0..16) 
[17..43) 
[44..93)

Sätze zusammen mit ihren Positionen

Das substring() Methode der String-Klasse akzeptiert die begin und die end offsetsund gibt die entsprechende Zeichenfolge zurück. Mit dieser Methode können wir die Sätze und ihre Bereiche (Positionen) zusammen drucken, wie im folgenden Codeblock gezeigt.

for (Span span : spans)         
   System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);

Das folgende Programm erkennt die Sätze aus dem angegebenen Rohtext und zeigt sie zusammen mit ihren Positionen an. Speichern Sie dieses Programm in einer Datei mit NamenSentencesAndPosDetection.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span; 
   
public class SentencesAndPosDetection { 
  
   public static void main(String args[]) throws Exception { 
     
      String sen = "Hi. How are you? Welcome to Tutorialspoint." 
         + " We provide free tutorials on various technologies"; 
      //Loading a sentence model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the paragraph  
      Span[] spans = detector.sentPosDetect(sen);  
      
      //Printing the sentences and their spans of a paragraph 
      for (Span span : spans)         
         System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);  
   } 
}

Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

Bei der Ausführung liest das obige Programm den angegebenen String und erkennt die Sätze zusammen mit ihren Positionen und zeigt die folgende Ausgabe an.

Hi. How are you? [0..16) 
Welcome to Tutorialspoint. [17..43)  
We provide free tutorials on various technologies [44..93)

Satzwahrscheinlichkeitserkennung

Das getSentenceProbabilities() Methode der SentenceDetectorME Klasse gibt die Wahrscheinlichkeiten zurück, die mit den letzten Aufrufen der sentDetect () -Methode verknüpft sind.

//Getting the probabilities of the last decoded sequence       
double[] probs = detector.getSentenceProbabilities();

Im Folgenden finden Sie das Programm zum Drucken der Wahrscheinlichkeiten, die mit den Aufrufen der sentDetect () -Methode verbunden sind. Speichern Sie dieses Programm in einer Datei mit dem NamenSentenceDetectionMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionMEProbs { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class
      SentenceDetectorME detector = new SentenceDetectorME(model);  
      
      //Detecting the sentence 
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);   
         
      //Getting the probabilities of the last decoded sequence       
      double[] probs = detector.getSentenceProbabilities(); 
       
      System.out.println("  "); 
       
      for(int i = 0; i<probs.length; i++) 
         System.out.println(probs[i]); 
   } 
}

Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:

javac SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

Bei der Ausführung liest das obige Programm den angegebenen String, erkennt die Sätze und druckt sie aus. Darüber hinaus werden auch die Wahrscheinlichkeiten zurückgegeben, die mit den letzten Aufrufen der sentDetect () -Methode verknüpft sind (siehe unten).

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies 
   
0.9240246995179983 
0.9957680129995953 
1.0