如何使用 Genia Corpus 训练 Stanford Parser?

Posted

技术标签:

【中文标题】如何使用 Genia Corpus 训练 Stanford Parser?【英文标题】:How to train the Stanford Parser with Genia Corpus? 【发布时间】:2012-06-06 17:41:33 【问题描述】:

我在为斯坦福解析器创建新模型时遇到了一些问题。

我还从斯坦福下载了最新版本: http://nlp.stanford.edu/software/lex-parser.shtml

这里,Genia Corpus 有 2 种格式,xml 和 ptb (Penn Treebank)。

Standford Parser 可以使用 ptd 文件进行训练;然后我下载了 Genia Corpus,因为我想处理生物医学文本:

http://categorizer.tmit.bme.hu/~illes/genia_ptb/ (链接不再可用) (genia_ptb.tar.gz)

然后,我有一个简短的 Main 类来获取一个生物医学句子的依赖表示:

    String treebankPath = "/stanford-parser-2012-05-22/genia_ptb/GENIA_treebank_v1/ptb";

    Treebank tr = op.tlpParams.diskTreebank();
    tr.loadPath(treebankPath);  
    LexicalizedParser lpc=LexicalizedParser.trainFromTreebank(tr,op);

我尝试了不同的方法,但总是得到相同的结果。

最后一行有错误。这是我的输出:

Currently Fri Jun 01 15:02:57 CEST 2012
Options parameters:
useUnknownWordSignatures 2
smoothInUnknownsThreshold 100
smartMutation false
useUnicodeType false
unknownSuffixSize 1
unknownPrefixSize 1
flexiTag true
useSignatureForKnownSmoothing false
parserParams edu.stanford.nlp.parser.lexparser.EnglishTreebankParserParams
forceCNF false
doPCFG true
doDep false
freeDependencies false
directional true
genStop true
distance true
coarseDistance false
dcTags false
nPrune false
Train parameters: smooth=false PA=true GPA=false selSplit=true (400.0; deleting [VP^SQ, VP^VP, VP^SINV, VP^NP]) mUnary=1 mUnaryTags=false sPPT=false tagPA=true tagSelSplit=false (0.0) rightRec=true leftRec=false collinsPunc=false markov=true mOrd=2 hSelSplit=true (10) compactGrammar=3 postPA=false postGPA=false selPSplit=false (0.0) tagSelPSplit=false (0.0) postSplitWithBase=false fractionBeforeUnseenCounting=0.5 openClassTypesThreshold=50 preTransformer=null taggedFiles=null
Using EnglishTreebankParserParams splitIN=4 sPercent=true sNNP=0 sQuotes=false sSFP=false rbGPA=false j#=false jJJ=false jNounTags=false sPPJJ=false sTRJJ=false sJJCOMP=false sMoreLess=false unaryDT=true unaryRB=true unaryPRP=false reflPRP=false unaryIN=false sCC=1 sNT=false sRB=false sAux=2 vpSubCat=false mDTV=2 sVP=3 s***PAgr=false sSTag=0 mVP=false sNP%=0 sNPPRP=false dominatesV=1 dominatesI=false dominatesC=false mCC=0 sSGapped=4 numNP=false sPoss=1 baseNP=1 sNPNNP=0 sTMP=1 sNPADV=1 cTags=true rightPhrasal=false gpaRootVP=false splitSbar=0 mPPTOiIN=0
Binarizing trees...done. Time elapsed: 141 ms
Extracting PCFG...done. Time elapsed: 56 ms
Compiling grammar...done Time elapsed: 1 ms
Extracting Lexicon...Exception in thread "main" edu.stanford.nlp.util.ReflectionLoading$ReflectionLoadingException: edu.stanford.nlp.util.MetaClass$ClassCreationException: java.lang.ClassNotFoundException: edu.stanford.nlp.parser.lexparser.EnglishUnknownWordModelTrainer
    at edu.stanford.nlp.util.ReflectionLoading.loadByReflection(ReflectionLoading.java:39)
    at edu.stanford.nlp.parser.lexparser.BaseLexicon.initializeTraining(BaseLexicon.java:335)
    at edu.stanford.nlp.parser.lexparser.LexicalizedParser.getParserFromTreebank(LexicalizedParser.java:800)
    at edu.stanford.nlp.parser.lexparser.LexicalizedParser.trainFromTreebank(LexicalizedParser.java:226)
    at edu.stanford.nlp.parser.lexparser.LexicalizedParser.trainFromTreebank(LexicalizedParser.java:237)
    at ABravoDemo.main(ABravoDemo.java:35)
