2010-09-29 67 views
2

现在我有以下代码:用于SentenceDetector的Opennlp 1.5?

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); 
    } 

但我得到的follwing结果:

This is a good senttence.I'm very happy. 
Who can tell me the truth.And go to school. 

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

回答

0

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

+0

opennlp.tools.lang.english.SentenceDetector有同样的问题。 – 2010-09-29 12:32:10

7

我不认为提供OpenNLP句子检测模型是一个很好的适合你的任务,因为它已经被训练的数据,其中空白如下句末标点,因为这是英文拼写相当标准。英语句子检测器通常用于区分句末标点符号和缩写中使用的标点符号,引号等。在所有情况下,您的普通句子检测器都会期望句子之间存在某种空白。

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

也有可能,你可以训练不希望句子之间的空格自己的句子检测模型,但它看起来像那将是棘手的与OpenNLP。他们提供的培训课程期望训练数据每行有一个句子,因此无法避免在句子之间插入空格。