【问题标题】:How to customize Stanford NER in python?如何在 python 中自定义斯坦福 NER?
【发布时间】:2017-01-18 14:38:41
【问题描述】:

我从这里学习了如何在 Java 中自定义斯坦福 NER(命名实体识别器):

http://nlp.stanford.edu/software/crf-faq.shtml#a

但是我正在使用 Python 开发我的项目,在这里我需要使用一些自定义实体来训练我的分类器。

我搜索了很多解决方案,但找不到任何解决方案。任何的想法?如果不可能,是否有任何其他方法可以使用自定义实体训练我的分类器,即使用 nltk 或 python 中的其他方法?

编辑:代码添加 这就是我设置和测试运行良好的斯坦福 NER 的方法:

from nltk.tag.stanford import StanfordNERTagger
path_to_model = "C:\..\stanford-ner-2016-10-31\classifiers\english.all.3class.distsim.crf.ser"
path_to_jar = "C:\..\stanford-ner-2016-10-31\stanford-ner.jar"
nertagger=StanfordNERTagger(path_to_model, path_to_jar)
query="Show  me the best eye doctor in Munich"
print(nertagger.tag(query.split()))

此代码成功运行。然后,我下载了示例 austen.prop 文件以及 jane-austen-emma-ch1.tsv 和 jane-austen-emma-ch2.tsv 文件,并将其放在 NerTragger 库文件夹中的自定义文件夹中。我用我的自定义实体标签修改了 jane-austen-emma-ch1.tsv 文件。 austen.prop 文件的代码有指向 jane-austen-emma-ch1.tsv 文件的链接。现在,我将上面的代码修改如下,但它不起作用:

from nltk.tag.stanford import StanfordNERTagger
path_to_model = "C:\..\stanford-ner-2016-10-31\custom/austen.prop"
path_to_jar = "C:\..\stanford-ner-2016-10-31\stanford-ner.jar"
nertagger=StanfordNERTagger(path_to_model, path_to_jar)
query="Show  me the best eye doctor in Munich"
print(nertagger.tag(query.split()))

但是这段代码会产生以下错误:

Exception in thread "main" edu.stanford.nlp.io.RuntimeIOException: java.io.StreamCorruptedException: invalid stream header: 236C6F63
    raise OSError('Java command failed : ' + str(cmd))
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifierNoExceptions(AbstractSequenceClassifier.java:1507)
    at edu.stanford.nlp.ie.crf.CRFClassifier.main(CRFClassifier.java:3017)
Caused by: java.io.StreamCorruptedException: invalid stream header: 236C6F63
OSError: Java command failed : ['C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java.exe', '-mx1000m', '-cp', 'C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0-javadoc.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0-sources.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\joda-time.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\jollyday-0.4.9.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\stanford-ner-resources.jar', 'edu.stanford.nlp.ie.crf.CRFClassifier', '-loadClassifier', 'C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31/custom/austen.prop', '-textFile', 'C:\\Users\\HP\\AppData\\Local\\Temp\\tmppk8_741f', '-outputFormat', 'slashTags', '-tokenizerFactory', 'edu.stanford.nlp.process.WhitespaceTokenizer', '-tokenizerOptions', '"tokenizeNLs=false"', '-encoding', 'utf8']
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301)
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1462)
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1494)
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifierNoExceptions(AbstractSequenceClassifier.java:1505)
    ... 1 more

【问题讨论】:

  • 很明显,问题在于对训练和使用模型之间的区别的混淆。请查看我的更新答案。
  • @Newbie23,你能告诉我训练我自己的NER模型的整个过程/步骤吗?请帮我。我对此很陌生。

标签: python nlp nltk stanford-nlp


【解决方案1】:

Stanford NER 分类器是一个 java 程序。 NLTK 的模块只是 java 可执行文件的接口。因此,您可以像以前一样训练模型(或者在您提供的链接中看到的那样)。

在您的代码中,您将模型的训练与其用于分块新文本混淆了。 .prop 文件包含训练新模型的说明;它本身并不是一个模型。这是我推荐的:

  1. 暂时忘记 python/nltk,并从 Windows 命令行(CMD 提示符或其他)训练一个新模型:按照您在问题中提到的操作方法,生成序列化模型(@ 987654323@ 文件)命名为 ner-model.ser.gz 或您决定从您的 .prop 文件中调用它的任何名称。

  2. 在您的python代码中,将path_to_model变量设置为指向您在步骤1中生成的.ser文件。

如果你真的想从 python 控制训练过程,你可以使用subprocess 模块来发出适当的命令行命令。但听起来你并不真的需要这个;只需尝试了解这些步骤的作用,以便您可以正确执行它们。

【讨论】:

  • 我尝试像在 NER 中一样设置分类器。但是,当我按照教程中的建议使用属性文件而不是 crf.ser.gz 文件时,它会显示 Java 命令失败错误。 st = StanfordNERTagger('C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31/custom/austen.prop','C:/Users /HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31/stanford-ner.jar') query="给我看看慕尼黑最好的眼科医生" print( st.tag(query.split()))
  • 你能帮我解决这个问题吗?
  • 请编辑你的问题,解释你做了什么,以及你遇到的问题。包括完整的错误跟踪以及您在评论中显示的命令。那么我或其他人也许可以提供帮助。
  • 基本上,是的。据我所知,没有“jave 命令行”:您可以从 Windows CMD 提示符或通过您的 IDE 运行它。 (Python 与此无关)。关键是你必须执行这样的命令来创建.ser文件,然后使用python中的.ser文件(实际上是在后台启动java程序)来标记。
  • 欢迎。很高兴我能帮上忙。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多