用于SentenceDetector的Opennlp 1.5?

Cha*_*pps 2 java nlp opennlp

现在我有以下代码:

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)

当然,这不是我们想要的.我该如何解决这个问题?感谢名单.

aab*_*aab 7

我不认为提供OpenNLP句子检测模型是一个很好的适合你的任务,因为它已经被训练的数据,其中空白如下句末标点,因为这是英文拼写相当标准.英语句子探测器通常意在缩写,报价等.在所有情况下,句末标点和标点符号使用中间的句子来区分,你的径流式的磨句子探测器是要指望某种句子之间的空白.

如果您想使用OpenNLP,我认为最简单的解决方案是预处理您的数据,以添加一个空间,您可以检测到类似的模式[a-z][.?!][A-Z].(这种模式显然是不足够的,但只给一个想法.)有没有有格式,如Nnnn.Nnnn或NNNN?NNNN所以我敢打赌,你可以达到很好的效果,而无需使用任何票友比正则表达式许多缩写,但这取决于您的数据是什么样的.或者,您可以使用某种带有自定义模型的标记生成器来查找这些情况.

你也可以训练你自己的句子检测模型,不要指望句子之间有空格,但看起来这对OpenNLP来说会很棘手.他们提供的训练计划期望训练数据每行一个句子,所以没有办法避免在句子之间插入空格.