【问题标题】:Tokenizer Training with StanfordNLP使用 StanfordNLP 进行 Tokenizer 训练
【发布时间】:2017-09-28 09:05:44
【问题描述】:

所以我的要求很简单。我需要基于自定义实体的 StanfordCoreNLP 默认模型以及我的自定义训练模型。在最后的运行中,我需要能够从给定的句子中分离出特定的短语(将使用 RegexNER)

以下是我的努力:-

努力我:- 所以我想使用 StanfordCoreNLP CRF 文件、标记器文件和 ner 模型文件,以及我的自定义训练 ner 模型。 我试图找到是否有任何官方方法可以做到这一点,但没有得到任何东西。 StanfordCoreNLP 管道有一个属性“ner.model”,但如果使用它会跳过默认的。

EFFORT II:- 接下来(可能不是最聪明的事情。对不起!只是一个努力维持生计的人!),我提取了模型

stanford-corenlp-models-3.7.0.jar
,并复制所有:-

*.ser.gz (Parser Models)
*.tagger (POS Tagger)
*.crf.ser.gz (NER CRF Files)

并尝试将逗号分隔值分别与属性“parser.model”、“pos.model”和“ner.model”放在一起,如下所示:-


parser.model=models/ner/default/anaphoricity_model.ser.gz,models/ner/default/anaphoricity_model_conll.ser.gz,models/ner/default/classification_model.ser.gz,models/ner/default/classification_model_conll.ser.gz,models/ner/default/clauseSearcherModel.ser.gz,models/ner/default/clustering_model.ser.gz,models/ner/default/clustering_model_conll.ser.gz,models/ner/default/english-embeddings.ser.gz,models/ner/default/english-model-conll.ser.gz,models/ner/default/english-model-default.ser.gz,models/ner/default/englishFactored.ser.gz,models/ner/default/englishPCFG.caseless.ser.gz,models/ner/default/englishPCFG.ser.gz,models/ner/default/englishRNN.ser.gz,models/ner/default/englishSR.beam.ser.gz,models/ner/default/englishSR.ser.gz,models/ner/default/gender.map.ser.gz,models/ner/default/md-model-dep.ser.gz,models/ner/default/ranking_model.ser.gz,models/ner/default/ranking_model_conll.ser.gz,models/ner/default/sentiment.binary.ser.gz,models/ner/default/sentiment.ser.gz,models/ner/default/truecasing.fast.caseless.qn.ser.gz,models/ner/default/truecasing.fast.qn.ser.gz,models/ner/default/word_counts.ser.gz,models/ner/default/wsjFactored.ser.gz,models/ner/default/wsjPCFG.ser.gz,models/ner/default/wsjRNN.ser.gz
ner.model=models/ner/default/english.all.3class.caseless.distsim.crf.ser.gz,models/ner/default/english.all.3class.distsim.crf.ser.gz,models/ner/default/english.all.3class.nodistsim.crf.ser.gz,models/ner/default/english.conll.4class.caseless.distsim.crf.ser.gz,models/ner/default/english.conll.4class.distsim.crf.ser.gz,models/ner/default/english.conll.4class.nodistsim.crf.ser.gz,models/ner/default/english.muc.7class.caseless.distsim.crf.ser.gz,models/ner/default/english.muc.7class.distsim.crf.ser.gz,models/ner/default/english.muc.7class.nodistsim.crf.ser.gz,models/ner/default/english.nowiki.3class.caseless.distsim.crf.ser.gz,models/ner/default/english.nowiki.3class.nodistsim.crf.ser.gz
pos.model=models/tagger/default/english-left3words-distsim.tagger

但是,我得到以下异常:-


Caused by: edu.stanford.nlp.io.RuntimeIOException: Error while loading a tagger model (probably missing model file)
Caused by: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF

EFFORT III:- 我认为我可以使用 RegexNER 处理,并且在某种程度上我是成功的。只是它通过 RegexNER 学习的实体不适用于即将出现的表达式。例如:它会在文本中找到实体“CUSTOM_ENTITY”,但如果我放一个像

这样的 RegexNER
 ( [ {ner:CUSTOM_ENTITY} ] /with/ [ {ner:CUSTOM_ENTITY} ] ) 
它永远无法找到正确的短语。

这里真的需要帮助!!!我不想再次训练完整的模型,斯坦福大学的人得到了超过 GB 的模型信息,这对我很有用。只是我也想添加自定义实体。

