OpenNLP - Wykrywanie zdań
Podczas przetwarzania języka naturalnego jednym z problemów do rozwiązania jest ustalenie początku i końca zdania. Ten proces jest znany jakoSwejście Boundary Dizambiguacja (SBD) lub po prostu łamanie zdań.
Techniki, których używamy do wykrywania zdań w danym tekście, zależą od języka tekstu.
Wykrywanie zdań za pomocą języka Java
Możemy wykryć zdania w podanym tekście w Javie za pomocą wyrażeń regularnych i zestawu prostych reguł.
Załóżmy na przykład, że na końcu zdania w danym tekście kończy się kropka, znak zapytania lub wykrzyknik, a następnie możemy podzielić zdanie za pomocą split() metoda Stringklasa. Tutaj musimy przekazać wyrażenie regularne w formacie String.
Poniżej znajduje się program, który określa zdania w danym tekście za pomocą wyrażeń regularnych Java (split method). Zapisz ten program w pliku o nazwieSentenceDetection_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);
}
}
Skompiluj i uruchom zapisany plik java z wiersza poleceń, używając następujących poleceń.
javac SentenceDetection_RE.java
java SentenceDetection_RE
Podczas wykonywania powyższy program tworzy dokument PDF z następującym komunikatem.
Hi
How are you
Welcome to Tutorialspoint
We provide free tutorials on various technologies
Wykrywanie zdań za pomocą OpenNLP
Aby wykryć zdania, OpenNLP używa predefiniowanego modelu, pliku o nazwie en-sent.bin. Ten predefiniowany model jest uczony do wykrywania zdań w danym surowym tekście.
Plik opennlp.tools.sentdetect pakiet zawiera klasy i interfejsy, które są używane do wykonywania zadania wykrywania zdań.
Aby wykryć zdanie za pomocą biblioteki OpenNLP, musisz -
Załaduj en-sent.bin model przy użyciu SentenceModel klasa
Utwórz wystąpienie SentenceDetectorME klasa.
Wykryj zdania za pomocą sentDetect() metoda tej klasy.
Poniżej przedstawiono kroki, które należy wykonać, aby napisać program, który wykrywa zdania z podanego surowego tekstu.
Krok 1: Ładowanie modelu
Model wykrywania zdań jest reprezentowany przez nazwaną klasę SentenceModel, który należy do pakietu opennlp.tools.sentdetect.
Aby załadować model wykrywania zdań -
Stworzyć InputStream obiekt modelu (Utwórz wystąpienie FileInputStream i przekaż ścieżkę modelu w formacie String do jego konstruktora).
Utwórz wystąpienie SentenceModel klasę i zdaj InputStream (obiekt) modelu jako parametr jego konstruktora, jak pokazano w poniższym bloku kodu -
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin");
SentenceModel model = new SentenceModel(inputStream);
Krok 2: tworzenie wystąpienia klasy SentenceDetectorME
Plik SentenceDetectorME klasa pakietu opennlp.tools.sentdetectzawiera metody dzielenia surowego tekstu na zdania. Ta klasa używa modelu Maximum Entropy do oceny znaków końca zdania w ciągu w celu określenia, czy oznaczają one koniec zdania.
Utwórz wystąpienie tej klasy i przekaż obiekt modelu utworzony w poprzednim kroku, jak pokazano poniżej.
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
Krok 3: Wykrywanie zdania
Plik sentDetect() metoda SentenceDetectorMEklasa służy do wykrywania zdań w przekazanym do niej nieprzetworzonym tekście. Ta metoda akceptuje zmienną typu String jako parametr.
Wywołaj tę metodę, przekazując format String zdania do tej metody.
//Detecting the sentence
String sentences[] = detector.sentDetect(sentence);
Example
Poniżej znajduje się program, który wykrywa zdania w danym surowym tekście. Zapisz ten program w pliku o nazwieSentenceDetectionME.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);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac SentenceDetectorME.java
java SentenceDetectorME
Podczas wykonywania powyższy program odczytuje podany ciąg znaków i wykrywa zawarte w nim zdania i wyświetla następujące dane wyjściowe.
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
Wykrywanie pozycji zdań
Możemy również wykryć pozycje zdań za pomocą metody sentPosDetect () metody SentenceDetectorME class.
Poniżej przedstawiono kroki, które należy wykonać, aby napisać program wykrywający pozycje zdań z podanego surowego tekstu.
Krok 1: Ładowanie modelu
Model wykrywania zdań jest reprezentowany przez nazwaną klasę SentenceModel, który należy do pakietu opennlp.tools.sentdetect.
Aby załadować model wykrywania zdań -
Stworzyć InputStream obiekt modelu (Utwórz wystąpienie FileInputStream i przekaż ścieżkę modelu w formacie String do jego konstruktora).
Utwórz wystąpienie SentenceModel klasę i zdaj InputStream (obiekt) modelu jako parametr jego konstruktora, jak pokazano w poniższym bloku kodu.
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
SentenceModel model = new SentenceModel(inputStream);
Krok 2: tworzenie wystąpienia klasy SentenceDetectorME
Plik SentenceDetectorME klasa pakietu opennlp.tools.sentdetectzawiera metody dzielenia surowego tekstu na zdania. Ta klasa używa modelu Maximum Entropy do oceny znaków końca zdania w ciągu w celu określenia, czy oznaczają one koniec zdania.
Utwórz wystąpienie tej klasy i przekaż obiekt modelu utworzony w poprzednim kroku.
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
Krok 3: Wykrywanie pozycji zdania
Plik sentPosDetect() metoda SentenceDetectorMEklasa służy do wykrywania pozycji zdań w przekazanym do niej nieprzetworzonym tekście. Ta metoda akceptuje zmienną typu String jako parametr.
Wywołaj tę metodę, przekazując format String zdania jako parametr do tej metody.
//Detecting the position of the sentences in the paragraph
Span[] spans = detector.sentPosDetect(sentence);
Krok 4: Drukowanie rozpiętości zdań
Plik sentPosDetect() metoda SentenceDetectorME class zwraca tablicę obiektów tego typu Span. Klasa o nazwie Span of theopennlp.tools.util pakiet służy do przechowywania początkowej i końcowej liczby całkowitej zestawów.
Możesz przechowywać rozpiętości zwrócone przez sentPosDetect() w tablicy Span i wydrukuj je, jak pokazano w poniższym bloku kodu.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
Example
Poniżej znajduje się program, który wykrywa zdania w podanym surowym tekście. Zapisz ten program w pliku o nazwieSentenceDetectionME.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);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac SentencePosDetection.java
java SentencePosDetection
Podczas wykonywania powyższy program odczytuje podany ciąg znaków i wykrywa zawarte w nim zdania i wyświetla następujące dane wyjściowe.
[0..16)
[17..43)
[44..93)
Zdania wraz z ich pozycjami
Plik substring() metoda klasy String akceptuje metodę begin i end offsetsi zwraca odpowiedni ciąg. Możemy użyć tej metody do wydrukowania zdań i ich rozpiętości (pozycji) razem, jak pokazano w poniższym bloku kodu.
for (Span span : spans)
System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);
Poniżej znajduje się program do wykrywania zdań z podanego surowego tekstu i wyświetlania ich wraz z ich pozycjami. Zapisz ten program w pliku o nazwieSentencesAndPosDetection.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);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac SentencesAndPosDetection.java
java SentencesAndPosDetection
Podczas wykonywania powyższy program odczytuje podany ciąg znaków i wykrywa zdania wraz z ich pozycjami i wyświetla następujące dane wyjściowe.
Hi. How are you? [0..16)
Welcome to Tutorialspoint. [17..43)
We provide free tutorials on various technologies [44..93)
Wykrywanie prawdopodobieństwa zdania
Plik getSentenceProbabilities() metoda SentenceDetectorME class zwraca prawdopodobieństwa skojarzone z ostatnimi wywołaniami metody sentDetect ().
//Getting the probabilities of the last decoded sequence
double[] probs = detector.getSentenceProbabilities();
Poniżej znajduje się program wyświetlający prawdopodobieństwa związane z wywołaniami metody sentDetect (). Zapisz ten program w pliku o nazwieSentenceDetectionMEProbs.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]);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac SentenceDetectionMEProbs.java
java SentenceDetectionMEProbs
Podczas wykonywania powyższy program czyta podany String i wykrywa zdania i je drukuje. Ponadto zwraca również prawdopodobieństwa związane z ostatnimi wywołaniami metody sentDetect (), jak pokazano poniżej.
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
0.9240246995179983
0.9957680129995953
1.0