关于中国模式的斯坦福CoreNLP

时间:2015-09-05 08:48:32

标签: stanford-nlp

如何使用中文模型,我在类路径中下载“stanford-corenlp-3.5.2-models-chinese.jar”并复制

<dependency>
    <groupId>edu.stanford.nlp</groupId>
    <artifactId>stanford-corenlp</artifactId>
    <version>3.5.2</version>
    <classifier>models-chinese</classifier>
</dependency>

到pom.xml文件。另外,我的input.txt是

因出席中国大陆阅兵引发争议的国民党前主席连战今晚金婚宴,立法院长王金平说,已向连战恭喜,等一下回南部。 连战夫妇今晚的50周年金婚纪念宴,正值连战赴陆出席阅兵引发争议之际,社会关注会否受到影响。 包括国民党主席朱立伦,副主席郝龙斌等人已分别对外表示另有行程,无法出席。

然后我使用代码

编译程序
java -cp "*" -Xmx1g edu.stanford.nlp.pipeline.StanfordCoreNLP -props StanfordCoreNLP-chinese.properties -annotators segment,ssplit -file input.txt

,结果如下。但它会出现以下错误,我该如何解决这个问题?

C:\stanford-corenlp-full-2015-04-20>java -cp "*" -Xmx1g edu.stanford.nlp.pipelin
e.StanfordCoreNLP -props StanfordCoreNLP-chinese.properties -annotators segment,
 ssplit -file input.txt
Registering annotator segment with class edu.stanford.nlp.pipeline.ChineseSegmen
terAnnotator
Adding annotator segment
Loading Segmentation Model ... Loading classifier from edu/stanford/nlp/models/s
egmenter/chinese/ctb.gz ... Loading Chinese dictionaries from 1 file:
  edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz
Done. Unique words in ChineseDictionary is: 423200.
done [22.9 sec].

Ready to process: 1 files, skipped 0, total 1
Processing file C:\stanford-corenlp-full-2015-04-20\input.txt ... writing to C:\
stanford-corenlp-full-2015-04-20\input.txt.xml {
  Annotating file C:\stanford-corenlp-full-2015-04-20\input.txt Adding Segmentat
ion annotation ... INFO: TagAffixDetector: useChPos=false | useCTBChar2=true | u
sePKChar2=false
INFO: TagAffixDetector: building TagAffixDetector from edu/stanford/nlp/models/s
egmenter/chinese/dict/character_list and edu/stanford/nlp/models/segmenter/chine
se/dict/in.ctb
Loading character dictionary file from edu/stanford/nlp/models/segmenter/chinese
/dict/character_list
Loading affix dictionary from edu/stanford/nlp/models/segmenter/chinese/dict/in.
ctb
?]?X?u????j???\?L??o??????????e?D?u?s???????B?b?A??k?|???????????A?w?V?s?????A?
??@?U?^?n???C
?s?????????50?g?~???B?????b?A????s??u???X?u?\?L??o???????A???|???`?|?_????v?T?C
?]?A?????D?u?????B??D?u?q?s?y???H?w???O??~???t????{?A?L?k?X?u?C

--->
[?, ], ?, X, ?u????j???, \, ?L??o??????????e?D?u?s???????B?b?A??k?|???????????A?
w?V?s?????A???@?U?^?n???C, , , , ?s?????????, 50, ?, g?, ~, ???B?????b?A????s??u
???X?u?, \, ?L??o???????A???, |, ???, `, ?, |, ?_????v?T?C, , , , ?, ], ?, A????
?D?u???, ??, B??D?u?q, ?, s?y???H?w???O??, ~, ???t????, {, ?, A?L?k?X?u?C]

}
Processed 1 documents
Skipped 0 documents, error annotating 0 documents
Annotation pipeline timing information:
ChineseSegmenterAnnotator: 0.1 sec.
TOTAL: 0.1 sec. for 34 tokens at 485.7 tokens/sec.
Pipeline setup: 0.0 sec.
Total time for StanfordCoreNLP pipeline: 0.1 sec.

1 个答案:

答案 0 :(得分:4)

我编辑了您的问题,将命令更改为您实际用于生成显示输出的命令。看起来你找到了前一个命令:

java -cp "*" -Xmx1g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref -file input.txt input.xml

运行英语分析管道,这对中文文本来说效果不佳......

CoreNLP在v3.5.2中对中文的支持仍然有点粗糙,希望在下一个版本中更加顺畅。但是从这里你需要:

  • 为中文指定属性文件,并提供适当的模型。 (如果未指定属性文件,则CoreNLP默认为英语):-props StanfordCoreNLP-chinese.properties
  • 目前,中文的分词不是注释器tokenize,而是segment,在StanfordCoreNLP-chinese.properties中指定为自定义注释器。 (也许我们将在未来的版本中统一这两个......)
  • 当前dcoref注释器仅适用于英语。有中国的共识,但它没有完全融入管道。如果你想使用它,你当前必须编写一些代码,如here所述。所以,让我们删除它。 (再次,这应该在未来更好地集成)。
  • 此时,事情已经开始了,但是您显示的丑陋的stderr输出是默认情况下,分段器已打开VERBOSE,但您的输出字符编码不适合我们的中文输出。默认情况下我们应该关闭VERBOSE,但您可以使用以下命令将其关闭:-segment.verbose false
  • 我们没有中文引理词,所以也可以删除该注释器。
  • 此外,CoreNLP需要超过1GB的RAM。试试2GB。

此时,一切都应该好!使用命令:

java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP -props StanfordCoreNLP-chinese.properties -annotators segment,ssplit,pos,ner,parse -segment.verbose false -file input.txt

你得到input.txt.xml的输出。 (我不发布它,因为它长了几千行......)

更新CoreNLP v3.8.0:如果使用(2017年当前)CoreNLP v3.8.0,则会有一些变化/进展:(i)我们现在使用注释器{{1}对于所有语言而言,它并不需要为中文加载自定义注释器; (ii)默认情况下,详细关闭详细分段; (iii)[负面进展]要求tokenize之前的lemma注释器要求,即使它对中国人来说是无操作的; (iv)现在可以为中文提供共识,调用为ner,这需要先前的注释器提及,其统计模型需要相当大的记忆。把它们放在一起,你现在对这个命令很好:

coref