java - 运行 SEMAFOR 语义解析器抛出 IllegalArgumentException

标签 java nlp

对于我目前正在进行的一个项目,我需要使用FrameNet注释来注释句子。 SEMAFOR 语义解析器 (https://github.com/Noahs-ARK/semafor) 很好地实现了这一点。我按照 git 存储库中的说明安装并配置了该工具。但是,如果我使用 cygwin 终端运行 runSemafor.sh 脚本,它会抛出 IllegalArgumentException ,指示无法解析生成的 pos.tagged 文件。

这是 cygwin 中的完整控制台输出(在 Windows 上运行):

$ ./runSemafor.sh D:/XFrame/Libs/Semafor/semafor/temp/sample.txt  D:/XFrame/Libs/Semafor/semafor/temp/output 2

**********************************************************************
Tokenizing file: D:/XFrame/Libs/Semafor/semafor/temp/neu.txt

real    0m0.140s
user    0m0.015s
sys     0m0.108s
Finished tokenization.
**********************************************************************


**********************************************************************
Part-of-speech tagging tokenized data....
/cygdrive/d/XFrame/Libs/Semafor/semafor/scripts/jmx/cygdrive/d/XFrame/Libs/Semafor/semafor/bin
Read 11692 items from tagger.project/word.voc
Read 45 items from tagger.project/tag.voc
Read 42680 items from tagger.project/tagfeatures.contexts
Read 42680 contexts, 117558 numFeatures from tagger.project/tagfeatures.fmap
Read model tagger.project/model : numPredictions=45, numParams=117558
Read tagdict from tagger.project/tagdict
*This is MXPOST (Version 1.0)*
*Copyright (c) 1997 Adwait Ratnaparkhi*
Sentence: 0 Length: 9 Elapsed Time: 0.007 seconds.

real    0m0.762s
user    0m0.046s
sys     0m0.171s
/cygdrive/d/XFrame/Libs/Semafor/semafor/bin
Finished part-of-speech tagging tokenized data.
**********************************************************************
**********************************************************************
Converting postagged input to conll.
Exception in thread "main" java.lang.IllegalArgumentException:
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.SentenceCodec.decode(Sentence                                                                              Codec.java:83)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.SentenceCodec$SentenceIterato                                                                              r.computeNext(SentenceCodec.java:115)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.SentenceCodec$SentenceIterato                                                                              r.computeNext(SentenceCodec.java:100)
    at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractI                                                                              terator.java:143)
    at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.j                                                                              ava:138)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.ConvertFormat.convertStream(C                                                                              onvertFormat.java:94)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.ConvertFormat.main(ConvertFor                                                                              mat.java:76)
 Caused by: java.lang.IllegalArgumentException: PosToken must have 2 "_"-separate                                                                              d fields
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java                                                                              :92)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.Token.fromPosTagged(Token.jav                                                                              a:248)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.SentenceCodec$2.decodeToken(S                                                                              entenceCodec.java:28)
    at edu.cmu.cs.lti.ark.fn.data.prep.formats.SentenceCodec.decode(Sentence                                                                              Codec.java:79)
    ... 6 more

作为注释的示例文件,我使用存储库中的示例文件:

This is a test for SEMAFOR, a frame-semantic parser.
This is just a dummy line.
There's a Santa Claus!

生成的 pos.tagged 文件看起来好像没有错误。为什么会出现这个异常?

This_DT is_VBZ a_DT test_NN for_IN SEMAFOR_NNP ,_, a_DT frame-semantic_JJ parser_NN ._. 
This_DT is_VBZ just_RB a_DT dummy_JJ line_NN ._. 
There_EX 's_VBZ a_DT Santa_NNP Claus_NNP !_. 

最佳答案

我遇到了与您所说的完全相同的问题,并自行解决了。这是因为解析器仅采用正确格式的输入文件,每行一个句子。

您需要做的是:在将每个句子写入文件时,在代码中添加以下行,以删除换行符或制表符。那么你应该可以开始了!

line = line.replace('\n', '')
line = line.replace('\t', '')

关于java - 运行 SEMAFOR 语义解析器抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947240/

相关文章:

python - 使用 textblob 或 spacy 更正法语拼写

python - 需要帮助创建适当的模型来预测两个句子之间的语义相似性

java - Android:文件在模拟器中工作但在设备中出现错误?

java - TcpConnectionFactoryFactoryBean 不支持循环引用?

java - 如何阻止混淆器混淆整个包?

nlp - 有谁知道有什么好的词义消歧软件吗?

python - 使用 Tensorflow 处理文本数据 2 "ERROR: Attempted to pad to a smaller size than the input element"

artificial-intelligence - 如何确定主语、宾语等词?

java - ObjectInputStream.readObject() EOFException

java - "String".equals(otherString) 有什么好处