Запрос синтаксического анализа Rasa nlu дает неправильный результат намерения

Версия Rasa NLU (например, 0.7.3): 0.10.0a6

Используемый бэкэнд / конвейер (mitie, spacy_sklearn, ...): ["nlp_spacy", "tokenizer_spacy", "intent_featurizer_spacy","ner_crf", "ner_synonyms", "intent_classifier_sklearn","ner_spacy"]

Операционная система (windows, osx, ...): Windows server 2012 R2

Проблема: я установил версию Rasa nlu 0.10.0a6. Мой файл confi_spacy выглядит так.

{

"project":"Project",
"pipeline" : ["nlp_spacy", "tokenizer_spacy", "intent_featurizer_spacy","ner_crf", "ner_synonyms", "intent_classifier_sklearn","ner_spacy"],
"path" : "./projects",

"cors_origins":["*"],
"data" : "./data/examples/rasa/People.json"
}

и мой файл данных выглядит так.

{
  "rasa_nlu_data": {
    "regex_features": [
      {
        "name": "zipcode",
        "pattern": "[0-9]{5}"
      }
    ],
    "entity_synonyms": [
      {
        "value": "chinese",
        "synonyms": ["Chinese", "Chines", "chines"]
      },
      {
        "value": "vegetarian",
        "synonyms": ["veggie", "vegg"]
      }
    ],
    "common_examples": [
      {
        "text": "hey", 
        "intent": "greet", 
        "entities": []
      }, 
      {
        "text": "howdy", 
        "intent": "greet", 
        "entities": []
      }, 
      {
        "text": "hey there",
        "intent": "greet", 
        "entities": []
      }, 
      {
        "text": "hello", 
        "intent": "greet", 
        "entities": []
      }, 
      {
        "text": "hi", 
        "intent": "greet", 
        "entities": []
      },
      {
        "text": "good morning",
        "intent": "greet",
        "entities": []
      },
      {
        "text": "good evening",
        "intent": "greet",
        "entities": []
      },
      {
        "text": "dear sir",
        "intent": "greet",
        "entities": []
      },
      {
        "text": "yes", 
        "intent": "affirm", 
        "entities": []
      }, 
      {
        "text": "yep", 
        "intent": "affirm", 
        "entities": []
      }, 
      {
        "text": "yeah", 
        "intent": "affirm", 
        "entities": []
      },
      {
        "text": "indeed",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "that's right",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "ok",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "great",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "right, thank you",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "correct",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "great choice",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "sounds really good",
        "intent": "affirm",
        "entities": []
      },
      {
        "text": "i'm looking for a place to eat",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "I want to grab lunch",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "I am searching for a dinner spot",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "i'm looking for a place in the north of town",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 31,
            "end": 36,
            "value": "north",
            "entity": "location"
          }
        ]
      },
      {
        "text": "show me chinese restaurants",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 8,
            "end": 15,
            "value": "chinese",
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "show me chines restaurants",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 8,
            "end": 14,
            "value": "chinese",
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "show me a mexican place in the centre", 
        "intent": "restaurant_search", 
        "entities": [
          {
            "start": 31, 
            "end": 37, 
            "value": "centre", 
            "entity": "location"
          }, 
          {
            "start": 10, 
            "end": 17, 
            "value": "mexican", 
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "i am looking for an indian spot called olaolaolaolaolaola",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 20,
            "end": 26,
            "value": "indian",
            "entity": "cuisine"
          }
        ]
      },     {
        "text": "search for restaurants",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "anywhere in the west",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 16,
            "end": 20,
            "value": "west",
            "entity": "location"
          }
        ]
      },
      {
        "text": "anywhere near 18328",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 14,
            "end": 19,
            "value": "18328",
            "entity": "location"
          }
        ]
      },
      {
        "text": "I am looking for asian fusion food",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 17,
            "end": 29,
            "value": "asian fusion",
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "I am looking a restaurant in 29432",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 29,
            "end": 34,
            "value": "29432",
            "entity": "location"
          }
        ]
      },
      {
        "text": "I am looking for mexican indian fusion",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 17,
            "end": 38,
            "value": "mexican indian fusion",
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "central indian restaurant",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 0,
            "end": 7,
            "value": "central",
            "entity": "location"
          },
          {
            "start": 8,
            "end": 14,
            "value": "indian",
            "entity": "cuisine"
          }
        ]
      },
      {
        "text": "bye", 
        "intent": "goodbye", 
        "entities": []
      }, 
      {
        "text": "goodbye", 
        "intent": "goodbye", 
        "entities": []
      }, 
      {
        "text": "good bye", 
        "intent": "goodbye", 
        "entities": []
      }, 
      {
        "text": "stop", 
        "intent": "goodbye", 
        "entities": []
      }, 
      {
        "text": "end", 
        "intent": "goodbye", 
        "entities": []
      },
      {
        "text": "farewell",
        "intent": "goodbye",
        "entities": []
      },
      {
        "text": "Bye bye",
        "intent": "goodbye",
        "entities": []
      },
      {
        "text": "have a good one",
        "intent": "goodbye",
        "entities": []
      }
    ]
  }
}

Используя приведенные выше данные конфигурации и json, я обучил Rasa, используя конечную точку ниже HTTP

/ train? project = Проект

После обучения данные находятся в одной папке Project, созданной с обученными данными.

И я запустил сервер Rasa с помощью команды ниже.

python -m rasa_nlu.server -c config_spacy.json

Теперь сервер запущен с портом 5000.

Когда я могу выполнить конечную точку синтаксического анализа '/ parse? Q = hello & project = Project', я получаю ответ ниже.