Caused by: edu.stanford.nlp.util.MetaClass$ClassCreationException: java.lang.ClassNotFoundException: edu.stanford.nlp.parser.lexparser.EnglishUnknownWordModelTrainer
    at edu.stanford.nlp.util.MetaClass.createFactory(MetaClass.java:353)
    at edu.stanford.nlp.util.MetaClass.createInstance(MetaClass.java:370)
    at edu.stanford.nlp.util.ReflectionLoading.loadByReflection(ReflectionLoading.java:37)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: edu.stanford.nlp.parser.lexparser.EnglishUnknownWordModelTrainer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at edu.stanford.nlp.util.MetaClass$ClassFactory.construct(MetaClass.java:119)
    at edu.stanford.nlp.util.MetaClass$ClassFactory.<init>(MetaClass.java:192)
    at edu.stanford.nlp.util.MetaClass$ClassFactory.<init>(MetaClass.java:53)
    at edu.stanford.nlp.util.MetaClass.createFactory(MetaClass.java:349)
    ... 7 more

我怎样才能用这个语料库创建一个新模型?

【问题讨论】:

检查:***.com/a/3158157/2128327 how do I create my own training corpus for stanford tagger?的可能重复 真正的原因是“java.lang.ClassNotFoundException: edu.stanford.nlp.parser.lexparser.EnglishUnknownWordModelTrainer”。 nlp.stanford.edu/software/… 有那个班吗?我现在无法下载 900MB 来查看。 试试这个视频,它可能对你有帮助,youtube.com/watch?v=w4rWpvBjBRI 【参考方案1】:

正如 andrucz 在他的评论中所说,您的问题的真正原因似乎源于缺少课程。

尝试检查您是否正确导入了库(并确保它包含 edu.stanford.nlp.parser.lexparser 中的类 EnglishUnknownWordModelTra‌​iner

(如果您使用的是 Maven,请验证您是否正确添加了依赖项 - 一个快速的谷歌 brugt 这个:Stanford Parser Maven Repo)

【讨论】:

【参考方案2】:

NLP 库是否安装正确? 检查日志以验证没有错误。大多数情况下,当 stanford nltk 库安装不正确时,就会出现此问题。

一种快速的检查方法是运行 GUI 来尝试解析器,如果成功运行,则库安装正确,否则如果抛出错误,那么你知道你的安装很差。

斯坦福网站也提到了这一点:

如果您不熟悉解析,可以先运行 GUI 来试用解析器。包含用于 linux (lexparser-gui.sh) 和 Windows (lexparser-gui.bat) 的脚本。 查看 Javadoc lexparser 包文档和 LexicalizedParser 类文档。 (将您的 Web 浏览器指向包含的 javadoc 目录中的 index.html 文件并导航到这些项目。) 查看解析器常见问题解答以获取常见问题的答案。 如果这些都没有帮助,请参阅我们的电子邮件指南,了解如何联系我们以获得进一步帮助。

【讨论】:

【参考方案3】:

检查您是否已正确导入库并确保它包含类 EnglishUnknownWordModelTra‌​iner,并确保您下载的版本与 Genia Corps 正确兼容。

【讨论】:

以上是关于如何使用 Genia Corpus 训练 Stanford Parser?的主要内容,如果未能解决你的问题,请参考以下文章

NLPfrom glove import Glove的使用模型保存和加载

如何在 R 中为 tf-idf 加权 dfm 训练朴素贝叶斯分类器?

如何在 python crfsuite 中使用 Conll 2003 语料库

在 stan 中进行数据增强的概率回归

Doc2Vec -- "tag '23943' not seen in training corpus/invalid" 错误

使用 cv.fit_transform(corpus).toarray() 的内存错误