python - 如何用Python定制Stanford NER?

标签 python nlp nltk stanford-nlp

我从这里学会了如何用 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

最佳答案

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

在您的代码中,您混淆了模型的训练和用于分块新文本的情况。 .prop文件包含训练新模型的指令;它本身不是一个模型。这是我的建议:

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

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

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

关于python - 如何用Python定制Stanford NER?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722217/

相关文章:

python - 如何在基于 Django websockets 的实时聊天机器人中向 PostgreSQL 添加数据?

r - 在 R 中查找 "near duplicates"字符串

python - 使用 nltk 计算 pandas Dataframe 中最流行的 'two words combination' 希伯来语单词

python - 如何在Python中计算2个单词的距离

python - 如何在 Python 中计算给定 m 和 l 的关联勒让德多项式

python - modelformset_factory 和 csrf token 丢失或不正确

python - Qt Designer实时显示python脚本的输出

java - 在斯坦福解析器中查找名词和动词

language-agnostic - 有趣的NLP/机器学习风格项目——分析隐私政策

python - nltk 'unknown url' 错误