现在我有以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
但我得到了以下结果:
This is a good senttence.I'm very happy.
Who can tell me the truth.And go to school.
Run Code Online (Sandbox Code Playgroud)
当然,这不是我们想要的.我该如何解决这个问题?感谢名单.
我不认为提供OpenNLP句子检测模型是一个很好的适合你的任务,因为它已经被训练的数据,其中空白如下句末标点,因为这是英文拼写相当标准.英语句子探测器通常意在缩写,报价等.在所有情况下,句末标点和标点符号使用中间的句子来区分,你的径流式的磨句子探测器是要指望某种句子之间的空白.
如果您想使用OpenNLP,我认为最简单的解决方案是预处理您的数据,以添加一个空间,您可以检测到类似的模式[a-z][.?!][A-Z].(这种模式显然是不足够的,但只给一个想法.)有没有有格式,如Nnnn.Nnnn或NNNN?NNNN所以我敢打赌,你可以达到很好的效果,而无需使用任何票友比正则表达式许多缩写,但这取决于您的数据是什么样的.或者,您可以使用某种带有自定义模型的标记生成器来查找这些情况.
你也可以训练你自己的句子检测模型,不要指望句子之间有空格,但看起来这对OpenNLP来说会很棘手.他们提供的训练计划期望训练数据每行一个句子,所以没有办法避免在句子之间插入空格.
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |