Stanford Parser常见问题

来源:互联网 发布:淘宝手机端套餐链接 编辑:程序博客网 时间:2024/05/20 03:47

翻译,原文来自于:http://nlp.stanford.edu/software/parser-faq.shtml
1.parser模型在哪?
2.哪里有parser的技术文档?
3.如何使用API?
4.在parser中,什么是词性标记,短语类别,类型依赖?
5.我如何训练parser?
6.我如何训练RNN parser?
7.在训练我自己的parser模型之后,为什么会报异常“null head found for tree”?
8.如何使得parser去使用我的句子定界?
9.parser可以作为一个过滤器(从stdin读取并解析到stdout)么?
10.我怎样为parser提供正确的句子标注?
11.我能够给parser输入词性标签,并且强行使parser去使用这些标签?
12.选择的parser还有哪些其他限制?
13.可否预先标注语料库的短语边界和标签(解析器用)?
14.对于一个输入句子,我能够获得多个解析树吗?
15.对于我的语句,我不[理解/喜欢/赞同]得到的解析树。你能够说明或者修正它么?
16.为什么parser接受不正确的/不合语法的句子?
17.去解析长句子,我需要多少内存?
18.“UnsupportedClassVersionError”意味着什么?
19.在一个句子中,我怎么去获得每个单词的词性标注后的结果?
20.从其他parser产生的树,我如何得到你的类型依赖(语法关系)?
21.当没有动词时候,某物 如何 是另一物的主题?
22.我可以将你的tokenizers用于其他目的么?
23.我如何更快解析大文本?
24.你能够给我一些帮助去开始解析中文么?
25.你能够给我一些帮助去开始解析阿拉伯语么?
26.我能够用parser作为一个普通的PCFG parser么?
27.其他版本的弱模型呢?
28.你能够给我完整的文档:命令行选项,API,包括的语法,解析示例…?
29.使用-outputFormat and -outputFormatOptions选项,我能够得到什么样的输出格式?
30.我可以让分析器运行为过滤器(也就是分析输入的东西)吗?
31.你能够解释不同的parser么?PCFG parser怎样产生typed dependency parses?为什么我用getBestDependencyParse()方法,却得到null或者一个untyped dependency parse呢?
32.对于不同的parser模型,训练集是什么?
33.我怎样去调整词语标记,例如关闭美国化的拼写。
34.Can I use the parser with Jython?
35.parser使用什么样的字符集编码?
36.解析tweets,有没有推荐的模型?有没有caseless parsing model?
37.怎样从tree中得到语义图?
38.为什么parser的输出是不同于CoreNLP的输出?
39.我怎样得到original Stanford Dependencies 而不是 Universal Dependencies?
40.对于你的PCFG模型,我怎么找到PCFG语法?
41.我如何在我的依赖输出中找到丢失的标点符号?

1.parser模型在哪?

在最近的发布中,模型被包含在jar文件中。例如,在2012-11-12的发布中,模型被包含在stanford-parser-2.0.4-models.jar中。最简单的方式去访问这些模型,是将这个文件放到java的classpath中。解析器将能够督导jar文件中的模型。
再用2014年1月的3.3.1版本作为例子,不要在classpath中这样用-cp stanford-parser-3.3.1.jar
而是这样,对于Windows环境-cp stanford-parser-3.3.1.jar;stanford-parser-3.3.1-models.jar,对于unix/linux,-cp stanford-parser-3.3.1.jar:stanford-parser-3.3.1-models.jar
为了精确地判断哪个模型是可用的,你可以这样用

jar tvf stanford-parser-3.3.1-models.jar 

这将显示您使用的Arabic Factored model,例如,你也可以使用路径

edu/stanford/nlp/models/lexparser/arabicFactored.ser.gz

如果您遇到一个FileNotFoundException或者类似错误,当加载模型时候,首先去检查classpath是否是像这里描述的那样设定的。

2.哪里有parser的技术文档?

这里有相当大的javadoc 文档,位于发布文件的javadoc目录中。你应该先看的parser.lexparser包和LexicalizedParser类的Javadoc。
(出现在nlp.stanford.edu网站中的文档,对应于在发中的代码,不一定与发行版的parser一致。)如果你对解析器的工作原理和算法感兴趣,请看研究论文。

3.如何使用API?

z在下载文件中,包含了一个简洁的demo,它展示了如何去加载工具和开始处理文本。当使用此demo程序时候,请确定在classpath中包含了恰当的jar文件。

4.在parser中,什么是词性标记,短语类别,类型依赖?

