加载自定义NER模型Stanford CoreNLP

时间:2017-05-12 16:29:02

标签: java python python-3.x nlp stanford-nlp

我用Stanford" Stanford-NER"创建了我自己的NER模型。软件并遵循these指示。

我知道CoreNLP按以下顺序加载了三个NER模型:

  1. edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz
  2. edu/stanford/nlp/models/ner/english.muc.7class.distsim.crf.ser.gz
  3. edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz
  4. 我现在想在上面的列表中包含我的NER模型,并首先用我的NER模型标记文本。

    我找到了之前关于此主题的两个StackOverflow问题,它们是'Stanford OpenIE using customized NER model''Why does Stanford CoreNLP NER-annotator load 3 models by default?'

    这两篇文章都有很好的答案。答案的一般信息是您必须编辑文件中的代码。

    使用自定义NER模型的Stanford OpenIE

    在这篇文章中它说要编辑corenlpserver.sh但我在Stanford CoreNLP下载的软件中找不到这个文件。有人能指出我这个文件的位置吗?

    Stanford CoreNLP NER-annotator默认加载3个型号吗?

    这篇文章说我可以使用-ner.model的参数来专门调用要加载的NER模型。我将此参数添加到初始服务器命令(java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000 -ner.model *modlefilepathhere*)。这不起作用,因为服务器仍然加载所有三个模型。

    它还声明您必须更改一些Java代码,尽管它没有特别指出要进行更改的位置。

    我是否需要修改此代码props.put("ner.model", "model_path1,model_path2");或将其添加到CoreNLP软件中的特定类文件?

    问题:从我的研究中看来,我需要添加/修改一些代码来调用我独特的NER模型。这些编辑'如上所述,此信息已从其他StackOverflow问题中提取。我需要编辑哪些文件?这些文件到底在哪里(即edu / Stanford / nlp / ...等)?

    编辑:我的系统正在本地服务器上运行,并且我正在使用API​​ pycorenlp打开到本地服务器的管道并向其发出请求。 python / pycorenlp代码的两个关键行是:

    1. nlp = StanfordCoreNLP('http://localhost:9000')
    2. output = nlp.annotate(evalList[line], properties={'annotators': 'ner, openie','outputFormat': 'json', 'openie.triple.strict':'True', 'openie.max_entailments_per_clause':'1'})
    3. 认为这会影响我调用我独特的NER模型的能力,但我想提供所有情境数据以获得最佳答案。

1 个答案:

答案 0 :(得分:2)

如果要自定义服务器使用的管道,请创建一个名为server.properties的文件(或者您可以随意调用它)。

然后在使用java命令启动服务器-serverProperties server.properties时添加此选项。

在该.properties文件中,您应该包含ner.model = /path/to/custom_model.ser.gz

通常,您可以自定义服务器将在该.properties文件中使用的管道。例如,您还可以使用行annotators = tokenize,ssplit,pos,lemma,ner,parse等设置其中的注释器列表...

更新以发表评论:

  1. 在您的java命令中,您不需要-ner.model /path/to/custom_model.ser.gz

  2. .properties文件中可以包含无限量的属性设置,每行一个设置(空行被忽略,#' d out行)

  3. 运行Java命令时,它默认查找运行该命令的目录中的文件。因此,如果您的命令包含-serverProperties server.properties,则会假定文件server.properties与运行命令的目录相同。如果您提供绝对路径而不是-serverProperties /path/to/server.properties,则可以从任何地方运行命令。

  4. 所以要明确你可以用这个命令启动服务器(在包含所有jar的文件夹中运行):

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

    server.properties应该是这样的文件:

    ner.model = /path/to/custom_model.ser.gz
    

    server.properties可能如下所示:

    annotators = tokenize,ssplit,pos,lemma,ner,depparse
    ner.model = /path/to/custom_model.ser.gz
    parse.maxlen = 100
    

    仅作为示例...您应将所有设置放入server.properties

    1. 我在前面的回答中提到了一些关于从Python访问StanfordCoreNLP服务器的评论:
    2. cannot use pycorenlp for python3.5 through terminal

      您似乎正在使用我不太了解的pycorenlp库。其他2个选项是我在答案或我们制作的stanza包中显示的一些代码。以上答案中的详细信息。