Rasa NLU(高级版)第二部分:实体识别

Rasa NLU(高级版)第二部分:实体识别_第1张图片
rasa_tutorial_depth_nlu_background.png

Rasa NLU 高级版第一部分:意图分类,介绍了 Rasa NLU 的不同意图分类组件和哪些组件最适合自己的个人上下文 AI 助手。了解用户意图仅仅是问题的一部分,从用户消息中提取相关信息(例如:日期、地址)同样重要。提取不同的所需信息的过程称为实体识别。根据你要提取的实体,Rasa NLU 提供了不同的组件,本文将详细介绍所有可用的选项和最佳实践,主要包括:

  • 实体提取组件用于哪种实体类型
  • 如何解决常见问题:模糊实体、提取地址、提取实体的映射

本文的目录结构:

  1. 实体提取
  2. 常见问题
  3. 总结

1. 实体提取

作为开源框架,Rasa NLU 特别重视完全可定制化,因此,Rasa NLU 为你提供了多个实体识别组件,它们可以满足你的自定义要求:

  • 使用 SpaCy 语言模型进行实体识别:ner_spacy
  • 使用 Facebook 的 Duckling 进行基于规则的实体识别:ner_http_duckling
  • 训练自定义实体提取器:ner_crf

1.1 SpaCy

spaCy 库提供了经过预训练的实体提取器。与词嵌入一样,仅支持某些语言。如果要支持你想要的语言,则推荐使用 ner_spacy 组件来识别像人名、地点、组织名称之类的实体。您可以在 spaCy 的交互式演示中尝试识别。

1.2 Duckling

Duckling 是 Facebook 基于规则开发的实体提取库。如果你要提取任何与数字有关的信息,例如:金额、日期、距离或持续时间等,那么它是个不错的选择。Duckling 是在 Haskell 中实现的,Python 库并未很好地支持它。为了与 Duckling 通信,Rasa NLU 使用了 Duckling 的 REST 接口。因此,当你将 ner_duckling_http 组件添加 NLU pipeline 中时,你必须运行 Duckling 服务器。启动服务器的最简单方法是使用 docker 映像 rasa/rasa_duckling 并运行服务器docker run -p 8000:8000 rasa/rasa_duckling

1.3 NER_CRF

ner_spacyner_duckling 都不要求标注任何训练数据,因为它们使用的是预训练的分类器(spaCy)或基于规则的方法(Duckling)。ner_crf 组件训练一个条件随机场,然后将其用于标记用户消息中的实体。 此组件是 NLU pipeline 中的一部分并且它是从头进行训练的,因此你必须标注训练数据。以下是如何执行此操作的示例:

## intent:check_balance
- what is my balance 
- how much do I have on my [savings](source_account) 

在不能使用基于规则或者预训练组件时,可以使用 ner_crf。由于此组件是从头开始训练的,因此请注意如何标注训练数据:

  • 为每个实体提供足够多的示例(>20)以便条件随机场可以泛化并提取数据
  • 标注训练数据中的所有示例(即使该实体可能与意图无关)

1.4 正则表达式/查找表

为了支持 ner_crf 组件的实体提取,您可以使用正则表达式或查找表。正则表达式匹配某些硬编码模式,例如:[0-9] {5} 表示将匹配 5 位的邮政编码。当你的实体有一组预定义的值时,查找表就很有用。例如:实体 国家 只能具有 195 个不同的值。要使用正则表达式或查找表,在你的 pipeline 中,将 intent_entity_featurizer_regex 组件添加在 ner_crf 组件的前面,然后标注你的训练数据。

## regex:zipcode
- [0-9]{5}

## lookup:currencies   
- Yen
- USD
- Euro

## lookup:additional_currencies  
path/to/currencies.txt

正则表达式和查找表向 ner_crf 添加了其他功能,用来标记单词是否被正则表达式或查找表匹配。由于它是许多特性中的一个,即使 ner_crf 组件已匹配,但它也可以忽略实体,但是总的来说,ner_crf 对这些特性产生了偏见。注意,这也可以阻止条件随机场的泛化:如果训练数据中的所有实体示例都由正则表达式匹配,则条件随机场将学习专注于正则表达式功能,而忽略其他功能。如果你随后收到一条消息,其中包含与正则表达式 ner_crf 不匹配的某个实体,那么 ner_crf 可能无法检测到它。特别对于查找表的使用会使 ner_crf 易于过拟合。

如果你还是不太确定哪个实体提取组件最适合你的上下文 AI 助手,请使用以下流程图快速做出决策:

Rasa NLU(高级版)第二部分:实体识别_第2张图片
rasa_tutorial_depth_nlu_01.png

2. 常见问题

2.1 实体未泛化

如果你提取的实体未泛化到该实体看不见的值,则可能有两个原因:缺少训练数据或 ner_crf 组件过拟合。如果你大量使用正则表达式或查找表功能,请尝试在没有它们的情况下训练模型,以查看它们是否使模型过拟合。否则,请为你的实体添加更多示例,以供模型学习。

2.2 提取地址

如果要提取地址,我们建议使用带有查找表功能的 ner_crf 组件。你可以从诸如openaddresses.io中生成查找表,并使用生成的城市和国家/地区列表来支持 ner_crf 的实体提取过程。

2.3 将提取的实体映射到不同的值

有时,提取的实体对于相同的值具有不同的表示形式。例如:如果你要提取国家/地区,例如:中国,中华人民共和国,则都指同一国家/地区。如果要将它们映射到一个指定值,则可以使用组件 ner_synonyms 将提取的实体映射到不同的值。在训练数据中,你可以内联指定同义词

## intent:check_balance
- how much do I have on my [savings account](source_account:savings) 

或作为单独的部分:

## synonym:savings   
- pink pig

3. 总结

本文介绍了我们的最佳实践和建议,以充分利用 Rasa NLU 的不同实体提取组件。通过组合预训练提取器,基于规则的方法以及在需要的地方训练自己的提取器,你可以使用强大的工具集来提取用户传递给上下文 AI 助手的信息。


作者:关于我

备注:转载请注明出处。

如发现错误,欢迎留言指正。

你可能感兴趣的:(Rasa NLU(高级版)第二部分:实体识别)