2

现在我有以下代码:

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.

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

4

2 回答 2

7

我不认为 OpenNLP 提供的句子检测模型非常适合您的任务,因为它已经在空格跟在句子结尾标点符号之后的数据上进行了训练,因为这在英语正字法中是相当标准的。英语句子检测器通常用于区分句子结尾的标点符号和缩写、引号等中句子中间使用的标点符号。在所有情况下,您的普通句子检测器都会期望句子之间有某种空格.

如果您想使用 OpenNLP,我认为最简单的解决方案是预处理您的数据以添加一个空间,您可以在其中检测到类似[a-z][.?!][A-Z]. (这种模式显然是不够的,只是为了给出一个想法。)没有多少缩写具有像 Nnnn.Nnnn 或 Nnnn?Nnnn 这样的格式,所以我敢打赌,你可以在不使用比正则表达式更高级的东西的情况下获得好的结果,但这取决于您的数据是什么样的。或者,您可以使用某种带有自定义模型的标记器来查找这些情况。

您也可以训练自己的句子检测模型,该模型不希望句子之间有空格,但使用 OpenNLP 看起来会很棘手。他们提供的训练程序期望每行一个句子的训练数据,因此无法避免在句子之间插入空格。

于 2010-09-29T16:00:26.150 回答
0

尝试使用特定语言的句子检测器 (opennlp.tools.lang.english.SentenceDetector)。

于 2010-09-29T09:36:45.303 回答