【问题讨论】:

  • 对不起,错误的标题!我该如何改变它?这是针对 StanfordNLP,而不是 OpenNLP
  • 不是一个真正的答案,所以我只是把它作为一个评论,但是:在你的类路径中包含 corenlp-models.jar 文件实际上要容易得多,然后你不要'不必为模型指定自定义路径。您遇到的问题似乎是损坏的 POS 模型文件。我不清楚到底出了什么问题(也许它需要一个 gzip 文件?)。

标签: nlp stanford-nlp


【解决方案1】:

根据你给定的上下文

使用这个而不是逗号分隔值并尝试将所有 jar 放在同一目录中:

parser.model=models/ner/default/anaphoricity_model.ser.gz
parser.model=models/ner/default/anaphoricity_model_conll.ser.gz
parser.model=models/ner/default/classification_model.ser.gz
parser.model=models/ner/default/classification_model_conll.ser.gz
parser.model=models/ner/default/clauseSearcherModel.ser.gz
parser.model=models/ner/default/clustering_model.ser.gz
parser.model=models/ner/default/clustering_model_conll.ser.gz
parser.model=models/ner/default/english-embeddings.ser.gz
parser.model=models/ner/default/english-model-conll.ser.gz
parser.model=models/ner/default/english-model-default.ser.gz
parser.model=models/ner/default/englishFactored.ser.gz
parser.model=models/ner/default/englishPCFG.caseless.ser.gz
parser.model=models/ner/default/englishPCFG.ser.gz
parser.model=models/ner/default/englishRNN.ser.gz
parser.model=models/ner/default/englishSR.beam.ser.gz
parser.model=models/ner/default/englishSR.ser.gz
parser.model=models/ner/default/gender.map.ser.gz
parser.model=models/ner/default/md-model-dep.ser.gz
parser.model=models/ner/default/ranking_model.ser.gz
parser.model=models/ner/default/ranking_model_conll.ser.gz
parser.model=models/ner/default/sentiment.binary.ser.gz
parser.model=models/ner/default/sentiment.ser.gz
parser.model=models/ner/default/truecasing.fast.caseless.qn.ser.gz
parser.model=models/ner/default/truecasing.fast.qn.ser.gz
parser.model=models/ner/default/word_counts.ser.gz
parser.model=models/ner/default/wsjFactored.ser.gz
parser.model=models/ner/default/wsjPCFG.ser.gz
parser.model=models/ner/default/wsjRNN.ser.gz

现在复制上面的行,同样地制作其他模型并将其粘贴到 server.properties 文件中。 如果您没有 server.properties 文件,请创建它。

并使用以下命令来启动你的服务器:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000 -serverProperties server.properties

【讨论】:

    【解决方案2】:

    首先确保您的 CLASSPATH 中有正确的 jars。

    以下是您应该如何包含自定义训练的 NER 模型:

    java -Xmx8g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner -ner.model <csv-of-model-paths> -file example.txt
    

    -ner.model 应设置为您要使用的所有模型的逗号分隔列表。

    以下是您可以输入的示例:

    edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz,edu/stanford/nlp/models/ner/english.muc.7class.distsim.crf.ser.gz,edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz,/path/to/custom_model.ser.gz
    

    请注意,在我的示例中,将运行所有标准模型,然后最终运行您的自定义模型。确保您的自定义模型在 CLASSPATH 中。

    您可能还需要将其添加到您的命令中:-ner.combinationMode HIGH_RECALL。默认情况下,NER 组合将仅使用第一个模型中特定类的标签。因此,如果您有模型 1、模型 2、模型 3,则只会使用模型 1 的位置。如果您将事物设置为HIGH_RECALL,那么model2 和model3 的LOCATION 标签也将被使用。

    另外要记住的是,model2 不能覆盖 model1 的决定。它只能覆盖“O”。所以如果模型 1 说一个特定的标记是一个位置,模型 2 不能说它是一个组织或一个人或任何东西。所以列表中模型的顺序很重要。

    如果你想编写使用以前规则找到的实体的规则,你应该看看我对这个问题的回答:

    TokensRegex rules to get correct output for Named Entities

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-16
      • 2020-01-12
      • 1970-01-01
      • 2021-05-23
      • 2016-10-20
      • 2011-01-25
      • 2019-10-15
      • 1970-01-01
      相关资源
      最近更新 更多