加载自定义 NER 模型 Stanford CoreNLP

Fra*_*and 6 python java nlp stanford-nlp python-3.x

我已经使用斯坦福大学的“Stanford-NER”软件并按照这些说明创建了我自己的 NER 模型。

我知道 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

我现在想在上面的列表中包含我的 NER 模型,并首先用我的 NER 模型标记文本。

我在 StackOverflow 上找到了两个关于这个主题的问题,它们是“Stanford OpenIE using custom NER model”“为什么斯坦福 CoreNLP NER-annotator 默认加载 3 个模型?”

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

斯坦福 OpenIE 使用定制的 NER 模型

这篇文章说要编辑,corenlpserver.sh但我在斯坦福 CoreNLP 下载的软件中找不到这个文件。谁能指出我这个文件的位置?

斯坦福 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'})

认为这会影响我调用我独特的 NER 模型的能力,但我想展示我所能提供的所有情景数据,以获得最好的答案。

Sta*_*elp 3

如果您想自定义服务器使用的管道,请创建一个名为server.properties(或者您可以将其命名为任何您想要的名称)的文件。

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

在该 .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 行也将被忽略)

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

  4. 因此,为了清楚起见,您可以使用以下命令启动服务器(在包含所有 jar 的文件夹中运行):

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
Run Code Online (Sandbox Code Playgroud)

server.properties可能看起来像这样:

annotators = tokenize,ssplit,pos,lemma,ner,depparse
ner.model = /path/to/custom_model.ser.gz
parse.maxlen = 100
Run Code Online (Sandbox Code Playgroud)

举个例子...你应该将所有设置放入server.properties

  1. 我在之前的回答中对从Python访问StanfordCoreNLP服务器做了一些评论:

无法通过终端将 pycorenlp 用于 python3.5

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