48

我正在尝试使用 NLTK 从我的文本中提取命名实体。我发现 NLTK NER 对我的目的来说不是很准确,我也想添加更多我自己的标签。我一直在尝试找到一种方法来训练我自己的 NER,但我似乎无法找到合适的资源。我有几个关于 NLTK 的问题-

  1. 我可以使用自己的数据在 NLTK 中训练命名实体识别器吗?
  2. 如果我可以使用自己的数据进行训练,named_entity.py 是要修改的文件吗?
  3. 输入文件格式是否必须在 IOB 中,例如。埃里克 NNP B 人?
  4. 是否有任何资源 - 除了我可以使用的 nltk 食谱和带有 python 的 nlp 之外?

我非常感谢这方面的帮助

4

6 回答 6

24

您是否致力于使用 NLTK/Python?我遇到了和你一样的问题,并且使用斯坦福的命名实体识别器得到了更好的结果:http: //nlp.stanford.edu/software/CRF-NER.shtml。使用您自己的数据训练分类器的过程在 FAQ 中有详细记录。

如果您真的需要使用 NLTK,我会在邮件列表中获取其他用户的一些建议:http ://groups.google.com/group/nltk-users ://groups.google.com/group/nltk-users 。

希望这可以帮助!

于 2012-07-09T16:16:25.660 回答
14

您可以轻松地将斯坦福 NER 与 nltk 一起使用。python脚本就像

from nltk.tag.stanford import NERTagger
import os
java_path = "/Java/jdk1.8.0_45/bin/java.exe"
os.environ['JAVAHOME'] = java_path
st = NERTagger('../ner-model.ser.gz','../stanford-ner.jar')
tagging = st.tag(text.split())   

要训​​练您自己的数据并创建模型,您可以参考斯坦福 NER 常见问题解答的第一个问题。

链接是http://nlp.stanford.edu/software/crf-faq.shtml

于 2015-11-25T05:45:23.637 回答
1

我也有这个问题,但我设法解决了。您可以使用自己的训练数据。我在我的github 存储库中记录了这方面的主要要求/步骤。

我使用了 NLTK-trainer,所以基本上你必须以正确的格式(token NNP B-tag)获取训练数据,然后运行训练脚本。检查我的存储库以获取更多信息。

于 2017-10-02T15:46:54.937 回答
1

nltk.chunk.named_entity模块中有一些函数可以训练 NER 标注器。但是,它们是专门为 ACE 语料库编写的,并没有完全清理干净,因此需要编写自己的训练程序作为参考。

还有两个相对较新的在线指南 ( 1 2 ) 详细介绍了使用 NLTK 训练 GMB 语料库的过程。

但是,正如上面答案中提到的,现在有许多工具可用,如果需要简化培训过程,真的不需要求助于 NLTK。CoreNLP 和 spaCy 等工具包做得更好。由于使用 NLTK 与从头开始编写自己的训练代码没有太大区别,因此这样做没有太大的价值。NLTK 和 OpenNLP 在某种程度上可以被视为属于 NLP 最近进展爆炸之前的过去时代。

于 2018-07-29T22:24:03.680 回答
0
  1. 是否有任何资源 - 除了我可以使用的 nltk 食谱和带有 python 的 nlp 之外?

您可以考虑使用spaCy为 NER 任务训练您自己的自定义数据。这是该线程中的一个示例,用于在自定义训练集上训练模型以检测新实体ANIMAL。代码已修复和更新,以便于阅读。

import random
import spacy
from spacy.training import Example

LABEL = 'ANIMAL'
TRAIN_DATA = [
    ("Horses are too tall and they pretend to care about your feelings", {'entities': [(0, 6, LABEL)]}),
    ("Do they bite?", {'entities': []}),
    ("horses are too tall and they pretend to care about your feelings", {'entities': [(0, 6, LABEL)]}),
    ("horses pretend to care about your feelings", {'entities': [(0, 6, LABEL)]}),
    ("they pretend to care about your feelings, those horses", {'entities': [(48, 54, LABEL)]}),
    ("horses?", {'entities': [(0, 6, LABEL)]})
]
nlp = spacy.load('en_core_web_sm')  # load existing spaCy model
ner = nlp.get_pipe('ner')
ner.add_label(LABEL)

optimizer = nlp.create_optimizer()

# get names of other pipes to disable them during training
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "ner"]
with nlp.disable_pipes(*other_pipes):  # only train NER
    for itn in range(20):
        random.shuffle(TRAIN_DATA)
        losses = {}
        for text, annotations in TRAIN_DATA:
            doc = nlp.make_doc(text)
            example = Example.from_dict(doc, annotations)
            nlp.update([example], drop=0.35, sgd=optimizer, losses=losses)
        print(losses)

# test the trained model
test_text = 'Do you like horses?'
doc = nlp(test_text)
print("Entities in '%s'" % test_text)
for ent in doc.ents:
    print(ent.label_, " -- ", ent.text)

以下是输出:

{'ner': 9.60289144264557}
{'ner': 8.875474230820478}
{'ner': 6.370401408220459}
{'ner': 6.687456469517201}
... 
{'ner': 1.3796682589133492e-05}
{'ner': 1.7709562613218738e-05}

Entities in 'Do you like horses?'
ANIMAL  --  horses
于 2021-02-25T21:58:27.373 回答
0

要完成@Thang M. Pham 的答案,您需要在训练之前标记您的数据。为此,您可以使用spacy-annotator

这是另一个答案的示例: Train Spacy NER on Indian Names

于 2021-03-06T16:09:15.747 回答