【问题标题】:Number of parameters must be always be even : opennlp参数数量必须始终为偶数:opennlp
【发布时间】:2016-05-23 05:57:55
【问题描述】:

我一直在尝试使用命令行界面来训练我的模型,如下所示:

opennlp TokenNameFinderTrainer -model en-ner-pincode.bin -iterations 500 \ -lang en -data en-ner-pincode.train -encoding UTF-8

控制台输出为:

Number of parameters must be always be even
Usage: opennlp TokenNameFinderTrainer[.evalita|.ad|.conll03|.bionlp2004|.conll02|.muc6|.ontonotes|.brat] [-factory factoryName] [-resources resourcesDir] [-type modelType] [-featuregen featuregenFile] [-nameTypes types] [-sequenceCodec codec] [-params paramsFile] -lang language -model modelFile -data sampleData [-encoding charsetName]

如果我不包括迭代次数,它可以正常工作。 有人知道这背后的原因吗?

谢谢!

【问题讨论】:

  • 如果您保留-iterations 但删除其他选项,例如-lang,它是否有效?
  • 不,即使我删除 -lang 也会出现同样的错误! ://
  • 中间挂的\是什么?它是换行符还是实际上是命令的一部分?
  • /它是文档中给出的命令的一部分

标签: java command-line-interface opennlp training-data


【解决方案1】:

其实问题是

    -params paramsFile
            training parameters file.
    -iterations num
            number of training iterations, ignored if -params is used.
    -cutoff num
            minimal number of times a feature must be seen, ignored if -params is used.

如果有人使用params,那么iterationscutoff 将被忽略。因此,对于您的情况,会显示此信息消息。

资源链接:

  1. Tokenizer Training : Training Tool

更新:

所以,请使用ChunkerTrainerME 而不是TokenNameFinderTrainer

您的命令应如下所示

opennlp ChunkerTrainerME -model en-ner-pincode.bin -iterations 500 \ -lang en -data en-ner-pincode.train -encoding UTF-8

UPDATE2:转换数据

我将使用西班牙数据作为参考,但它与荷兰语的操作相同。您只需要记住将“-lang es”更改为“-lang nl”并使用正确的训练文件。所以要将信息转换为 OpenNLP 格式:

$ opennlp TokenNameFinderConverter conll02 -data esp.train -lang es -types per > es_corpus_train_persons.txt

您也可以选择转换训练测试样本。

$ opennlp TokenNameFinderConverter conll02 -data esp.testa -lang es -types per > corpus_testa.txt
$ opennlp TokenNameFinderConverter conll02 -data esp.testb -lang es -types per > corpus_testb.txt

使用西班牙数据进行训练

为名称查找器训练模型:

\bin\opennlp TokenNameFinderTrainer -lang es -encoding u
tf8 -iterations 500 -data es_corpus_train_persons.txt -model es_ner_person.bin

UPDATE3:转换数据(可选)

将信息转换为 OpenNLP 格式:

$ opennlp TokenNameFinderConverter conll03 -lang en -types per -data eng.train > corpus_train.txt

您也可以选择转换训练测试样本。

$ opennlp TokenNameFinderConverter conll03 -lang en -types per -data eng.testa > corpus_testa.txt
$ opennlp TokenNameFinderConverter conll03 -lang en -types per -data eng.testb > corpus_testb.txt

用英文数据训练

您可以通过这种方式为名称查找器训练模型:

$ opennlp TokenNameFinderTrainer.conll03 -model en_ner_person.bin -iterations 500 \
                                 -lang en -types per -data eng.train -encoding utf8

如果您已经转换了数据,那么您可以通过这种方式为名称查找器训练模型:

$ opennlp TokenNameFinderTrainer -model en_ner_person.bin -iterations 500 \
                                 -lang en -data corpus_train.txt -encoding utf8

【讨论】:

  • 那么,如果我想增加迭代次数怎么办?
  • 他在最初的通话中没有使用-params,所以我看不出这有什么关系
  • 它给出了同样的错误,但为什么是 ChunkerTrainerME?我不明白
  • @Nuwanda 在这种情况下,您可以转换您的数据类型,然后与TokenNameFinderTrainer进行检查
  • 将数据类型转换成什么?
【解决方案2】:

来自“https://opennlp.apache.org/documentation/1.6.0/manual/opennlp.html#intro.cli

Usage: opennlp TokenizerTrainer[.namefinder|.conllx|.pos] [-abbDict
path] ...  -model modelFile ...

这个工具命令行的大体结构包括必填工具名(TokenizerTrainer),可选格式 参数([.namefinder|.conllx|.pos]),可选参数 ([-abbDict path] ...) 和强制参数 (-model modelFile ...)。

所以参数要么是以“。”开头的东西。或带有“-”,并且需要有偶数个。文档中有一些例子似乎同意这一点。

【讨论】:

  • 我试过删除-lang,现在它有4个参数但显示相同的错误:/
  • 啊,我以为我有什么东西... 附带问题,你在命令行中使用 `\` 吗?这可能是你错误的根源吗?我对此表示怀疑,但总比抱歉更安全。
  • 不,我尝试不使用 /,然后它无法识别 -iterations!
  • @Nuwanda 哦,就这样,绝对
  • 文档中的反斜杠用于标记换行符。不要把它放在你的指挥下!
【解决方案3】:

简短的回答,iterations 不是 TokenNameFinderTrainer 的参数。您可以从控制台输出中列出已识别参数的问题中看到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2021-06-18
    • 2014-10-08
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多