对于词性标记和短语类别,这个依赖于训练parser时的语言和树库(treebank)(并且这些由树库生产者决定,而不是我们决定)。parser能够用于英文,中文,阿拉伯语或者德语等其它语言。对于部分的语句或者短语类别,这里有相关的链接。
英语:the Penn Treebank site
这里有一个这里写链接内容这里有文档的在线副本;特别的,看 TAGGUID1.PDF (POS tagging guide) and PRSGUID1.PDF (phrase structure bracketing guide) and a (slightly dated) introductory article. 你可以发现它更方便去使用其他更简单的列表如AMALGAM项目网页或者这个网页在MIT上。
Chinese: the Penn Chinese Treebank
German: the NEGRA corpus
French: the French Treebank
请阅读这些语料库的文档去了解他们的标签集和短语范畴。你能够通过网络搜索发现这些额外的文档资源。
我们定义或参与定义类型的可用于英语和中文依赖关系(语法关系)输出。对于英语,默认情况下,解析器现在生成 Universal Dependencies,其在该页面上广泛记录。您也可以使用它生成先前的Stanford Dependencies表示。 为此,对于Chinese dependencies,您可以在Stanford Dependencies页面上找到文档的链接。
更多信息(几乎所有语法关系的定义和示例)都包含在Javadoc文档中。 看看EnglishGrammaticalRelations和ChineseGrammaticalRelations类。

5.我如何训练parser?

对的,你可以训练自己的parser。您将需要一组语法注释的数据,如Penn Treebank来训练解析器。如果它们不是与当前支持的Treebanks格式相同,您可能需要编写类来读tree结构等。阅读LexicalizedParser类main方法的javadoc文档,特别是-train选项,去了解训练parsers的命令选项。提供的文件makeSerialized.csh显示了我们用来训练的(发布版本中包含的)解析器的选项。 如果你想训练一个新的语言和/或treebank格式分析器,你可以(而且人们已经这样做了),但你需要花一段时间学习有关的代码,特别是如果你希望开发特定语言的功能。首先尝试在数据上训练一个简单的PCFG,然后查看TreebankLangParserParams类如何进行特定于语言的处理。

6.我如何训练RNN parser?

训练RNN parser需要两步。第一步,因为RNN parser使用了一个更简单的PCEG parser解析来训练,在训练RNN parser之前,预先缓存解析器的结果是有用的。这个能够由包含的工具CacheParseHypotheses来完成,它能够将treebank转换为已经解析的树的压缩文件。
对于这个操作的一个示例命令行,附带一些最有用的标志,是

java -mx4g edu.stanford.nlp.parser.dvparser.CacheParseHypotheses -model /path/to/pcfg/pcfg.ser.gz -treebank /path/to/wsj 200-2199 -output cached.wsj.ser.gz -numThreads 6

然后必须去运行DVParser模块去创建一个新的序列化模块。一个命令行示例如下:

java -mx12g edu.stanford.nlp.parser.dvparser.DVParser -cachedTrees /path/to/cached.wsj.ser.gz -train -testTreebank /path/to/wsj 2200-2219 -debugOutputFrequency 500 -trainingThreads 8 -parser /path/to/pcfg/pcfg.ser.gz -dvIterations 40 -dvBatchSize 25 -wordVectorFile /path/to/embedding -model /scr/nlp/data/dvparser/wsj/train/averaged/averaged.ser.gz

想要获取各种选项的说明,直接不带任何选项去运行java edu.stanford.nlp.parser.dvparser.DVParser
对于解析器的内存要求,不是很高,但是-trainingThreads加入更多的线程,那么训练时候就需要更多的内存。
当模型是正在训练时候,每隔20分钟(默认值)将输出一个中间模型。这些中间模型将会在 -testTreebank 指定的dev set上有模型评分。当模型训练完成,或者当你想去测试这些中间模型中的任意一个模型时候,你能够使用stanford LexicalizedParser 命令运行它。
在我们的实验中,我们发现simpler PCEG模型实际上产生更好的底层PCFG模型。 我们用于英语和中文的PCFG模型的命令行可以在makeSerialized.csh中找到。

7.在训练我自己的parser模型之后,为什么会报异常“null head found for tree”?

默认的HeadFinder是专门为PTB编写的。 如果你在使用不同的产品集的树上训练一个解析器,那么默认的HeadFinder将不会知道如何处理这个并且将抛出这个异常。 解决这个问题最简单的方法是使用LeftHeadFinder。 您也可以通过为您的treebank自定义HeadFinder并使用它来获得轻微的性能提升。

