📅  最后修改于: 2020-11-23 03:54:09             🧑  作者: Mango
在处理自然语言时,确定句子的开头和结尾是要解决的问题之一。这个过程被称为为S entence乙oundary d isambiguation(SBD)或简单句子断裂。
我们用来检测给定文本中句子的技术取决于文本的语言。
我们可以使用正则表达式和一组简单规则来检测Java中给定文本中的句子。
例如,让我们假设一个句点,一个问号或一个感叹号在给定文本中结束一个句子,然后我们可以使用String类的split()方法对句子进行拆分。在这里,我们必须以String格式传递正则表达式。
以下是使用Java正则表达式(拆分方法)确定给定文本中的句子的程序。将该程序保存在名为SentenceDetection_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);
}
}
使用以下命令从命令提示符处编译并执行保存的Java文件。
javac SentenceDetection_RE.java
java SentenceDetection_RE
执行时,上述程序将创建一个显示以下消息的PDF文档。
Hi
How are you
Welcome to Tutorialspoint
We provide free tutorials on various technologies
为了检测句子,OpenNLP使用预定义的模型,即名为en-sent.bin的文件。训练该预定义模型以检测给定原始文本中的句子。
opennlp.tools.sentdetect软件包包含用于执行句子检测任务的类和接口。
要使用OpenNLP库检测句子,您需要-
使用SentenceModel类加载en-sent.bin模型
实例化SentenceDetectorME类。
使用此类的sendDetect()方法检测句子。
以下是编写程序的步骤,该程序将从给定的原始文本中检测句子。
句子检测模型由名为SentenceModel的类表示,该类属于包opennlp.tools.sentdetect 。
加载句子检测模型-
创建模型的InputStream对象(实例化FileInputStream并将String格式的模型路径传递给其构造函数)。
实例化SentenceModel类,并将模型的InputStream (对象)作为参数传递给其构造函数,如以下代码块所示-
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin");
SentenceModel model = new SentenceModel(inputStream);
软件包opennlp.tools.sentdetect的SentenceDetectorME类包含将原始文本拆分为句子的方法。此类使用最大熵模型评估字符串中的句子结尾字符,以确定它们是否表示句子的结尾。
实例化该类并传递在上一步中创建的模型对象,如下所示。
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
SentenceDetectorME类的sendDetect()方法用于检测传递给它的原始文本中的句子。此方法接受String变量作为参数。
通过将句子的String格式传递给此方法来调用此方法。
//Detecting the sentence
String sentences[] = detector.sentDetect(sentence);
例
以下是检测给定原始文本中的句子的程序。将该程序保存在名为SentenceDetectionME.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);
}
}
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac SentenceDetectorME.java
java SentenceDetectorME
执行时,上面的程序读取给定的String并检测其中的句子并显示以下输出。
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
我们还可以使用SentenceDetectorME类的sendPosDetect()方法检测句子的位置。
以下是编写程序的步骤,该程序将从给定的原始文本中检测句子的位置。
句子检测模型由名为SentenceModel的类表示,该类属于包opennlp.tools.sentdetect 。
加载句子检测模型-
创建模型的InputStream对象(实例化FileInputStream并将String格式的模型路径传递给其构造函数)。
实例化SentenceModel类,并将模型的InputStream (对象)作为参数传递给其构造函数,如下面的代码块所示。
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
SentenceModel model = new SentenceModel(inputStream);
软件包opennlp.tools.sentdetect的SentenceDetectorME类包含将原始文本拆分为句子的方法。此类使用最大熵模型评估字符串中的句子结尾字符,以确定它们是否表示句子的结尾。
实例化此类并传递在上一步中创建的模型对象。
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
SentenceDetectorME类的sentPosDetect()方法用于检测传递给它的原始文本中句子的位置。此方法接受String变量作为参数。
通过将句子的String格式作为参数传递给此方法来调用此方法。
//Detecting the position of the sentences in the paragraph
Span[] spans = detector.sentPosDetect(sentence);
SentenceDetectorME类的sentPosDetect()方法返回Span类型的对象数组。 opennlp.tools.util包的名为Span的类用于存储集合的开始和结束整数。
您可以将sendPosDetect()方法返回的跨度存储在Span数组中并进行打印,如下面的代码块所示。
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
例
以下是检测给定原始文本中的句子的程序。将该程序保存在名为SentenceDetectionME.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);
}
}
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac SentencePosDetection.java
java SentencePosDetection
执行时,上面的程序读取给定的String并检测其中的句子并显示以下输出。
[0..16)
[17..43)
[44..93)
String类的substring()方法接受开始和结束偏移量,并返回相应的字符串。我们可以使用这种方法一起打印句子及其跨度(位置),如下面的代码块所示。
for (Span span : spans)
System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);
以下是从给定的原始文本中检测句子并显示其位置的程序。将该程序保存在名为SentencesAndPosDetection.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);
}
}
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac SentencesAndPosDetection.java
java SentencesAndPosDetection
在执行时,上述程序读取给定的String并检测句子及其位置,并显示以下输出。
Hi. How are you? [0..16)
Welcome to Tutorialspoint. [17..43)
We provide free tutorials on various technologies [44..93)
SentenceDetectorME类的getSentenceProbabilities()方法返回与对sendDetect()方法的最新调用相关的概率。
//Getting the probabilities of the last decoded sequence
double[] probs = detector.getSentenceProbabilities();
以下是打印与sendDetect()方法的调用相关联的概率的程序。将该程序保存在名为SentenceDetectionMEProbs.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
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac SentenceDetectionMEProbs.java
java SentenceDetectionMEProbs
在执行时,以上程序读取给定的String并检测句子并打印出来。此外,它还会将与最近调用有关的概率返回到sendDetect()方法,如下所示。
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
0.9240246995179983
0.9957680129995953
1.0