stanford parser 使用说明

preface: 最近忙着的项目想试着用斯坦福的parser,来解析句子生成句法分析树,然后分析子树,与treekernal结合起来,训练。stanford parser神器下载下来了,可使用却是蛋疼。一大堆说明,却没个方便快捷关于总的介绍。

一、必先利其器

stanford parser主页:http://nlp.stanford.edu/software/lex-parser.shtml

stanford parser下载:http://nlp.stanford.edu/software/lex-parser.shtml#Download

另外扩展工具:java、python等等随各自项目需要再说。

二、使用(stanford parser)

下载解压后,根据README.txt文件来,卤主是在ubuntu15.04系统下,java7,不够,根据上一篇博客四行代码安装java8:

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ java -version

准备好了java8后,才可继续在ubuntu下编译使用stanford parser. 根据说明,运行lexparser.sh文件,加入文件名参数,运行即可。testsent.txt包含5句英文。

On a Unix system you should be able to parse the English test file with the
following command:	

    ./lexparser.sh data/testsent.txt

This uses the PCFG parser, which is quick to load and run, and quite accurate.

[Notes: it takes a few seconds to load the parser data before parsing
begins; continued parsing is quicker. To use the lexicalized parser, replace
englishPCFG.ser.gz with englishFactored.ser.gz in the lexparser.sh script
and use the flag -mx600m to give more memory to java.]

在包含lexparser.sh文件夹里终端运行 ./lexparser.sh data/tentsent.txt 得到结果如下(部分):

Loading parser from serialized file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ...  done [0.5 sec].
Parsing file: data/testsent.txt
Parsing [sent. 1 len. 21]: Scores of properties are under extreme fire threat as a huge blaze continues to advance through Sydney 's north-western suburbs .
(ROOT
  (S
    (NP
      (NP (NNS Scores))
      (PP (IN of)
        (NP (NNS properties))))
    (VP (VBP are)
      (PP (IN under)
        (NP (JJ extreme) (NN fire) (NN threat)))
      (SBAR (IN as)
        (S
          (NP (DT a) (JJ huge) (NN blaze))
          (VP (VBZ continues)
            (S
              (VP (TO to)
                (VP (VB advance)
                  (PP (IN through)
                    (NP
                      (NP (NNP Sydney) (POS 's))
                      (JJ north-western) (NNS suburbs))))))))))
    (. .)))

nsubj(threat-8, Scores-1)
case(properties-3, of-2)
nmod:of(Scores-1, properties-3)
cop(threat-8, are-4)
case(threat-8, under-5)
amod(threat-8, extreme-6)
compound(threat-8, fire-7)
root(ROOT-0, threat-8)
mark(continues-13, as-9)
det(blaze-12, a-10)
amod(blaze-12, huge-11)
nsubj(continues-13, blaze-12)
nsubj(advance-15, blaze-12)
advcl(threat-8, continues-13)
mark(advance-15, to-14)
xcomp(continues-13, advance-15)
case(suburbs-20, through-16)
nmod:poss(suburbs-20, Sydney-17)
case(Sydney-17, 's-18)
amod(suburbs-20, north-western-19)
nmod:through(advance-15, suburbs-20)

可以看出,stanford parser将英文很好的解析,而且有两种解析方式。换其他英文数据,也能很好的解析。骚年,你以为到这里就结束了么,too young too simple.

卤主弄的是中文啊。同样的方式,改了下lexparser.sh文件里面的“edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz”变成:“edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz”,数据改了中文的。以为也能解析,可是特么慢啊,慢啊,慢啊。而且无论怎么弄,它都解析为一个句子,是因为没分词,没分词,也可能是参数没有调好。找了其他博客也没找到合适的。

待续。。。

三、使用2(nltk+stanford-parser.jar)

同仁看到我忙着stanford parser,说到NLTK里面就有这个,瞬间就演示了下怎么在nltk里面用,我了个XX啊,神器在身边可是不会用啊,不知道nltk神器有这功能。不过只有列表形式的结果:

In [8]: from nltk.parse import stanford

In [9]: stanford.StanfordParser?
Type:            type
String form:     <class 'nltk.parse.stanford.StanfordParser'>
File:            /home/shifeng/anaconda/lib/python2.7/site-packages/nltk/parse/stanford.py
Init definition: stanford.StanfordParser(self, path_to_jar=None, path_to_models_jar=None, model_path=u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz', encoding=u'UTF-8', verbose=False, java_options=u'-mx1000m')
Docstring:
Interface to the Stanford Parser

>>> parser=StanfordParser(
...     model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz"
... )
>>> parser.raw_parse_sents((
...     "the quick brown fox jumps over the lazy dog",
...     "the quick grey wolf jumps over the lazy fox"
... ))
[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']),
Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']),
Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])]), Tree('ROOT', [Tree('NP',
[Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['grey']), Tree('NN', ['wolf'])]), Tree('NP',
[Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']),
Tree('JJ', ['lazy']), Tree('NN', ['fox'])])])])])])]

