检测 rasa_nlu 中的同义词

Detecting synonyms in rasa_nlu

我在 macOS High Sierra 上安装了 rasa_nlu、运行 Python 3.6.5。我能够使示例教程正常工作。我 运行 在使用同义词时遇到了麻烦。

这是我的培训文件的相关部分,first-model.md

## intent:select
- what is the [max](operator) rating?

## synonym:max
- best
- highest
- maximum

现在,rasa_nlu 可以正确检测 what is the max rating?

等问题的意图和实体
{'intent': {'name': 'select', 'confidence': 0.9542820453643799},
 'entities': [{'start': 12,
   'end': 15,
   'value': 'max',
   'entity': 'operator',
   'confidence': 0.8146240434922525,
   'extractor': 'ner_crf'}],
 'intent_ranking': [{'name': 'select', 'confidence': 0.9542820453643799},
  {'name': 'identity', 'confidence': 0.036332450807094574}],
 'text': 'what is the max rating?'}

但是,当我在问题中使用同义词时,它没有检测到实体。例如,what is the best rating?

{'intent': {'name': 'select', 'confidence': 0.9382177591323853},
 'entities': [],
 'intent_ranking': [{'name': 'select', 'confidence': 0.9382177591323853},
  {'name': 'identity', 'confidence': 0.10226328670978546}],
 'text': 'what is the best rating?'}

没有同义词的骰子。我用 spacy_sklearntensorflow_embedding 都试过了,看到了类似的结果。

非常感谢任何指点。

干杯。

更新: 根据下面@Caleb 的建议,我将培训更新为:

## intent:select
- what is the [max](operator) rating?
- what is the [highest](operator:max) rating?
- what is the [maximum](operator:max) rating?
- what is the [best](operator:max) rating?

虽然改善了情况,但并没有完全解决问题。现在系统returns将每个同义词(例如highestmaximumbest)作为实体值而不是实际值(max)。例如,如果我询问 what is the best rating?,我希望 max 作为实体值,而不是 best。不幸的是,系统 returns best.

{'intent': {'name': 'select', 'confidence': 0.9736428260803223},
 'entities': [{'start': 12,
   'end': 16,
   'value': 'best',
   'entity': 'operator',
   'confidence': 0.9105035376516767,
   'extractor': 'ner_crf'}],
 'intent_ranking': [{'name': 'select', 'confidence': 0.9736428260803223},
  {'name': 'identity', 'confidence': 0.0}],
 'text': 'what is the best rating?'}

请参阅文档 this page 中的注释。

Please note that adding synonyms using the above format does not improve the model’s classification of those entities. Entities must be properly classified before they can be replaced with the synonym value.

这意味着您需要在训练数据中包含其中一些其他词,以便实体分类器学会将这些词正确分类为该实体。一旦单词被正确分类,就可以使用同义词并将其规范化。

也可以根据单个意图示例和 entities/synonyms 列表使用 chatito 等工具。但要小心,因为如果您为单个句子结构使用太多示例,使用这样的模板可能会导致过度拟合。

我偶然发现了适合我的用例的组合。

  1. 对训练数据使用 json 格式而不是 markdown(见下文示例)
  2. 使用 spacy_sklearn 管道而不是 tensorflow_embedding(参见下面的示例)

我确信对于为什么该组合有效而其他组合无效的原因我确信有一个很好的解释,但我还没有掌握它。或者,也许需要其他配置才能使其他组合正常工作。

干杯。

这是训练数据的 JSON 版本。

{
    "rasa_nlu_data": {
        "common_examples": [
              {
                "text": "what is the best rating?",
                "intent": "select",
                "entities": [
                  {
                    "start": 12,
                    "end": 16,
                    "value": "max",
                    "entity": "operator"
                  }
                ]
              },
              {
                "text": "what is the max rating?",
                "intent": "select",
                "entities": [
                  {
                    "start": 12,
                    "end": 15,
                    "value": "max",
                    "entity": "operator"
                  }
                ]
              },
              {
                "text": "what is the highest rating?",
                "intent": "select",
                "entities": [
                  {
                    "start": 12,
                    "end": 19,
                    "value": "max",
                    "entity": "operator"
                  }
                ]
              }
        ],
        "regex_features" : [],
        "entity_synonyms": [
            {
                "entity": "operator",
                "value": "max",
                "synonyms": ["maximum", "most", "highest", "biggest", "best"]
            }
        ]
    }
}

这是我使用的管道(感谢@Caleb 建议也包含它)。

language: "en_core_web_md"
pipeline: "spacy_sklearn"