当前位置: 首页 > 知识库问答 >
问题:

如何在python中自定义斯坦福NER?

谈琦
2023-03-14

我从这里学习了如何用Java定制Stanford 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()))

这段代码运行成功。然后,我下载了奥斯汀的样本。道具文件和jane-austen-emma-ch1。tsv和jane-austen-emma-ch2。tsv文件,并将其放入NerTragger library文件夹中的自定义文件夹中。我修改了jane-austen-emma-ch1。带有自定义实体标记的tsv文件。奥斯汀法典。道具文件有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个答案

轩辕天佑
2023-03-14

Stanford NER分类器是一个java程序。NLTK的模块只是java可执行文件的接口。因此,您可以完全按照之前的方式训练模型(或您在提供的链接中看到的方式)。

在您的代码中,您混淆了模型的训练和它用于分块新文本的用法。。prop文件包含培训新模型的说明;它本身并不是一个模型。以下是我的建议:

>

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

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

 类似资料:
  • 我正在注释和分析一系列文本文件。 pipeline.annotate方法每次读取文件时都会变得越来越慢。最终,我得到了一个OutOfMemoryError。 管道初始化一次: 然后,我使用相同的管道实例处理每个文件(如SO和斯坦福大学在其他地方推荐的)。 明确地说,我希望问题出在我的配置上。但是,我确信失速和内存问题发生在pipeline.annotate(file)方法上。 在处理每个文件后,我

  • 我在使用Stanford pipeline(CoreNLP的最后一个版本)解析BNC时遇到了一个问题。 解析器只是停留在这个句子中,它甚至不会抛出错误。句子在web界面中得到正确的解析。 我尝试了标记器的选项,但没有结果。 我添加了我正在使用的命令行:java[...]edu.stanford.nlp.pipeline.stanfordCorenlp-注释器tokenize,ssplit,pos,

  • 我假设我试图将输出转换成的格式是旧版本的CorenLP的默认输出。有什么方法可以得到所需格式的输出吗?

  • 试图运行示例,但我一直无法打开“english-left3words-distsim.tagger”文件可能丢失。文件没有丢失,目录指向模型jar文件的位置,路径:edu\stanford\nlp\模型\pos-tagger\english-left3word在jar文件中是正确的。 我使用3.7.0,安装从nuget在视觉工作室2015. 代码如下: 我确实在Stack上看到了一个类似的问题,他

  • 这是意料之中的行为吗?我在前面运行完整的管道吗?

  • 今天人工智能领域的研究者,几乎无人不谈深度学习。很多人甚至高喊出了「深度学习 = 人工智能」的口号。毋庸讳言,深度学习绝对不是人工智能领域的唯一解决方案,二者之间也无法画上等号。但说深度学习是当今乃至未来很长一段时间内引领人工智能发展的核心技术,则一点儿也不为过。