如何防止OpenNLP Parser对字符串进行标记?

时间:2017-07-07 10:22:01

标签: parsing tokenize opennlp

我需要使用OpenNLP Parser来完成特定任务。文档建议您发送标记化输入,这意味着不会进行进一步的标记化。但是,当我传递带括号,括号或大括号的字符串时,OpenNLP会将它们标记化并将它们转换为PTB标记。

我不希望这种情况发生,但我无法弄清楚如何预防。

具体来说,如果我的输入包含" {2}",我希望它保持这种状态,而不是变成" -LCB-2 -RCB - "。我现在有3个令牌,我曾经有过一个令牌。我也非常希望不必对输出进行后期处理以撤消PTB令牌。

有没有办法阻止OpenNLP Parser进行标记化?

1 个答案:

答案 0 :(得分:1)

查看javadocs,有两个parseLine方法,其中一个可以指定一个tokenizer。我没有尝试过以下内容,但我想训练你自己的标记器(https://opennlp.apache.org/docs/1.8.0/manual/opennlp.html#tools.tokenizer.training),这应该不是那么多问题,如果需要的话,还可以转换为简单的空格分割,然后将它提供给parseLine方法(除了句子和所需解析的数量之外,还应该做到这一点。例如以下内容:

public static void main(String args[]) throws Exception{  
      InputStream inputStream = new FileInputStream(FileFactory.generateOrCreateFileInstance(<location to en-parser-chunking.bin>)); 
      ParserModel model = new ParserModel(inputStream); 
      Parser parser = ParserFactory.create(model); 
      String sentence = "An example with a {2} string.";
      //Parse topParses[] = ParserTool.parseLine(sentence, parser, 1);
      // instead of using the line above, feed it a tokenizer, like so:
      Parse topParses[] = ParserTool.parseLine(sentence, parser, new SimpleTokenizer(), 1);
      for (Parse p : topParses) 
         p.show();          
   } 

这段特殊的代码仍然将{从输入中的2分开,导致:

  

(TOP(NP(NP(DT An)(NN示例))(PP(IN with)(NP(DT a)( - LRB--LCB-)(CD 2)( - RVB--RCB-) (NN string)))(。))))

但是如果你训练自己的标记器,并且不要将你想要保留的案例拆分为单个标记,那么猜猜这应该有效。