8.如何强制解析器使用我的句子分界? 我想给解析器一个句子的列表,每行一个,来解析。

使用-sentences选项。如果你给parser每行一个句子,如果您想给解析器每行一个句子,请在调用LexicalizedParser中包含选项-sentences newline。

9.parser可以作为一个过滤器(从stdin读取并解析到stdout)么?

是。 解析器将文件视为从stdin读取一样的,默认情况下写入stdout(可以使用-writeOutputFiles选项更改)。 注意:tokenizer使用lookahead,所以你需要关闭输入以获取最后一个句子的解析,或者使用另一个选项,如-sentences newline。

10.我怎样为parser提供正确的句子标注?

从命令行,如果你给选项-tokenized,那么解析器将假设空白分隔的标记,并使用你的标记化。 当然,解析将受到损害,除非你的标记准确匹配基础树库的标记化,例如Penn Treebank标记化。 常见的情况是,您的文本已经正确标记,但没有采用像Penn Treebank的转义字符的方式,(将括号转换为 -LRB 和 -RRB- ,并在斜线和星号的前面放反斜杠——可能是一个保持 Lisp)。
在这种情况下,您可以使用-tokenized选项,也可以添加标志:

-escaper edu.stanford.nlp.process.PTBEscapingProcessor

如果在你自己的程序中调用解析器,主要的解析方法需要一个单词列表,这些单词在调用解析器之前应该已经被正确地分词和转义。 你不需要,也不能给-tokenized选项。 如果您有未分词文本,则需要在解析之前进行分词。 您可以使用带有String参数的parse方法为您完成此操作,或者您可以使用处理包中的类(如DocumentPreprocessor和PTBTokenizer)进行标记化,就像解析器的主要方法一样。 或者你可能想使用自己的分词器。

11.我能够给parser输入词性标签,并且强行使parser去使用这些标签?

是的你可以。 但是,为了获得良好的结果,您应该确保提供正确的分词输入,并使用正确的标签名称。 (也就是说,输入必须完全按照语法所在的树库中的材料进行标记化和规范化。)
阅读LexicalizedParser类中主要方法的javadoc。相关选项是 -sentences (see above), -tokenized, -tokenizerFactory, -tokenizerMethod, 和 -tagSeparator. 如果,例如,你想去定义一个词性标签,在一个单词后添加/POS,你将在你的LexicalizedParser调用中包含选项 -tokenized -tagSeparator / -tokenizerFactory edu.stanford.nlp.process.WhitespaceTokenizer -tokenizerMethod newCoreLabelTokenizerFactory.你应该给parser像下面这样的输入:

The/DT quick/JJ brown/JJ fox/NN jumped/VBD over/IN the/DT lazy/JJ dog/NN ./.

使用这样的命令

java -mx1g -cp "*" edu.stanford.nlp.parser.lexparser.LexicalizedParser -sentences newline -tokenized -tagSeparator / -tokenizerFactory edu.stanford.nlp.process.WhitespaceTokenizer -tokenizerMethod newCoreLabelTokenizerFactory edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz fox.txt

部分标记的输入(仅仅表示一些单词的标记)也是可以的。
如果你希望以编程方式处理带有POS标记的文本,那么事情就不同了。 你传递给parse方法一个List。 如果此列表中的项实现HasTag,例如类型为TaggedWord或CoreLabel,并且标记值不为null,则解析器将使用您提供的标记。 您可以使用DocumentPreprocessor类(如主方法)来生成这些列表,也可以使用WhitespaceTokenizer,后跟WordToTaggedWordProcessor。 另一个选择是通过斯坦福POS标记器来提供句子,根据输入产生List 或List 。 任何形式的列表都会将标签传递给解析器。 或者你可以用你写的代码。 这里有一个例子,手工地产生List:

// set up grammar and options as appropriateLexicalizedParser lp = LexicalizedParser.loadModel(grammar, options);String[] sent3 = { "It", "can", "can", "it", "." };// Parser gets tag of second "can" wrong without help                    String[] tag3 = { "PRP", "MD", "VB", "PRP", "." };                             List sentence3 = new ArrayList();for (int i = 0; i < sent3.length; i++) {  sentence3.add(new TaggedWord(sent3[i], tag3[i]));}Tree parse = lp.parse(sentence3);parse.pennPrint();
12.选择的parser还有哪些其他限制?

