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