如何在python中自定义Stanford NER?

时间:2017-01-18 14:38:41

标签: python nlp nltk stanford-nlp

我从这里学习了如何用Java自定义Stanford NER(命名实体识别器):

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

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

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

编辑:代码添加 这就是我设置和测试Stanford 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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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