还有其他可以添加的约束,但是它们必须以编程方式添加。 看看LexicalizedParserQuery对象,你可以从LexicalizedParser.parseQuery()获取。 有一个调用,setConstraints,你可以在使用LexicalizedParserQuery之前运行解析器。
如果你添加一个parserconstraint对象生成一组单词,语法分析器只会产生语法树包括跨词作为构成。通常,您将使用“*”作为该约束所接受的状态。
也可以指定约束,例如“NN | JJ”,以强制解析器使用NN或JJ,但不幸的是,在强制执行的代码中存在一个微妙和复杂的错误。 如果你尝试使用这个,大多数解析器使用vertical Markovization,这意味着你需要制定约束“JJ | JJ [^ a-zA-Z]。”而不是“JJ”。 一般来说,你不应该使用这部分功能,只需使用“。”。

有关此方面的更多信息,请参阅现有Javadoc。

13.可否预先标注语料库的短语边界和标签(解析器用)?

现在还不行,但是在未来很可能可以。

24.你能够给我一些帮助去开始解析中文么?

这些指令专注于从命令行解析,因为您需要使用它来设置大多数选项。 但是你也可以在GUI环境中在中文上使用解析器。解析器提供5个中文语法(并且,使用合适的训练数据,您可以训练其他版本)。 您可以在提供的stanford-parser-YYYY-MM-DD-models.jar文件中找到它们(在GUI中,选择此文件,然后在其中导航;在命令行中,使用jar -tf查看其内容)。 所有这些语法都是根据Penn Chinese Treebank的数据进行训练的,你应该查阅他们的网站,了解他们使用的中文的句法表示的细节。 他们是:

PCFGFactored Factored, segmentingXinhua (mainland, newswire)xinhuaPCFG.ser.gzxinhuaFactored.ser.gzxinhuaFactoredSegmenting.ser.gzMixed ChinesechinesePCFG.ser.gzchineseFactored.ser.gz

PCFG解析器更小,更快。但是对于中文来说,Factored parser明显更好,我们一般会推荐使用它。xinhua grammars只是来自中国大陆的新华社报刊。我们建议他们使用来解析中国大陆的材料。 中国语法还包括来自香港特别行政区和台湾的一些训练材料。如果从这些区域解析材料或使用混合文本类型,我们建议使用它们。 注意,虽然所有的训练材料使用简体字; 传统字符已转换为简体字符(通常正确)。 四个解析器假设已经被分词的输入,而第五个解析器在分析器内部进行分词。 这将在下面进一步讨论。 解析器还带有3个中文例句,在名称都以中文开头的文件中。字符编码:第一个要做好的是待解析的文本的字符编码。 默认情况下,我们的中文解析器使用GB18030(Penn Chinese Treebank的本地字符编码和中国的国家编码)用于输入和输出。 但是,很容易在另一个字符编码中解析文本:您只需给解析器提供-encoding encoding,其中encoding是在Java中能识别的字符集编码名称,例如:UTF-8,Big5-HKSCS或 GB18030。这将更改输入和输出编码。 如果要在命令窗口中显示输出,您还需要了解你的计算机支持哪些字符集进行显示。 如果这与文件的编码不同,则需要转换编码以进行显示。 如果任何这种编码的东西是错误的,那么你很可能看到乱码。 下面是用于解析两个测试文件的示例命令,一个是UTF-8,一个是GB18030。 运行它的(Linux)计算机设置为使用UTF-8(并且此网页也是UTF-8),因此对于GB18030的情况,输出通过Unix iconv实用程序进行管道显示 。

$ java -server -mx500m edu.stanford.nlp.parser.lexparser.LexicalizedParser -encoding utf-8 /u/nlp/data/lexparser/chineseFactored.ser.gz chinese-onesent-utf8.txtLoading parser from serialized file /u/nlp/data/lexparser/chineseFactored.ser.gz ... done [20.7 sec].Parsing file: chinese-onesent-utf8.txt with 2 sentences.Parsing [sent. 1 len. 8]: 俄国 希望 伊朗 没有 制造 核武器 计划 。(ROOT  (IP    (NP (NR 俄国))    (VP (VV 希望)      (IP        (NP (NR 伊朗))        (VP (VE 没有)          (NP (NN 制造) (NN 核武器) (NN 计划)))))    (PU 。)))Parsing [sent. 2 len. 6]: 他 在 学校 里 学习 。(ROOT  (IP    (NP (PN 他))    (VP      (PP (P 在)        (LCP          (NP (NN 学校))          (LC 里)))      (VP (VV 学习)))    (PU 。)))Parsed file: chinese-onesent-utf8.txt [2 sentences].Parsed 14 words in 2 sentences (6.55 wds/sec; 0.94 sents/sec).


