您的位置:首页 > 其它

二叉parsing树

2016-06-16 12:58 387 查看
本文旨在介绍对文本进行成分句法分析, 得到适合递归神经网络的二叉句法树的过程.这是我第一篇论文的baseline中的一个模型,对如何得到二叉句法树纠结了好久,好吧,自己效率有点低.

首先,在网上搜了搜,知道做parsing可以用nltk自带的几种工具,如递归下降句法器,移动归约句法器,chart句法器等.但是需要自己定义上下文无关的文法,自己尝试了定义,但是数据集中的一些句子并不适用,即找不到符合自定义文法的句法树.自己笨的要手工标注,但明显不现实,几乎要放弃这个baseline了.所以总结经验教训:千万不要尝试手工标注,要么用程序解决,要么放弃.

另外一种经常用的就是stanford parser.由于斯坦福nlp团队是用java开发的parser,我目前用的都是python,所以搜索了如何在python中使用stanford parser 的办法.可以用nltk这个第三方工具.nltk也是斯坦福大学出来的,但是不知道和CoreNLP有什么联系.

1 通过nltk,使得在python中可以使用stanford parser

现在就一步步介绍怎么用nltk在python中使用stanfor parser!

确保安装了JDK8或者JRE1.8及以上版本。

首先从http://nlp.stanford.edu/software/lex-parser.shtml#Download下载stanford parser version 3.6.0,

将stanford-parser.jar和stanford-parser-3.6.0-models.jar解压到指定位置,思聪本上是C:\Users\wy\jars

将stanford-parser-3.6.0-models.jar中的\edu\stanford\nlp\models\lexparser\中的englishPCFG.er.gz解压到指定位置,这里是C:\Users\wy\jars\englishPCFG

import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER'] = '/path/to/standford/jars/stanford-parser.jar'
os.environ['STANFORD_MODELS'] = '/path/to/standford/jars/stanford-parser-3.6.0-models.jar'

parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
//sentences = parser.parse_sents("Hello, My name is Melroy.".split(), "What is your name?".split())

print sentences
for line in sentences:
for sentence in line:
sentence.draw()


这种方法得到的树并不是二叉树,对当前递归神经网络实验(需要二叉树)没有帮助.

在ubuntu下进行同样的操作,出现错误,无法找到指定的模型,暂未解决.

2 使用coreNLP得到成分句法树的二叉形式

OK!现在要想方设法得到二叉句法树结构…

在知乎上向老师们询问,得到一个回答,为了提高准确率和速度,一般情况下,成分句法分析器都会提供句法树的二叉形式binarization,并给了一个应用coreNLP的例子tree

LSTM.虽然例子没有细看,但是知道其中有用到TreeBinarize类,指明了方向,分析器里面肯定有函数或者类能实现二叉化.顺着这个思路,,在googl上寻找相似问题,找到一个非常不错的解决办法[how to parse sentence that is multilingual].

首先从github上下载CoreNLP-master,在readme文件中有这么一段命令:

#### How To Compile (with ant)

1. cd CoreNLP ; ant

#### How To Create A Jar

1. compile the code
2. cd CoreNLP/classes ; jar -cf ../stanford-corenlp.jar edu


这样在CoreNLP文件夹下会得到stanford-corenlp.jar 包。也可以直接下载已经建好的包stanford-corenlp-2017-04-14-build.jar。无论怎么得到这个包的,都需要将此jar包添加到系统环境变量CLASSPATH中。

将 CoreNLP/lib和CoreNLP/liblocal也添加到CLASSPATH中。

下载corenlp-models, english-modelsenglish-models-kbp,同样添加到CLASSPATH变量中。

然后就可以使用下面的命令运行ParseAndSetLabels:

java edu.stanford.nlp.parser.tools.ParseAndSetLabels -output output.txt -sentences sentence.txt -labels label.txt -parser edu/stanford/nlp/models/srparser/englishSR.ser.gz -binarize


其中output.txt是空的文件,用于保存结果;sentence.txt中包含你希望进行处理的句子;需要注意即使不需要label文件,也要在参数中包含,只需要将文件设置为空.

至此就得到想要的二叉树了!

3 使用stanford parser得到依存句法树

依存句法树不需要是二叉树结构,考虑通过nltk调用stanford parser。

from nltk.parse.stanford import StanfordDependencyParser
path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar)

result = dependency_parser.raw_parse('I shot an elephant in my sleep')
dep = result.next()
list(dep.triples())


得到的结果:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),

((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),

((u'elephant', u'NN'), u'det', (u'an', u'DT')),

((u'shot', u'VBD'), u'prep', (u'in', u'IN')),

((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),

((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: