使用StanfordNLP进行Tokenizer培训

时间:2017-04-30 20:06:00

标签: nlp stanford-nlp

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

以下是我的努力: -

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

效力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

效力III: - 我以为我能够处理RegexNER,我在某种程度上取得了成功。只是它通过RegexNER学习的实体,它不适用于即将到来的表达式。例如:它会在文本中找到实体“CUSTOM_ENTITY”,但是如果我放置像

 ( [ {ner:CUSTOM_ENTITY} ] /with/ [ {ner:CUSTOM_ENTITY} ] ) 
这样的正则表达式,它就永远不会成功找到正确的短语。

真的需要帮助!!!我不想再次训练完整的模型,斯坦福大家拿到了GB的模型信息对我有用。只是我想添加自定义实体。

2 个答案:

答案 0 :(得分:1)

首先确保你的CLASSPATH中有正确的罐子。

以下是您应该如何加入经过自定义培训的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组合仅使用第一个模型中特定类的标签。因此,如果您有model1,model2,model3,则只使用model1的LOCATION。如果您将事物设置为HIGH_RECALL,那么也将使用model2和model3的LOCATION标记。

要记住的另一件事是,model2无法覆盖model1的决策。它只能覆盖“O”。因此,如果model1表示某个特定令牌是LOCATION,那么model2不能说它是一个ORGANIZATION或PERSON或任何东西。因此,列表中模型的顺序很重要。

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

TokensRegex rules to get correct output for Named Entities

答案 1 :(得分: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