Rasa 入门教程 NLU 系列包括六个部分,前面介绍了Rasa 入门教程 NLU 系列(四),本文主要介绍 Rasa 框架中的 NLU 系列中的第五部分:实体提取。
本文的目录结构:
- 简介
- 自定义实体
- 提取地点、日期、人名、组织机构
- 日期、金额、时间段、距离、序号
- 正则表达式 Regex
- 将自定义特征传给
CRFEntityExtractor
1. 简介
以下是可用的实体提取器及其用途的概述:
Component | Requires | Model | Notes |
---|---|---|---|
CRFEntityExtractor |
sklearn-crfsuite | conditional random field | 适用于训练自定义实体 |
SpacyEntityExtractor |
spaCy | 平均感知机 | 提供预训练实体 |
DucklingHTTPExtractor |
running duckling | 上下文无关文法 | 提供预训练实体 |
MitieEntityExtractor |
MITIE | 结构化支持向量机 | 适用于训练自定义实体 |
EntitySynonymMapper |
existing entities | N/A | 映射已知的同义词 |
如果你的 pipeline 包括了上述一个或多个组件,那么经过训练的模型的输出将包括提取的实体以及有关哪个组件提取了它们的一些元数据信息。processors
字段包含更改每个实体的组件名。以下是一个示例:
{
"text": "show me chinese restaurants",
"intent": "restaurant_search",
"entities": [
{
"start": 8,
"end": 15,
"value": "chinese",
"entity": "cuisine",
"extractor": "CRFEntityExtractor",
"confidence": 0.854,
"processors": []
}
]
}
有些提取器可能包含其他信息,比如 duckling
:
{
"additional_info":{
"grain":"day",
"type":"value",
"value":"2018-06-21T00:00:00.000-07:00",
"values":[
{
"grain":"day",
"type":"value",
"value":"2018-06-21T00:00:00.000-07:00"
}
]
},
"confidence":1.0,
"end":5,
"entity":"time",
"extractor":"DucklingHTTPExtractor",
"start":0,
"text":"today",
"value":"2018-06-21T00:00:00.000-07:00"
}
2. 自定义实体
几乎每个对话机器人和语音 APP 都会有一些自定义的实体。一个餐饮助手应该将 chinese
理解为 cuisine
,但是对于一个语言学习助手来说,意义就大不相同了。CRFEntityExtractor
组件可以根据训练数据集,使用任何语言学习自定义实体。有关如何在训练数据中包括实体,请参考Rasa 入门教程 NLU 系列(二)。
3. 提取地点、日期、人名、组织机构
spaCy 拥有优秀的预训练命名实体识别器,应用于几种不同的语言上。你可以在交互式演示中对其进行测试。我们不建议你使用 spaCy 来训练自己的 NER,除非你有大量数据并且知道自己在做什么。有些 spaCy 模型是对大小写敏感的。
4. 日期、金额、时间段、距离、序号
duckling
库将实际的日期对象转换成你可以使用的表达方式,比如:“下周四晚上 8 点”被转换成如下:
"next Thursday at 8pm"
=> {"value":"2019-11-29T20:00:00.000+01:00"}
这里列出了支持的语言,Duckling 也可以处理诸如“两个小时”之类的时间段、金额、距离和序号。有幸的是,有个 duckling 的 docker 容器可供使用,你只需要注册并连接到 Rasa NLU上(请参阅 DucklingHTTPExtractor)。
5. 正则表达式 Regex
你可以使用正则表达式来帮助 CRF 模型学习识别实体,在你的训练集中,你可以提供一个正则表达式列表,每个正则表达式都提供一个带有 0 和 1 的二进制特征的 CRFEntityExtractor
,如果找到了则为 1,否则为 0。
例如:德国的街道的名字通常以 strasse
结尾,通过添加正则表达式,我们告诉模型注意以这种方式结尾的单词,并迅速学习将其与位置实体相关联。
如果你只想精准匹配正则表达式,你可以在收到 Rasa NLU 模型响应后,在代码中执行此操作,作为后处理步骤。
6. 将自定义特征传给 CRFEntityExtractor
如果你想要将自定义特征传给 CRFEntityExtractor
,可以通过创建一个 Featurizer
来提供 ner_features
功能。如果这样做,ner_features
应为 len(tokens)
的可迭代项,其中每个实体都是一个向量。如果在配置中的数组 features
里的 CRFEntityExtractor
找到了 ner_features
,它将把向量传给 CRFEntityExtractor
。你可以使用:ref: SpacyFeaturizer
这个简单的例子将词向量作为特征传给 CRFEntityExtractor
。
作者:关于我
备注:转载请注明出处。
如发现错误,欢迎留言指正。