我在理解rasa nlu中的训练数据时遇到了困难。假设我想创建一些训练数据,内容是关于某人告知他人可以购买的动物。为了清晰起见,我将使用markdown格式:
假设用户是在回答一个问题:
“你想买什么样的动物?”
表达想要购买某物的不同方式是有限的。请看下面的例子:
##intent:inform- [cat](animal)- buy [cat](animal)- 我想要买一只[cat](animal)
我需要为每一种我打算处理的动物重复这个过程吗?就像下面这样?
##intent:inform- [cat](animal)- [dog](animal)- [parrot](animal)- buy [cat](animal)- buy [dog](animal)- buy [parrot](animal)- 我想要买一只[cat](animal)- 我想要买一只[dog](animal)- 我想要买一只[parrot](animal)
另外,我注意到在rasa的餐厅机器人中,他们有时会重复同一个例子,有时甚至重复七次,就像下面这样:
##intent:inform- [cat](animal)- [cat](animal)- [cat](animal)- [cat](animal)- [cat](animal)- buy [cat](animal)- 我想要买一只[cat](animal)
为什么这是必要的?这对理解有什么影响?在同一个位置重复同一个单词多次,为什么会表明这是一个合适的回应,特别是当你有像下面这样的情况时,不同的值在同一个实体中重复了相同次数?
##intent:inform- [cat](animal)- [cat](animal)- [cat](animal)- [cat](animal)- [cat](animal)- buy [cat](animal)- 我想要买一只[cat](animal)- [dog](animal)- [dog](animal)- [dog](animal)- [dog](animal)- [dog](animal)- buy [dog](animal)- 我想要买一只[dog](animal)
谢谢,任何建议都非常受欢迎。
回答:
表达想要购买某物的不同方式是有限的。
你可能会感到惊讶:
- 我可以买一只狗吗?
- 我想买一只狗。
- 我真的想要一只狗。
- 如果我拥有一只狗会很棒。
- 我在找一只宠物,可能是一只狗。
- 购买狗
- 领养狗
- 得到一只狗
- 带一只狗回家
我相信这个列表还会继续增加很多例子。尽管如此,Rasa NLU应该能够从少数几个例子中学习和适应。有一些例外,例如adopt
可能与buy
没有很强的关联性,因此作为一个例子可能很重要。
我需要为每一种我打算处理的动物重复这个过程吗?就像下面这样?
不需要这样做。每种动物的值都是一个实体,Rasa默认使用CRF进行实体识别,这就是你在这里讨论的内容。CRF更多的是关于句子的结构而不是单词的值。你可以在文档和代码中看到CRF查看的特征:
# 可用的特征包括: # ``low``, ``title``, ``suffix5``, ``suffix3``, ``suffix2``, # ``suffix1``, ``pos``, ``pos2``, ``prefix5``, ``prefix2``, # ``bias``, ``upper`` 和 ``digit`` features: [["low", "title"], ["bias", "suffix3"], ["upper", "pos", "pos2"]]
尽管如此,使用不同值的实体可以是一种获取额外训练数据的好方法。你可以使用像chatito这样的工具从模式中生成训练数据。但要注意重复模式,因为你可能会过拟合模型,使其无法超越你训练的模式进行泛化。
他们有时会重复同一个例子
你在Rasa数据集中看到了这个吗?这是默认的餐厅机器人训练数据,我没有看到任何重复。
重复一个句子会强化模型对格式/单词的重要性,这是过采样的一种形式。如果你有非常少的训练数据或高度不平衡的训练数据,这可能是一件好事。如果你想处理很多不同的购买宠物的方式,这可能是一件坏事,因为它可能会过拟合模型,正如我上面提到的。