现在,我有以下代码:
SentenceModel sd_model = null;
try {
sd_model = new SentenceModel(new FileInputStream(
"opennlp/models/english/sentdetect/en-sent.bin"));
} catch (InvalidFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SentenceDetectorME mSD = new SentenceDetectorME(sd_model);
String param = "This is a good senttence.I'm very happy. Who can tell me the truth.And go to school.";
String[] sents = mSD.sentDetect(param);
for(String sent : sents){
System.out.println(sent);
}
但是我得到了以下结果:
This is a good senttence.I'm very happy.
Who can tell me the truth.And go to school.
绝对不是我们想要的。我该如何解决该问题?谢谢。
最佳答案
我认为OpenNLP随附的句子检测模型不适合您的任务,因为它已经在空格和句子结尾标点符号之间的数据上进行了训练,因为这在英语拼写法中是相当标准的。英语句子检测器通常旨在区分句子末尾的标点符号和缩写,引号等在中间句子中使用的标点符号。在所有情况下,普通的句子检测器都会期望句子之间存在某种空白。
如果您想使用OpenNLP,我认为最简单的解决方案是对数据进行预处理,以在其中检测到[a-z][.?!][A-Z]
之类的模式时添加一个空格。 (显然,这种模式是不够的,只是给出一个主意。)没有多少缩写具有Nnnn.Nnnn或Nnnn?Nnnn之类的格式,所以我敢打赌,无需使用任何比正则表达式更出色的方法,就可以取得良好的结果。 ,但这取决于您的数据是什么样。另外,您可以使用带有定制模型的某种标记器来查找这些情况。
也有可能您可以训练自己的句子检测模型,该模型不会期望句子之间有空格,但是使用OpenNLP似乎很棘手。他们提供的培训计划期望培训数据每行只有一个句子,因此无法避免在句子之间插入空格。
关于java - SentenceDetector的Opennlp 1.5?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3820155/