OpenNLP - Rilevamento di frasi

Durante l'elaborazione di un linguaggio naturale, decidere l'inizio e la fine delle frasi è uno dei problemi da affrontare. Questo processo è noto comeSentence Boundario Disambiguazione (SBD) o semplicemente rottura di una frase.

Le tecniche che usiamo per rilevare le frasi nel testo dato, dipendono dalla lingua del testo.

Rilevamento di frasi tramite Java

Possiamo rilevare le frasi nel testo dato in Java usando, espressioni regolari e una serie di semplici regole.

Ad esempio, supponiamo che un punto, un punto interrogativo o un punto esclamativo termini una frase nel testo dato, quindi possiamo dividere la frase usando il split() metodo del Stringclasse. Qui dobbiamo passare un'espressione regolare in formato String.

Di seguito è riportato il programma che determina le frasi in un dato testo utilizzando espressioni regolari Java (split method). Salva questo programma in un file con il nomeSentenceDetection_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);      
   } 
}

Compilare ed eseguire il file java salvato dal prompt dei comandi utilizzando i seguenti comandi.

javac SentenceDetection_RE.java 
java SentenceDetection_RE

All'esecuzione, il programma di cui sopra crea un documento PDF che mostra il seguente messaggio.

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

Rilevamento di frasi tramite OpenNLP

Per rilevare le frasi, OpenNLP utilizza un modello predefinito, un file denominato en-sent.bin. Questo modello predefinito è addestrato per rilevare frasi in un dato testo grezzo.

Il opennlp.tools.sentdetect Il pacchetto contiene le classi e le interfacce utilizzate per eseguire l'attività di rilevamento delle frasi.

Per rilevare una frase utilizzando la libreria OpenNLP, è necessario:

  • Carica il file en-sent.bin modello utilizzando il SentenceModel classe

  • Istanziare il file SentenceDetectorME classe.

  • Rileva le frasi usando il sentDetect() metodo di questa classe.

Di seguito sono riportati i passaggi da seguire per scrivere un programma che rilevi le frasi dal testo grezzo fornito.

Passaggio 1: caricamento del modello

Il modello per il rilevamento della frase è rappresentato dalla classe denominata SentenceModel, che appartiene al pacchetto opennlp.tools.sentdetect.

Per caricare un modello di rilevamento della frase:

  • Creare un InputStream oggetto del modello (creare un'istanza di FileInputStream e passare il percorso del modello in formato String al suo costruttore).

  • Istanziare il file SentenceModel class e passare il InputStream (oggetto) del modello come parametro del suo costruttore come mostrato nel seguente blocco di codice -

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

Passaggio 2: creazione di un'istanza della classe SentenceDetectorME

Il SentenceDetectorME classe del pacchetto opennlp.tools.sentdetectcontiene metodi per dividere il testo grezzo in frasi. Questa classe utilizza il modello Entropia massima per valutare i caratteri di fine frase in una stringa per determinare se significano la fine di una frase.

Istanziare questa classe e passare l'oggetto modello creato nel passaggio precedente, come mostrato di seguito.

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

Passaggio 3: rilevamento della frase

Il sentDetect() metodo del SentenceDetectorMEclass è usata per rilevare le frasi nel testo grezzo che gli è stato passato. Questo metodo accetta una variabile String come parametro.

Richiamare questo metodo passando il formato String della frase a questo metodo.

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

Example

Di seguito è riportato il programma che rileva le frasi in un dato testo grezzo. Salva questo programma in un file con nomeSentenceDetectionME.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);  
   } 
}

Compilare ed eseguire il file Java salvato dal prompt dei comandi utilizzando i seguenti comandi:

javac SentenceDetectorME.java 
java SentenceDetectorME

In esecuzione, il programma precedente legge la stringa data e rileva le frasi in essa contenute e visualizza il seguente output.

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

Rilevamento delle posizioni delle frasi

