Parsing 如何防止OpenNLP解析器标记字符串?

Parsing 如何防止OpenNLP解析器标记字符串?,parsing,tokenize,opennlp,Parsing,Tokenize,Opennlp,我需要为特定任务使用OpenNLP解析器。文档建议您向其发送标记化输入,这意味着不会发生进一步的标记化。但是,当我传递一个带有括号、方括号或大括号的字符串时,OpenNLP会将其标记化并将其转换为PTB标记 我不希望这种情况发生,但我不知道如何防止它 具体地说,如果我的输入包含“{2}”,我希望它保持这种状态,而不是变成“-LCB-2-RCB-”。我现在有3个代币,我曾经有一个。我还强烈希望不必对输出进行后期处理以撤消PTB令牌 有没有办法防止OpenNLP解析器标记化?查看javadocs,有

我需要为特定任务使用OpenNLP解析器。文档建议您向其发送标记化输入,这意味着不会发生进一步的标记化。但是,当我传递一个带有括号、方括号或大括号的字符串时,OpenNLP会将其标记化并将其转换为PTB标记

我不希望这种情况发生,但我不知道如何防止它

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


有没有办法防止OpenNLP解析器标记化?

查看javadocs,有两种parseLine方法,其中一种方法可以指定标记器。我没有尝试过以下方法,但我想训练您自己的标记器(),这应该不会有太大问题,如果需要,可以恢复到简单的空格分割,并将其提供给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();          
   } 
publicstaticvoidmain(字符串args[])引发异常{
InputStream InputStream=新文件InputStream(FileFactory.generateOrCreateFileInstance());
ParserModel模型=新的ParserModel(inputStream);
Parser=ParserFactory.create(model);
String-句子=“一个带有{2}字符串的示例。”;
//Parse-topParses[]=ParserTool.parseLine(句子,解析器,1);
//不要使用上面的行,而是为其提供一个标记器,如下所示:
Parse-topParses[]=ParserTool.parseLine(句子,解析器,新的SimpleTokenizer(),1);
for(解析p:topParses)
p、 show();
} 
这段特定的代码仍然将{从输入中的2中分离出来,结果是:

(顶部(NP(NP(DT-An)(NN示例))(PP(带)(NP(DT-a)(-LRB--LCB-)(CD2)(-RRB--RCB-(NN字符串)))(…)


但是,如果您培训自己的标记器,并且不将要保留为单个标记的情况拆分,那么我想这应该会起作用。

对于这项任务,我使用Python的子进程调用opennlp二进制文件。是否有方法覆盖标记器以使用(提供的)如果我的数据已经标记化了,那么命令行中的空白标记器?啊,好吧,我没有经常使用命令行中的opennlp,但是尝试:C:\\apache-opennlp-1.8.1\bin>opennlp解析器用法:opennlp解析器[-bs n-ap n-k n-tk tok_model]模型<句子-bs n:使用n的波束大小。-ap f:以至少f%的概率质量推进结果。-k n:显示前n个解析。这也将显示它们的日志概率。-tk tok_模型:使用指定的标记器模型标记句子。默认为空白标记器。建议您也可以指定标记这里是iser。(为糟糕的格式感到抱歉)嗯……我发现很难相信它默认为空白标记器,因为它正在标记输入。与此同时,我通过在解析之前将问题字符转换为实体,然后再转换回实体来解决问题。:-)哈,我想也是这样:)。如果WhitespaceTokenizer有一点误导性的名称,我也不会感到惊讶,因为它不仅在空格上,而且在标点符号上(但是,与更复杂的Tokeniser相反,它不处理2.50美元这样的东西(并将其视为3或4个标记,而不是1个))。但这只是一种预感,不确定。与其假设……不如尝试一下:System.out.println(Arrays.toString(WhitespaceTokenizer.INSTANCE.tokenize(“这是一个包含{2}.”)的简单示例);这给了我:[这个,是,一个,简单,示例,包含,{2},.],留下了{2}作为一种象征。嗯,很奇怪,不知道为什么它在命令行中对你不起作用。