python - 如何使用 spaCy 创建新实体并仅从关键字列表中学习
问题描述
我正在尝试使用spaCy创建一个带有物种名称列表的新实体分类“物种”,他可以在这里找到示例。
我从这个 spaCy 教程(这里的Github 代码)中找到了一个训练新实体类型的教程。但是,问题是,我不想为每个物种名称手动创建一个句子,因为这会非常耗时。
我在下面创建了训练数据,如下所示:
TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
....
]
我创建训练集的方式是:不提供完整的句子和匹配实体的位置,我只提供每个物种的名称,并且以编程方式生成开始和结束索引:
[( 0, 6, '物种' )]
[( 0, 9, '物种')]
下面的训练代码是我用来训练模型的。(从上面的超链接复制的代码)
nlp = spacy.blank('en') # create blank Language class
# Add entity recognizer to model if it's not in the pipeline
# nlp.create_pipe works for built-ins that are registered with spaCy
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner)
# otherwise, get it, so we can add labels to it
else:
ner = nlp.get_pipe('ner')
ner.add_label(LABEL) # add new entity label to entity recognizer
if model is None:
optimizer = nlp.begin_training()
else:
# Note that 'begin_training' initializes the models, so it'll zero out
# existing entity types.
optimizer = nlp.entity.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(n_iter):
random.shuffle(TRAIN_DATA)
losses = {}
for text, annotations in TRAIN_DATA:
nlp.update([text], [annotations], sgd=optimizer, drop=0.35, losses=losses)
print(losses)
我是 NLP 和 spaCy 的新手,如果我做得对,请告诉我。以及为什么我的尝试未能通过培训(当我运行它时,它会引发错误)。
[更新]
我只想将关键字提供给训练模型的原因是,理想情况下,我希望模型首先学习这些关键字,一旦它识别出包含关键字的上下文,它就会学习相关的上下文,因此,增强当前模型。
乍一看,它更像是正则表达式。但随着越来越多的数据输入,模型会不断学习,最终能够识别出原始训练集中以前不存在的新物种名称。
谢谢,凯蒂
解决方案
训练命名实体识别器以SPECIES
在您的文本中进行检测的优势在于,该模型不仅能够识别您的示例,还可以概括和识别上下文中的其他物种。如果您只想找到一组固定的术语而不是更多,那么更简单、基于规则的方法可能更适合您。您可以在此处找到相关示例和详细信息。
如果您确实希望模型在上下文中概括和识别您的实体类型,您还必须向它展示上下文中的实体示例。这就是您的训练示例目前的问题:您只显示模型单个单词,而不是包含单词的句子。为了获得良好的结果,您用来训练模型的数据需要尽可能接近您稍后要分析的数据。
虽然还有其他方法可以在没有或更少标记示例的情况下训练模型,但收集训练数据以训练 spaCy 模型的最直接策略是……标记训练数据。但是,您可以使用一些技巧来减轻这种痛苦:
从物种列表开始,然后使用
Matcher
或PhraseMatcher
在您的文档中查找它们。对于每个匹配项,您将获得一个Span
对象,因此您可以提取文本中 span 的开始和结束位置。这很容易让您自动创建一堆示例。您可以在此处找到更多详细信息。使用词向量来查找与您正在寻找的实体更相似的术语,因此您可以获得更多可以使用上述方法在文本中搜索的示例。我不确定 spaCy 的矢量模型对您的物种有何影响,因为这些术语非常具体。因此,如果您有大量包含物种的原始文本语料库,您可能需要训练自己的向量。
使用标签或数据注释工具。有像Brat这样的开源解决方案,或者,一旦您对注释和培训更加认真,您可能还想查看我们的注释工具Prodigy,这是一种与 spaCy 无缝集成的现代商业解决方案(免责声明:I我是 spaCy 的维护者之一)。
推荐阅读
- java - 使用 Rest Assured 验证 Json 对象中的值
- javascript - Twilio - 在 for 循环中生成访问令牌给了我相同的令牌
- javascript - 如何检查浏览器中的url是否已被iframe更改
- qt - QML 在运行时基于一个切换主题
- c - 在 C 中,如果输入字符串太大,如何产生错误?
- bootstrap-4 - Bootstrap4 日期时间选择器:未捕获的 TypeError:$(...).pickadate 不是函数
- c# - C# - 在后台检测 Keydown 和 KeyUp 事件
- docker - 无法从不同系统连接到 docker 容器 webapp
- c - 从一个结构复制到另一个结构
- php - 函数 Illuminate\Support\Manager::createDriver() 的参数太少,通过了 0