Possiamo anche rilevare le posizioni delle frasi utilizzando il metodo sentPosDetect () di SentenceDetectorME class.

Di seguito sono riportati i passaggi da seguire per scrivere un programma che rilevi le posizioni delle frasi dal testo grezzo dato.

Passaggio 1: caricamento del modello

Il modello per il rilevamento della frase è rappresentato dalla classe denominata SentenceModel, che appartiene al pacchetto opennlp.tools.sentdetect.

Per caricare un modello di rilevamento della frase:

  • Creare un InputStream oggetto del modello (creare un'istanza di FileInputStream e passare il percorso del modello in formato String al suo costruttore).

  • Istanziare il file SentenceModel class e passare il InputStream (oggetto) del modello come parametro del suo costruttore, come mostrato nel seguente blocco di codice.

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

Passaggio 2: creazione di un'istanza della classe SentenceDetectorME

Il SentenceDetectorME classe del pacchetto opennlp.tools.sentdetectcontiene metodi per dividere il testo grezzo in frasi. Questa classe utilizza il modello Entropia massima per valutare i caratteri di fine frase in una stringa per determinare se significano la fine di una frase.

Crea un'istanza di questa classe e passa l'oggetto modello creato nel passaggio precedente.

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

Passaggio 3: rilevamento della posizione della frase

Il sentPosDetect() metodo del SentenceDetectorMEclass viene utilizzata per rilevare le posizioni delle frasi nel testo grezzo passato ad essa. Questo metodo accetta una variabile String come parametro.

Richiamare questo metodo passando il formato String della frase come parametro a questo metodo.

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

Passaggio 4: stampa degli intervalli delle frasi

Il sentPosDetect() metodo del SentenceDetectorME class restituisce un array di oggetti del tipo Span. La classe denominata Span diopennlp.tools.util pacchetto viene utilizzato per memorizzare il numero intero iniziale e finale degli insiemi.

È possibile memorizzare le campate restituite da sentPosDetect() nell'array Span e stamparli, come mostrato nel seguente blocco di codice.

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

Example

Di seguito è riportato il programma che rileva le frasi nel testo grezzo fornito. Salva questo programma in un file con nomeSentenceDetectionME.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);  
   } 
}

Compilare ed eseguire il file Java salvato dal prompt dei comandi utilizzando i seguenti comandi:

javac SentencePosDetection.java 
java SentencePosDetection

In esecuzione, il programma precedente legge la stringa data e rileva le frasi in essa contenute e visualizza il seguente output.

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

Frasi insieme alle loro posizioni

Il substring() metodo della classe String accetta il begin e il end offsetse restituisce la rispettiva stringa. Possiamo usare questo metodo per stampare le frasi e le loro estensioni (posizioni) insieme, come mostrato nel seguente blocco di codice.

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

Di seguito è riportato il programma per rilevare le frasi dal testo grezzo dato e visualizzarle insieme alle loro posizioni. Salva questo programma in un file con nomeSentencesAndPosDetection.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);  
   } 
}

Compilare ed eseguire il file Java salvato dal prompt dei comandi utilizzando i seguenti comandi:

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

All'esecuzione, il programma precedente legge la stringa data e rileva le frasi insieme alle loro posizioni e visualizza il seguente output.

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

Rilevamento della probabilità di frase

Il getSentenceProbabilities() metodo del SentenceDetectorME class restituisce le probabilità associate alle chiamate più recenti al metodo sentDetect ().

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

Di seguito è riportato il programma per stampare le probabilità associate alle chiamate al metodo sentDetect (). Salva questo programma in un file con il nomeSentenceDetectionMEProbs.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]); 
   } 
}

Compilare ed eseguire il file Java salvato dal prompt dei comandi utilizzando i seguenti comandi:

javac SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

All'esecuzione, il programma di cui sopra legge la stringa data e rileva le frasi e le stampa. Inoltre, restituisce anche le probabilità associate alle chiamate più recenti al metodo sentDetect (), come mostrato di seguito.

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