$ java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser chineseFactored.ser.gz chinese-onesent |& iconv -f gb18030 -t utf-8Loading parser from serialized file chineseFactored.ser.gz ... done [13.3 sec].Parsing file: chinese-onesent with 1 sentences.Parsing [sent. 1 len. 10]: 他 和 我 在 学校 里 常 打 桌球 。(ROOT  (IP    (NP (PN 他)      (CC 和)      (PN 我))    (VP      (PP (P 在)        (LCP          (NP (NN 学校))          (LC 里)))      (ADVP (AD 常))      (VP (VV 打)        (NP (NN 桌球))))    (PU 。)))Parsed file: chinese-onesent [1 sentences].Parsed 10 words in 1 sentences (10.78 wds/sec; 1.08 sents/sec).

规范化:除了字符集,还存在字符的“规范化”问题:例如,基本的拉丁字母可以以“常规ASCII”形式或“全宽”形式出现,大小等同于汉字 。 字符规范化是我们将来可能重新考虑的东西,但是目前,解析器是在文本上进行训练的,主要是具有全宽拉丁字母和标点符号,没有规范化,所以如果你还表示这样的字符, 字母。 解析器确实提供了一个转义程序,将在输入时为您执行此映射。 您可以使用-escaper标志来调用它,通过使用像下面的命令(它也显示输出发送到文件):

$ java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -escaper edu.stanford.nlp.trees.international.pennchinese.ChineseEscaper -sentences newline chineseFactored.ser.gz chinese-onesent > chinese-onesent.stp

分词:中文通常不会在单词之间加上空格。但是上面显示的示例都是根据Penn Chinese Treebank原型被分割成单词的文本。为了获得最佳结果,我们建议您首先使用高质量的(根据Penn Chinese Treebank提供分词)分词系统来对输入文本进行分词(请注意,中文分词有许多不同的约定…)。您可以从 First, Second, or Third International Chinese Word Segmentation Bakeoff中找到更多关于CTB分词的信息。特别是,您现在可以从我们的软件页面下载一个基于CRF的分词器版本(类似于我们在Second Sighan Bakeoff中使用的系统)。然而,为了方便起见,我们还为parser提供了进行分词的能力。本质上,它将parser误用为first-order HMM Chinese word segmentation系统。这给出了一个合理的,但不是很好的中文分词系统。 (它的性能不如上面提到的斯坦福CRF分词器那么好。)要使用它,你使用-segmentMarkov选项或使用此选项训练的语法。例如:

$ iconv -f gb18030 -t utf8 < chinese-onesent-unseg.txt他在学校学习。$ java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser xinhuaFactoredSegmenting.ser.gz chinese-onesent-unseg.txt | & iconv -f gb18030 -t utf-8Loading parser from serialized file xinhuaFactoredSegmenting.ser.gz ... done [6.8 sec].Parsing file: chinese-onesent-unseg.txt with 1 sentences.Parsing [sent. 1 len. 5]: 他 在 学校 学习 。Trying recovery parse...Sentence couldn't be parsed by grammar.... falling back to PCFG parse.(ROOT  (IP    (NP (PN 他))    (VP      (PP (P 在)        (NP (NN 学校)))      (VP (VV 学习)))    (PU 。)))Parsed file: chinese-onesent-unseg.txt [1 sentences].Parsed 5 words in 1 sentences (6.08 wds/sec; 1.22 sents/sec).  1 sentences were parsed by fallback to PCFG.

语法关系:中文解析器还支持语法关系(类型依赖)输出。 例如:

$ java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat typedDependencies xinhuaFactored.ser.gz chinese-onesent | & iconv -f gb18030 -t utf-8Loading parser from serialized file xinhuaFactored.ser.gz ... done [4.9 sec].Parsing file: chinese-onesent with 1 sentences.Parsing [sent. 1 len. 10]: 他 和 我 在 学校 里 常 打 桌球 。conj(我-3, 他-1)cc(我-3, 和-2)nsubj(打-8, 我-3)prep(打-8, 在-4)lobj(里-6, 学校-5)plmod(在-4, 里-6)advmod(打-8, 常-7)dobj(打-8, 桌球-9)Parsed file: chinese-onesent [1 sentences].Parsed 10 words in 1 sentences (7.10 wds/sec; 0.71 sents/sec).
0 0