我特么也这么干,不行啊不行啊。同仁说是没有下载jar包,打算通过nltk.download下载,结果没下好,在身边看得一愣一愣的我说已经在网上下好了。通过网上的博客介绍,nltk结合stanford-parser.jar解析句子:

In [12]: import os

In [13]: os.environ["STANFORD_PARSER"] = "stanford-parser.jar"
In [14]: os.environ["STANFORD_MODELS"] = "stanford-parser-3.5.2-models.jar"
In [15]: parser = stanford.StanfordParser(model_path=u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz')

In [16]: sentences = parser.raw_parse_sents(("the quick brown fox jumps over the lazy dog","the quick grey wolf jumps over the lazy fox"))

In [17]: sentences
Out[17]:
[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']), Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])]),
 Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['grey']), Tree('NN', ['wolf'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['fox'])])])])])])]

In [18]: sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))

In [19]: sentences
Out[19]:
[Tree('ROOT', [Tree('S', [Tree('INTJ', [Tree('UH', ['Hello'])]), Tree(',', [',']), Tree('NP', [Tree('PRP$', ['My']), Tree('NN', ['name'])]), Tree('VP', [Tree('VBZ', ['is']), Tree('ADJP', [Tree('JJ', ['Melroy'])])]), Tree('.', ['.'])])]),
 Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('PRP$', ['your']), Tree('NN', ['name'])])]), Tree('.', ['?'])])])]

四、使用3(eclipse+java)

本不太想用java,不太想在ubuntu中用eclipse,但看到师兄用eclipse把句法分析了,便想着试试。可行,只是只有树结构,可能初始化的对象是树,另外数组型式也应该是互通。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import edu.stanford.nlp.ling.Word;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.trees.Tree;

public class Parser {

	public static void main(String[] args) throws IOException {
//		String grammar = "edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz";
		String grammar = "edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz";
	    String[] options = {};
	    LexicalizedParser lp = LexicalizedParser.loadModel(grammar, options);
	    String line = "我 的 名字 叫 小明 ?";
	    Tree parse = lp.parse(line);
	    parse.pennPrint();
        String[] arg2 = {"-encoding", "utf-8",
                "-outputFormat", "penn,typedDependenciesCollapsed",
                "edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz",
                "/home/shifeng/shifengworld/study/tool/stanford_parser/stanford-parser-full-2015-04-20/data/chinese-onesent-utf8.txt"};
        LexicalizedParser.main(arg2);
	}
}

运行结果:

Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
Loading parser from serialized file edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz ...  done [0.8 sec].
(ROOT
Loading parser from serialized file edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz ...   (IP
    (NP
      (DNP
        (NP (PN 我))
        (DEG 的))
      (NP (NN 名字)))
    (VP (VV 叫)
      (NP (NN 小明)))
    (PU ?)))
 done [4.1 sec].
Parsing file: /home/shifeng/shifengworld/study/tool/stanford_parser/stanford-parser-full-2015-04-20/data/chinese-onesent-utf8.txt
Parsing [sent. 1 len. 8]: 俄国 希望 伊朗 没有 制造 核武器 计划 。
(ROOT
  (IP
    (NP (NR 俄国))
    (VP (VV 希望)
      (IP
        (NP (NR 伊朗))
        (VP
          (ADVP (AD 没有))
          (VP (VV 制造)
            (NP (NN 核武器) (NN 计划))))))
    (PU 。)))

nsubj(希望-2, 俄国-1)
root(ROOT-0, 希望-2)
nsubj(制造-5, 伊朗-3)
neg(制造-5, 没有-4)
ccomp(希望-2, 制造-5)
nn(计划-7, 核武器-6)
dobj(制造-5, 计划-7)

Parsed file: /home/shifeng/shifengworld/study/tool/stanford_parser/stanford-parser-full-2015-04-20/data/chinese-onesent-utf8.txt [1 sentences].
Parsed 8 words in 1 sentences (30.42 wds/sec; 3.80 sents/sec).

java始终不是卤主擅长的,还是继续寻找其他的路。。。

五、经验之谈

多查资料。英文的也强看下去。

参考:

1. stackoverflow:http://stackoverflow.com/questions/13883277/stanford-parser-and-nltk

2. nltk官网:http://www.nltk.org/api/nltk.parse.html

3. nltk官网:http://www.nltk.org/_modules/nltk/parse/stanford.html

4. stanford parser官网:http://nlp.stanford.edu/software/parser-faq.shtml

5. stanford parser下载:http://nlp.stanford.edu/software/lex-parser.shtml#Download

6. 博友博客:http://blog.sina.com.cn/s/blog_8e037f440101eg93.html

7. 博友博客:http://www.cnblogs.com/stGeekpower/p/3457746.html

8. 百度文库:http://wenku.baidu.com/link?url=KZDYgJDnme7yIDOCoPpNClV1Z95yiyf5n2YiT4BD-6eNTVcPM8sPTYmx5qxajsX6snGTgpaHUcsB0oI2W2jQOAC2nwdzUkdVkmwnEHQp0jG

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-25 10:57:26

stanford parser 使用说明的相关文章

Stanford Parser 详细使用

