PARSER GUIDELINE
S tanford parser
一个简易的Stanford parser系统只需要包含四类文件,它们分别是:①java包(最新版本为stanford-parser-2011-04-20.jar)、②模板(英文:///。中文: ///)、③输入文件(一般为.txt后缀的分词文件(、④输出文件(一般为.parse后缀的成分句法树文件或是以.dep 后缀的依存句法树文件)
1.英文句法分析
举例:
Java -mx1g -cp stanford-parser-2011-04-20.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -maxLength 100 –outputFormat oneline -sentences newline -outputFormatOptions removeTopBracket > output.std_Factored_parse
参数解释:
①-mx1g:给java虚拟机分配的最大内存为1g(大小可自行设置)。
②-cp :为了加载java包stanford-parser-2011-04-20.jar。
LexicalizedParser:parser类.
③-maxLength:指定句子单词长度最大为100。
④–outputFormat:指定输出句子的格式。
outputFormat具体选项值如下:
Oneline:成分句法分析输出文件的格式为每行一句的广义表形式的树结构。Penn:成分句法分析输出文件的格式为层次化树的形式。默认选项为penn。latexTree:格式类似于penn
Words:只给出分词格式。如:
继续播报详细的新闻内容。
wordsAndTags:给出分词文本和标记。如:
继续/VV 播报/VV 详细/VA 的/DEC 新闻/NN 内容/NN 。/PU
rootSymbolOnly:只给出ROOT结点
typedDependencies:给出依存句法分析结果。
mmod(播报-2, 继续-1)
rcmod(内容-6, 详细-3)
cpm(详细-3, 的-4)
nn(内容-6, 新闻-5)
dobj(播报-2, 内容-6)
conllStyleDependencies、conll2008:conll格式(每行一词,每词十项)如下:
1 继续_ VV _ _
2 _ _ _
2 播报_ VV _ _ 0 _ _ _
3 详细_ VA _ _
4 _ _ _
4 的_ DEC _ _ 6 _ _ _
5 新闻_ NN _ _
6 _ _ _
6 内容_ NN _ _ 2 _ _ _
7 。_ PU _ _ 2 _ _ _
⑤-escaper:字符的标准化(例如将英文的”(”改成”-LRB-”,默认情况即这样转换)。英文的escaper为edu.stanford.nlp.process.PTBEscapingProcessor。中文为:edu.s.international.pennchinese.ChineseEscaper。
举例:
java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -escaper e
du.s.international.pennchinese.ChineseEscaper -sentences newline chinese-onesent > chinese-onesent.stp
⑥-sentences:指定句子之间的边界,一般为newline :输入文件的句子通过换行符分割。Parser得到的文本是每行一句,一句一句的进行分析。
⑦-encoding:指定输入输出文件的字符集。(中文默认为GB18030)
⑧-outputFormatOptions:进一步控制各种–outputFormat选项的输出行为(可以说是–outputFormat的附加选项)。
当–outputFormat为typedDependencies时,-outputFormatOptions可有如下选项(默认选项为collapsed dependencyies):
basicDependencies:基本格式
treeDependencies:以树结构保存的压缩依存关系(去除依存图中一些边构成树)。collapsedDependencies:压缩依存(不一定为树结构)
cc(makes-11, and-12)
conj(makes-11, distributes-13)
转化为:
Conj_and(makes-11, distributes-13)
CCPropagatedDependencies:带有连词依存传播的压缩依存。
⑨-writeOutputFiles:产生对应于输入文件的输出文件,输出文件名同输入文件,只是增加了”.stp”的后缀。-outputFilesExtension:指定输出文件扩展名,默认为”.stp”
⑩-outputFilesDirectory :指定输出文件目录,默认为当前目录。
在这一小节中,我们用到的parser类为parser.lexparser.LexicalizedParser,这个类既能生成基于短语结构的成分句法树(指定输出格式为penn或oneline),又可以生成基于依存结构的依存句法树(指定输出格式为typedDependencies)。
接下来,我们用到的类名为:trees.EnglishGrammaticalStructure。我们使用这个类将已经是成分句法树结构(penn Treebank-style trees)转化为依存句法树结构。这里的成分句法树来源,既可以是stanford parser生成的,又可以是其他种类的parser(如:berkeley parser、charniak parser)生成的。
2.依存句法分析
error parse new举例:
java -mx1g -cp "stanford-parser.jar;" edu.s.EnglishGrammaticalStructure
- -basic -collapsed -extraSep -keepPunct -parserFile
>output.deptree
选项解释(与LexicalizedParser相同的选项省略)
输出文件的树结构可以通过以下参数直接指定:
-basic:basic dependencies
-conllx :basic dependencies printed out in CoNLL X (CoNLL 2006) format
-collapsed:collapsed dependencies (not necessarily a tree structure)
-CCprocessed:collapsed dependencies with propagation of conjunctdependencies (not necessarily a tree structure)
-collapsedTree:collapsed dependencies that preserve a tree structure
-nonCollapsed:non-collapsed dependencies: basic dependencies as well as the extra ones which do not preserve a tree structure
其他参数:
-treeFile:指定输入文件,即成分句法树结构文件。
-extraSep:如果存在多种类型的输出格式,使用分隔符(------)将basicdependencies和其他形式的分隔开。
-keepPunct:默认不输出符号依存关系,可以通过该选项保留。
3. trees.EnglishGrammaticalStructure其他功能
①trees.EnglishGrammaticalStructure还可以将CoNLL格式的依存关系转化为其他类型的依存关系。可以通过-conllxFile来指定输入文件。
②它还可以parse分词文档,不过对输入文件的要求更高。必须是每行一句。只能指定依存类型,不能
指定其他选项。用-sentFile替代-treeFile指定输入文件,需要用-parserFile 选项指定模板文件,使用-parseTree选项打印句法树。
举例:
java -mx100m edu.s.EnglishGrammaticalStructure -
-collapsedTree -CCprocessed -parseTree –parserFile
4.中英文模板说明
Stanford parser不需要我们自己训练模板,它为我们提供了现成的模板。
英文模板:
///
仅仅包含一个未词汇化的概率上下文无关文法。包含两种语法(a (simpler) PCFG parser and then an untyped dependency parser)。对英文来说,虽然上述两种模板的语法和分析方法都不同,但是两者的平均性能相似。所以,一般倾向于使用快一点的模板eng
。对于其他语言(如中文),由于factored模板包含词汇化信息,factored类型模板的性能也明显的好于PCFG模板的性能。
中文模板:
Xinhua grammars只在中国大陆《新华日报》语料中训练,更适合解析来自中国大陆的文本。chinese grammars还包含了部分香港和台湾的训练语料。
5.未分词文本直接parse举例:
java -mx500m -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser | & iconv -f gb18030 -t utf-8
解释“| & iconv -f gb18030 -t utf-8”如下:
Linux环境下,必须转换编码格式才可以显示parser的输出结果。此处使用管道将parser的结果送到unix字符集转换工具中。
6.parser运行时内存使用情况
Parser在运行时需要大量内存,碰到长句子可能会提示“java.lang.OutOfMemoryError”。可以通过-mx选项设定最大内存(32位机,物理内存为3G,最大可分配给java虚拟机的内存为1400M 左右,此时,可解析的英文句子长度大概为80。若把最大内存设置的过大,会提示“Could not create the Java virtual machine.”)。
Parser的内存使用依赖于以下因素:
①内存需求大致与句子长度成正比,可以通过-maxLength选项设定最大句子长度来跳过长
句子。
②在同样条件下,Factored类型模板需要的内存可能为PCFG类型模板的几倍,因为它同时
运行三个parser。
③Parser将整个文件先读入内存再解析。所以,将一个很大的文件分割成几个小文件分别
进行解析,会减少内存的使用。
④同样条件下,64位机比32位机要耗费更多的内存(java使用大量指针)。
⑤语法集合越大,使用内存越多。
下面的表格显示了句子长度和不同模板对内存的需求。
B erkeley parser
一个简易的berkeley parser只需要包含java包:berkeleyParser.jar。模板:中文为,英文为。输入文件、输出文件。Berkeley parser只能进行成分句法分析。进行parser 之前需要将分词文本中的英文小括号”(“和“)”分别转化为”-LRB-”和”-RRB-”。Berkeley parser 不能自动的进行这样的转化。中文parser输入输出标记不能用参数-inputFile和-outputFile,必须用”<””>”指定。否则会出现乱码问题。
Berkeley Parser使用举例及说明
1.java -jar berkeleyParser.jar
该命令将打印parser的所有选项:
-inputFile 读取输入文件
-gr 指定文法模板
-chinese 使词典的一些中文特有的特征起作用
-accurate 设置准确率门限
-outputFile 输出文件
-nThreads 用多线程进行解析 (默认值为1)
-maxLength 最大句子长度(Default = 200).
-h 帮助信息(选项内容)
2. 英文berkeley parser命令
java –mx1g -jar berkeleyParser.jar -gr - -outputFile output.parse
输入:Bell a company which is based in LA makes and distributes cmputer products
输出:( (S (NP (NP (NNP Bell)) (NP (NP (DT a) (NN company)) (SBAR (WHNP (WDT which)) (S (VP
(VBZ is) (VP (VBN based) (PP (IN in) (NP (NNP LA))))))))) (VP (VBZ makes) (CC and) (VBZ distributes) (NP (NN cmputer) (NNS products)))) )
3.中文berkeley parser命令
java –mx1g -jar berkeleyParser.jar -gr < > output.parse
输入:继续播报详细的新闻内容
输出:( (IP (VP (VV 继续) (VP (VV 播报) (NP (CP (IP (VP (VA 详细))) (DEC 的)) (NP (NN 新闻) (NN 内容)))))) )
C harniak parser
1.下载Charniak Parser (ftp://ftp.cs.brown.edu/pub/nlparser/)
2.编译(Linux环境下)
解压后进入PARSE文件夹, 使用命令make parseIt, 得到如下错误:
/usr/bin/g++ -c -O Bchart.C
/usr/bin/g++ -c -O BchartSm.C
BchartSm.C:30: error: expected initializer before '*' token
BchartSm.C: In member function 'float Bchart::computepTgT(int, int)':
BchartSm.C:612: error: 'globalGi' was not declared in this scope
make: *** [BchartSm.o] Error 1
通过添加头文件,或作稍微改动,即可编译通过。
解决办法:可能是g++版本不对,我使用的g++版本为4.2.4, 最好是g++-3.3.3, 可安装g++
3.3version, 然后在makefile文件中,用g++-3.3替换g++
重新使用命令make parseIt编译,得到如下错误:
g++-3.3 Bchart.o BchartSm.o Bst.o FBinaryArray.o CntxArray.o ChartBase.o ClassRule.o CombineBests.o ECArgs.o Edge.o EdgeHeap.o Feat.o Feature.o FeatureTree. FullHist.o GotIter.o InputTree.o Item.o Link.o Params.o ParseStats.o SentRep.o Term.o TimeIt.o UnitRules.o ValHeap.o edgeSubFns.o ewDciTokStrm.o extraMain.o fhSubFns.o headFinder.o headFinderCh.o utils.o MeChart.o parseIt.o -o parseIt
Bchart.o: In function `Bchart::put_in_reg(Item*)':
Bchart.C:(.text+0x4ae): undefined reference to
`std::_List_node_base::hook(std::_List_node_base*)'
Bchart.o: In function `__tcf_3':
Bchart.C:(.text+0x7be): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage' ........................(省略), 还有很多类似错误,像是使用std出错.
解决办法:
往Bchart.件添加std的引用
using namespace std;
并删除Bchart.o文件,重新使用命令make parseIt编译
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论