{
  "intent": {
    "name": "greet",
    "confidence": 0.6409561289105246
  },
  "entities": [],
  "intent_ranking": [
    {
      "name": "greet",
      "confidence": 0.6409561289105246
    },
    {
      "name": "goodbye",
      "confidence": 0.16788352870824252
    },
    {
      "name": "restaurant_search",
      "confidence": 0.10908268742176423
    },
    {
      "name": "affirm",
      "confidence": 0.08207765495946878
    }
  ],
  "text": "hello"
}

Когда я могу выполнить конечную точку синтаксического анализа '/ parse? Q = Great choice & project = Project', я получаю ответ ниже.

{
  "intent": {
    "name": "affirm",
    "confidence": 0.7718580601897227
  },
  "entities": [],
  "intent_ranking": [
    {
      "name": "affirm",
      "confidence": 0.7718580601897227
    },
    {
      "name": "goodbye",
      "confidence": 0.11611828257295627
    },
    {
      "name": "greet",
      "confidence": 0.07060567364272623
    },
    {
      "name": "restaurant_search",
      "confidence": 0.04141798359459499
    }
  ],
  "text": "Great choice"
}

Когда я могу выполнить конечную точку синтаксического анализа '/ parse? Q = Большой выбор & Project = Project', я получаю ответ ниже.

{
  "intent": {
    "name": "None",
    "confidence": 1
  },
  "entities": [],
  "text": "Great choice"
}

Когда я могу выполнить конечную точку синтаксического анализа "/ parse? Q = Book a cab & project = Project", я получаю ответ ниже.

{
  "intent": {
    "name": "goodbye",
    "confidence": 0.40930529216955336
  },
  "entities": [],
  "intent_ranking": [
    {
      "name": "goodbye",
      "confidence": 0.40930529216955336
    },
    {
      "name": "restaurant_search",
      "confidence": 0.31818118919270977
    },
    {
      "name": "greet",
      "confidence": 0.20524111006007764
    },
    {
      "name": "affirm",
      "confidence": 0.06727240857765926
    }
  ],
  "text": "Book a cab"
}

Таким образом, на каждый запрос он иногда дает правильные результаты, а иногда нет. Если вы можете наблюдать Parse_reponce2.txt и Parse_reponce3.txt в обоих ответах, я только что изменил с маленькой буквы «p» на заглавную «P» вместо «Project» из-за этого изменения, я получил разные результаты для каждого запроса.

А в обученных данных нет текста «Заказать такси» или какого-либо связанного с ним намерения. Но когда я отправляю синтаксический анализ с использованием этого текста, я не получаю намерения None, он возвращает результат намерения. для любого запроса на синтаксический анализ с любым случайным намерением я не получаю None intent.

Это моя проблема с тренировками или что в ней пошло не так? Пожалуйста, дайте мне знать, как я могу получить правильные результаты намерений, а также результаты сущностей.

Содержимое файла конфигурации (если используется и применимо):

{

    "project":"Project",
    "pipeline" : ["nlp_spacy", "tokenizer_spacy", "intent_featurizer_spacy","ner_crf", "ner_synonyms", "intent_classifier_sklearn","ner_spacy"],
    "path" : "./projects",
    "cors_origins":["*"],
    "data" : "./data/examples/rasa/People.json"

}

person Ratan    schedule 28.09.2017    source источник
comment
Я также столкнулся с той же проблемой, и причина заключалась в том, что в разделе общих примеров не было достаточно данных, поэтому я скопировал и вставил их несколько раз и обучил их, после чего бот работал правильно. вы можете увидеть то же самое для примера бота-ресторана в ядре rasa, пример: {text: cheap, intent: price, entity: []}, повторяется несколько раз   -  person rsb    schedule 14.12.2017
comment
Если ваши примеры буквальны, возможно, у вас проблемы с кодировкой URL-адресов. пробел не является допустимым символом в URL-адресе. Вы должны заменить его шестнадцатеричным кодом для пробела% 20. Таким образом, отличный выбор становится отличным выбором% 20.   -  person Pete Mancini    schedule 29.12.2017


Ответы (2)


Параметры URL-адреса чувствительны к регистру, поэтому два great choice примера имеют разные результаты. Во втором случае Раса не нашла проект / модель для анализа.

Rasa NLU всегда будет возвращать совпадающее намерение. Итак, в последнем примере вы можете видеть, что он вернул намерение, но уверенность была низкой. Обработка этого называется резервным вариантом или выходящим за рамки. Обсуждаются два основных способа обработки отката: реализация логики, которая вступает во владение, когда достоверность падает ниже определенного порога, или обучение фактическому намерению отката, содержащему все примеры, не связанные с намерением, которые вы хотите уловить.

person Caleb Keller    schedule 29.09.2017

У меня была такая же проблема с использованием Rasa NLU, где у меня было около 120 примеров для 5 разных целей, а также 5-7 сущностей. Здесь, похоже, вы использовали spacy-sklearn конвейер. spaCy обычно требуется больше данных для обучения и обнаружения намерений и (более того) сущностей. В документации сказано, что 500-1000 примеров будут считаться "достойными и хорошими" для библиотеки.

В моем случае я изменил свой конвейер на MITIE-sklearn и получил приличную модель, обученную всего с 80 примерами и тем же количеством намерений, что и раньше. Также spaCy имеет тенденцию быть быстрее, как вы заметили, но MITIE действительно занимает около 6 минут для модели из 80 примеров.

person Parvathy Sarat    schedule 30.04.2018