我需要使用OpenNLP Parser来完成特定任务。文档建议您发送标记化输入,这意味着不会进行进一步的标记化。但是,当我传递带括号,括号或大括号的字符串时,OpenNLP会将它们标记化并将它们转换为PTB标记。
我不希望这种情况发生,但我无法弄清楚如何预防。
具体来说,如果我的输入包含" {2}",我希望它保持这种状态,而不是变成" -LCB-2 -RCB - "。我现在有3个令牌,我曾经有过一个令牌。我也非常希望不必对输出进行后期处理以撤消PTB令牌。
有没有办法阻止OpenNLP Parser进行标记化?
答案 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)))(。))))
但是如果你训练自己的标记器,并且不要将你想要保留的案例拆分为单个标记,那么猜猜这应该有效。