繁体   English   中英

如何在python中自定义Stanford NER?

[英]How to customize Stanford NER in python?

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM