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