java - 加载自定义 NER 模型 Stanford CoreNLP

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

我已经使用斯坦福的“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

我现在想将我的 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'})

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

最佳答案

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

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

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

通常,您可以自定义服务器将在该 .properties 文件中使用的管道。例如,您还可以使用 annotators = tokenize,ssplit,pos,lemma,ner,parse etc...

行在其中设置注释器列表

更新以解决评论:

  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. 所以为了清楚起见,您可以使用此命令启动服务器(在包含所有 jars 的文件夹中运行):

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 服务器发表了一些评论:

cannot use pycorenlp for python3.5 through terminal

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

关于java - 加载自定义 NER 模型 Stanford CoreNLP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43942476/

相关文章:

java - 通过tomcat运行struts2时报错(错误包括 "java.util.concurrent.ThreadPoolExecutor.runWorker..."

java - 在电子邮件签名中插入图像?

python - 按不需要的字母顺序排列的元组

python - 在 Python 中如何将 `email.message.Message` 对象转换为 `email.message.EmailMessage` 对象

c# - 运算符优先级

java - 列数与第 1 行 java 的值数不匹配

python - 如何根据PANDAS中的groupby字段在for循环中写入to_excel动态文件名?

python - 从 Python 字符串中获取命名参数

python - pandas.crosstab 切片并添加总计

python - 用另一个数据帧的值替换 Pandas 数据帧的多个值的最快方法