spaCy v2.0自定义管道与扩展
随着spaCy v2.0候选版本的临近,新功能中的核心改进之一是动态扩展系统,允许用户为Doc
、Span
和Token
对象注册自定义属性,并通过标准化API添加管道组件。
动态属性扩展
通过._
命名空间,开发者可安全添加属性而避免与内置功能冲突:
1
2
3
|
Doc.set_attribute("is_greeting", default=False)
doc = nlp(u"hello world")
doc._.is_greeting = True # 自定义属性赋值
|
自定义管道组件
管道由有序调用的函数列表构成,组件可以是类或简单函数:
1
2
3
4
5
|
def my_component(doc):
print(f"文本长度:{len(doc.text)}字符,{len(doc)}个词符")
return doc
nlp.add_pipe(my_component, name="print_length", last=True)
|
支持通过before
/after
参数精确控制组件位置。
实战案例:国家实体识别
以下组件通过REST API匹配国家名称,并附加首都、坐标等属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Countries:
def __init__(self, nlp):
self.matcher = PhraseMatcher(nlp.vocab)
Token.set_extension("is_country", default=False)
Token.set_extension("country_capital")
def __call__(self, doc):
matches = self.matcher(doc)
for _, start, end in matches:
span = Span(doc, start, end, label="GPE")
for token in span:
token._.is_country = True
token._.country_capital = self.countries[span.text]["capital"]
return doc
|
Emoji处理扩展包spacymoji
该组件合并Emoji序列为单一词符,并添加描述属性:
1
2
3
4
|
emoji = Emoji(nlp)
nlp.add_pipe(emoji, first=True)
doc = nlp(u"测试 😻")
assert doc[1]._.emoji_desc == "smiling cat heart eyes"
|
扩展生态展望
spaCy v2.0的模块化设计支持与PyTorch等库集成,鼓励社区开发专用组件(如指代消解、情感分析)。开发者可通过指南快速构建扩展。
资源