二叉parsing树
2016-06-16 12:58
387 查看
本文旨在介绍对文本进行成分句法分析, 得到适合递归神经网络的二叉句法树的过程.这是我第一篇论文的baseline中的一个模型,对如何得到二叉句法树纠结了好久,好吧,自己效率有点低.
首先,在网上搜了搜,知道做parsing可以用nltk自带的几种工具,如递归下降句法器,移动归约句法器,chart句法器等.但是需要自己定义上下文无关的文法,自己尝试了定义,但是数据集中的一些句子并不适用,即找不到符合自定义文法的句法树.自己笨的要手工标注,但明显不现实,几乎要放弃这个baseline了.所以总结经验教训:千万不要尝试手工标注,要么用程序解决,要么放弃.
另外一种经常用的就是stanford parser.由于斯坦福nlp团队是用java开发的parser,我目前用的都是python,所以搜索了如何在python中使用stanford parser 的办法.可以用nltk这个第三方工具.nltk也是斯坦福大学出来的,但是不知道和CoreNLP有什么联系.
确保安装了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
这种方法得到的树并不是二叉树,对当前递归神经网络实验(需要二叉树)没有帮助.
在ubuntu下进行同样的操作,出现错误,无法找到指定的模型,暂未解决.
在知乎上向老师们询问,得到一个回答,为了提高准确率和速度,一般情况下,成分句法分析器都会提供句法树的二叉形式binarization,并给了一个应用coreNLP的例子tree
LSTM.虽然例子没有细看,但是知道其中有用到TreeBinarize类,指明了方向,分析器里面肯定有函数或者类能实现二叉化.顺着这个思路,,在googl上寻找相似问题,找到一个非常不错的解决办法[how to parse sentence that is multilingual].
首先从github上下载CoreNLP-master,在readme文件中有这么一段命令:
这样在CoreNLP文件夹下会得到stanford-corenlp.jar 包。也可以直接下载已经建好的包stanford-corenlp-2017-04-14-build.jar。无论怎么得到这个包的,都需要将此jar包添加到系统环境变量CLASSPATH中。
将 CoreNLP/lib和CoreNLP/liblocal也添加到CLASSPATH中。
下载corenlp-models, english-models和 english-models-kbp,同样添加到CLASSPATH变量中。
然后就可以使用下面的命令运行ParseAndSetLabels:
其中output.txt是空的文件,用于保存结果;sentence.txt中包含你希望进行处理的句子;需要注意即使不需要label文件,也要在参数中包含,只需要将文件设置为空.
至此就得到想要的二叉树了!
得到的结果:
首先,在网上搜了搜,知道做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-models和 english-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$'))]
相关文章推荐
- js版本问题
- 用vbscript实现ArcMap中的上下标标注功能
- 转:利用JAXB进行xml和javabean之间转换
- Java乱码问题,解决Java乱码
- 15 电气 齐振昊 VB中制作鞍点(老师讲解)K=m+1
- 软件架构的两大流派:组成派、决策派
- 一步步编写SqlHelper类(C#)
- 【Android学习之】深入理解JNI
- 最优化求导常用公式技巧
- 美团Android DEX自动拆包及动态加载简介
- clip:rect()
- 在职场中混,"讲演稿"的重要性
- Linux下安装启动多个Tomcat的配置
- 关于开通博客的一些感想
- 工作实用
- Activity的总结
- mingw编译x264 出错undefined reference to `__sync_add_and_fetch_4
- HDU 3488 最小费用流
- android 国内工具站
- android中如何使用隐藏的api和internal包