有两个(好吧,三个。。。请参见下面的“更新3”,了解第三个)单独的事情:
1)您的代码返回两个树(两个ROOT),但您只希望得到一个。发生这种情况是因为raw_parse_sents需要一个句子列表,而不是一个句子,如果您给它一个字符串,它将解析字符串中的每个字符,就像它自己的句子一样,并返回一个一个字符树的列表。所以要么传递raw_parse_sents一个列表,要么使用raw_parse。在
2)您没有指定model_path,默认值为英语。中文有五个选项,但看起来这一个与在线解析器匹配:parser = stanford.StanfordParser(model_path='edu/stanford/nlp/models/lexparser/xinhuaFactored.ser.gz', path_to_jar='stanford-parser.jar',path_to_models_jar='stanford-parser-3.5.1-models.jar')
结合这两个更改,我可以匹配在线解析器(为了匹配您的输出格式,我还必须将返回的listiterator强制转换为列表):
^{pr2}$
更新1:
我意识到你可能也在寻找一种更像网站上的输出格式,在这种情况下,这是可行的:for tree in parser.raw_parse(s):
print tree # or print tree.pformat().encode('utf-8') to force an encoding
更新2:classify.decisiontree.DecisionTreeClassifier.pp → pretty_format
metrics.confusionmatrix.ConfusionMatrix.pp → pretty_format
sem.lfg.FStructure.pprint → pretty_format
sem.drt.DrtExpression.pretty → pretty_format
parse.chart.Chart.pp → pretty_format
Tree.pprint() → pformat
FreqDist.pprint → pformat
Tree.pretty_print → pprint
Tree.pprint_latex_qtree → pformat_latex_qtree
更新3:
我现在正在尝试匹配您评论中句子的输出,'你好,我心情不错今天,你呢?'。在
我在写这篇文章的时候广泛地提到了Stanford Parser FAQ,并建议你去看看(尤其是“你能不能给我一些帮助,帮助我开始分析中文?”)。我学到的是:
通常,在分析中文文本之前,您需要将中文文本“分段”成由空格分隔的单词(由一个或多个字符组成)。在线解析器执行此操作,您可以在网页上看到分段步骤和解析步骤的输出。对于我们的测试句,它显示的分段是'你好 , 我 心情 不错 今天 , 你 呢 ?'。在
如果我在本地通过xinhuaFactored模型运行这个分段字符串,那么我的输出与在线解析器完全匹配。在
所以我们需要先通过分词器来运行文本,然后再通过解析器运行它。FAQ推荐了Stanford分词器,这可能是在线解析器正在使用的:http://nlp.stanford.edu/software/segmenter.shtml。在
(正如FAQ所提到的,解析器还包含一个模型xinhuaFactoredSegmenting,它在解析调用中执行近似的分段。但是,它将此方法称为“合理的,但并不优秀”,并且输出的结果与我们的标准在线解析器不匹配。)