赞
踩
可以通过多种方式组合基于统计模型和基于规则的组件。基于规则的组件可以通过为特定词符(Tokens)预先标记词性、命名实体或句子边界来提高统计模型的准确性。统计模型通常会采用这些预设标记,来提高其他判定的准确性。也可以在统计模型之后使用基于规则的组件来更正常见错误。最后,基于规则的组件可以引用统计模型设置的属性,以实现更抽象的匹配逻辑。
当使用经过预训练的命名实体识别模型从文本中提取信息时,可能会发现预测的span仅包括你想要查找实体的一部分。发生这种问题,一种情况是,统计模型错误地预测了实体;另一种情况是,在原始训练语料库中定义实体类型的方法与应用程序所需要的不匹配。
例如,语料库spaCy的Chinese pipelines定义一个PERSON实体时,被训练为只匹配人名,没有包含像“先生”或“老师”这样的头衔。这样做是合理的,因为可以更容易地将实体类型解析回知识库。但是如果你的应用需要包括头衔的全名呢?
虽然可以通过使用更多包含头衔的span样本来更新模型,从而教给模型一个PERSON实体的新定义,但这可能不是最有效的方法。现有的模型是在200多万字的基础上训练的,因此为了完全改变实体类型的定义,你可能需要大量的训练样本。但是,如果已经有了预测的PERSON实体,则可以使用基于规则的方法来检查它们是否带有头衔,如果是,则将实体范围扩展一个Token。毕竟,本例中所有头衔的共同点是,它们总是出现在person实体之后的下一个Token中。
@Language.component("expand_person_entities") def expand_person_entities(doc): new_ents = [] for ent in doc.ents: # 当 ent是第一个token时,不检查头衔 if ent.label_ == "PERSON" and ent.start != 0: prev_token = doc[ent.start - 1] if prev_token.text in ("先生", "老师", "女士", "教授"): new_ent = Span(doc, ent.start - 1, ent.end, label=ent.label) new_ents.append(new_ent) else: new_ents.append(ent) else: new_ents.append(ent) doc.ents = new_ents return doc
给上面的函数传入一个Doc对象,修改doc.ents后返回doc。使用@Language.component装饰符,我们可以将它注册为一个管道组件,这样它可以在处理文本时自动运行。用nlp.add_pipe将其添加到当前管道。
完整示例代码如下:
# coding=utf-8
import spacy
from spacy.language import Language
from spacy.tokens import Span
nlp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。