目前1.6.1版本支持的extractors如下:
Component | Requires | Model | Notes |
---|---|---|---|
CRFEntityExtractor | sklearn-crfsuite | conditional random field | 适合训练自定义实体的训练 |
SpacyEntityExtractor | spaCy | conditional averaged perceptron | 提供预训练实体 |
DucklingHTTPExtractor | running duckling | context-free grammar | 提供预训练实体 |
MitieEntityExtractor | MITIE | structured SVM | 适合训练自定义实体的训练 |
EntitySynonymMapper | existing entities | N/A | 进行同义词映射 |
如果pipeline包含一个或者一个以上的上述组件,训练模型的输出会包含被抽取出来的实体及其一些metadata(这些数据记录着哪个组件抽取出该实体)。processors
字段包含更改每个实体的组件的名称
注意:
value
字段可以与文本中出现的内容不同。如果使用同义词,像chinees这样的提取实体将被映射到一个标准值,例如chinese。
响应示例如下:
{
"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"
}
confidence置信度取决于CRF实体提取器(CRFEntityExtractor组件)。duckling 实体提取器总是返回1。SpacyEntityExtractor
提取器不提供此信息,返回null
。
几乎每个聊天机器人和语音应用程序都有一些自定义实体。餐厅助理应该把chinese
理解为一种美食,但对于语言学习助理来说,它的意义就大不相同了。给定一些训练数据,CRFEntityExtractor
组件可以学习任何语言的自定义实体。有关如何在训练数据中包含实体的详细信息,请参考训练数据格式。
spaCy为几种不同的语言提供了优秀的预训练命名实体识别器。可以在这个交互式演示中测试它们。官方不建议尝试使用spaCy来训练自己的NER,除非你有大量的数据并且知道你在做什么。注意,有些spaCy模型是高度大小写敏感的。
duckling library 在将如“next Thursday at 8pm”之类的表达式转换为实际的日期时间对象方面做了大量工作。例如:
"next Thursday at 8pm"
=> {"value":"2018-05-31T20:00:00.000+01:00"}
支持的语言列表可以在这里找到。该项目不仅可以抽取并标准化时间,还可以提取距离长度重量价格等一系列的数量单位,支持多国语言,包含中文。Duckling 可以处理“两个小时”、金钱数量、距离和序号等持续时间。幸运的是,有一个duckling docker容器可以使用,只需向上旋转并连接到Rasa NLU(参见DucklingHTTPExtractor)。
使用正则表达式可以帮助CRF模型学习识别实体。在训练数据集中提供的正则表达式列表,每个正则表达式提供一个CRFEntityExtractor
,提供的二值分类器,即正则表达式是否找到(1,表示找到;0表示没有找到)。
例如,德国街道的名字通常以strasse
结尾。将其添加为regex
,这将告诉模型注意以这种方式结尾的单词,并将很快学会将其与位置实体相关联。如果只是想精确地匹配正则表达式,可以在代码中这样做:作为接收到Rasa NLU响应后的后处理步骤。
如果想要将自定义特征(例如预先训练好的词嵌入)传递给CRFEntityExtractor
,那么可以在CRFEntityExtractor
之前将任何稠密featurizer
(ConveRTFeaturizer
除外)添加到管道中。请务必将相应的稠密featurizer
的“return_sequence”
设置为True。CRFEntityExtractor
会自动查找额外的稠密特征,并检查这些稠密特征是否是len(token)
可迭代,其中每个entry 都是一个向量。 如果检查失败,将显示一个警告。然而,CRFEntityExtractor
将继续训练,只是没有额外的自定义特性。如果存在稠密特征,CRFEntityExtractor
将把稠密特征传递给sklearn_crfsuite
,并将它们用于训练。