Stanford CoreNLP 3.9.0:如何加载prettyprint标注文件替代annotate方法?
解决Stanford CoreNLP 3.9.0加载已标注文件的问题
我之前也碰到过类似的困扰,在3.9.0版本里,确实没办法直接加载prettyprint输出的文件——因为那个格式是专门给人类阅读设计的,没有严格的机器可读结构,CoreNLP官方也没有提供对应的解析API。不过咱们可以换个思路,用CoreNLP原生支持的结构化序列化格式来保存和加载标注结果,下面是具体的实现方案:
一、先换用可序列化的格式保存标注结果
如果还能重新生成标注文件,建议放弃prettyprint,改用XMI或JSON格式保存,这两种格式CoreNLP都支持直接加载:
方案1:使用XMI格式(CoreNLP推荐的序列化格式)
保存标注结果:
// 假设你已经完成标注,得到了Annotation对象 ann XmiSerializer serializer = new XmiSerializer(); try (OutputStream os = new FileOutputStream("annotated_output.xmi")) { serializer.serialize(ann, os); } catch (IOException e) { e.printStackTrace(); }
加载已标注的XMI文件:
XmiSerializer serializer = new XmiSerializer(); Annotation loadedAnnotation; try (InputStream is = new FileInputStream("annotated_output.xmi")) { loadedAnnotation = serializer.deserialize(is); } catch (IOException e) { e.printStackTrace(); return; } // 现在loadedAnnotation就是完整的标注对象,无需再调用annotate方法
方案2:使用JSON格式
保存标注结果:
// 定义和标注时一致的Properties(确保标注器列表匹配) Properties props = new Properties(); props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner"); // 替换成你实际使用的标注器 props.setProperty("outputFormat", "json"); // 将Annotation对象序列化为JSON并写入文件 try (PrintWriter pw = new PrintWriter(new File("annotated_output.json"))) { pw.println(AnnotationJsonSerializer.toJson(ann, props)); } catch (FileNotFoundException e) { e.printStackTrace(); }
加载已标注的JSON文件:
Properties props = new Properties(); props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner"); // 和保存时一致的标注器列表 Annotation loadedAnnotation; try (BufferedReader br = new BufferedReader(new FileReader("annotated_output.json"))) { StringBuilder jsonContent = new StringBuilder(); String line; while ((line = br.readLine()) != null) { jsonContent.append(line); } loadedAnnotation = AnnotationJsonSerializer.fromJson(jsonContent.toString(), props); } catch (IOException e) { e.printStackTrace(); return; } // 加载完成,直接使用loadedAnnotation即可
二、如果已经有了prettyprint的文件怎么办?
很遗憾,3.9.0版本没有内置的解析器来处理prettyprint输出的文本——因为它的格式没有严格的机器可读规范,结构会随标注内容变化,手动解析不仅麻烦还容易出错。如果必须使用这份文件,只能自己编写正则表达式或文本解析逻辑来提取标注信息,但非常不推荐这种做法,建议还是重新用上面的序列化格式生成一次标注文件。
内容的提问来源于stack exchange,提问作者Gaëtan SCHMIDT
相关产品推荐
相关产品推荐