http://blog.csdn.net/pipisorry/article/details/42976457 stanford-parser的使用 1.到斯坦福官方网站http://nlp.stanford.edu/software/lex-parser.shtml下载软件包,解压. 2.在eclipse中新建一个java project,把解压得到根目录下的stanford-parser.jar和stanford-parser-3.*.*-models.jar两个包导入项目到项目引用包中,

同时使用Twitter nlp 和stanford parser的解决方法

因为Twitter nlp中使用了较老版本的stanford parser,导致不能同时使用 解决方法是使用未集成其它jar包的Twitter nlp,关于这点Stanford FAQ中也有说明(在FAQ17),并且还给出了twitter nlp中都用了哪些jar包 大部分的jar包都可以下载到 但有些因为版本原因也不能使用像twitter-text 因此,在这里我整理了一下,供大家下载.

使用Berkeley Parser进行句法分析

一.句法分析 1.定义 句法分析判断输入的单词序列(一般为句子)的构成是否合乎给定的语法,并通过构造句法树来确定句子的结构以及各层次句法成分之间的关系,即确定一个句子中的哪些词构成一个短语,哪些词是动词的主语或宾语等问题. 2.主流技术 基于统计的方法是现阶段句法分析的主流技术.常见的概率句法分析模型包括概率上下文无关模型.基于历史的句法分析模型.层次化渐进式的句法分析模型和中心词驱动的句法分析模型.综合多种模型而实现的句法分析器种类繁多,目前在开源中文句法分析器中比较具有代表性有Stanfor

Standford Parser学习入门(1)-Eclipse中配置

Stanford Parser是斯坦福大学研发的用于语法分析的工具,属于stanford nlp系列工具之一.本文主要介绍Standfor Parser的入门用法. 在Stanford官方网站下载最新安装包(目前是3.6.0),点击 下载,下载最新的model stanford-english-corenlp-2016-01-10-models.jar 解压下载后的zip包 stanford-parser-full-2015-12-09.zip,里面会有数据,依赖包以及demo,还有相关的sou

Standford Parser学习入门(3)-标记

以下是Stanford parser中的标记中文释义供参考. probabilistic context-free grammar(PCFG) ROOT:要处理文本的语句 IP:简单从句 NP:名词短语 VP:动词短语 PU:断句符,通常是句号.问号.感叹号等标点符号 LCP:方位词短语 PP:介词短语 CP:由‘的’构成的表示修饰性关系的短语 DNP:由‘的’构成的表示所属关系的短语 ADVP:副词短语 ADJP:形容词短语 DP:限定词短语 QP:量词短语 NN:常用名词 NR:固有名词 N

Standford Parser学习入门(2)-命令行运行

在Stanford parser目录中已经定义了一部分命令行工具以及图形界面,本文将介绍如何在windows使用这些工具进行语法分析,Linux下也有shell可以使用. 关于如何搭建环境请参考上一篇文章:Standford Parser学习入门(1)-Eclipse中配置 在解压目录中,打开命令窗口,运行lexparser.bat,会得到如下结果,即为命令行方式运行结果. 运行 lexparser-gui.bat,可弹出图形界面如下图,先点击Load Parser选择model文件(本例中用s

stanford-parser使用说明

主意:本说明文档针对stanford-parser-full-2014-06-16.不同版本的parser,其功能和表示形式可能会略有不同.但总体不会有太大差异 Stanford parser是一款较为强大的句法解析工具,他的最初版本是java编写的,所以JDK是必须的,这玩意怎么弄就不用我说了吧.Stanford parser支持多国语言,并且还在不断扩张中.幸运的是,由于天朝的强大,中文也早早地加入其中,下面是树状图效果展示: 数据图是较为直观的效果展示,当然,他还有其他展示方式: Onel

国内可外用免费语料库下载资源汇总, 语言翻译必备:国内外23个语料库推荐

国内可外用免费语料库下载资源汇总 (一) 国家语委1.国家语委现代汉语语料库http://www.cncorpus.org/现代汉语通用平衡语料库现在重新开放网络查询了.重开后的在线检索速度更快,功能更强,同时提供检索结果下载.现代汉语语料库在线提供免费检索的语料约2000万字,为分词和词性标注语料. 2.古代汉语语料库http://www.cncorpus.org/login.aspx网站现在还增加了一亿字的古代汉语生语料,研究古代汉语的也可以去查询和下载.同时,还提供了分词.词性标注软件.词

从n-gram中文文本纠错到中文语法纠错以及同义词聚类

前记 本文简单地讲解如何使用n-gram模型结合汉字拼音来作中文错别字纠错,然后介绍最短编辑距离在中文搜索纠错方面的应用:最后从依赖树入手讲解如何作文本长距离纠错(语法纠错),并从该方法中得到一种启示,利用依赖树的特点结合ESA算法来做同义词的聚类. n-gram模型 在中文错别字查错情景中,我们判断一个句子是否合法可以通过计算它的概率来得到,假设一个句子S = {w1, w2, ..., wn},则问题可以转换成如下形式: P(S)被称为语言模型,即用来计算一个句子合法概率的模型. 但是使用上