使用json和python

时间:2017-08-04 14:42:14

标签: javascript python html json django

所以我在django框架中为我的聊天机器人制作了一个对话框面板。 “对话框”面板由意图和实体下拉列表以及对话框textarea组成。下拉列表将取决于我的json格式的训练数据。

我想要下拉列表,以便在我选择意图时,实体下拉列表会自动创建并显示与所选意图相关的所有实体。

我已经尝试了,但我能够显示意图下拉,但是它也有重复的意图(我使用python set函数删除了)。但我无法弄清楚如何根据一个特定意图显示所有实体。

帮帮我。这是我的例子json:

{"rasa_nlu_data": {

"common_examples": [
  {
    "text": "hey", 
    "intent": "greet", 
    "entities": []
  }, 
  {
    "text": "yep", 
    "intent": "affirm", 
    "entities": []
  },
  {
    "text": "i'm looking for a place to eat",
    "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": "bye", 
    "intent": "goodbye", 
    "entities": []
  }
]}}

1 个答案:

答案 0 :(得分:0)

基本上,您只需循环common_examples内的项目,然后检查intent是否与下拉列表中的所选值匹配。如果是,请将entities添加到实体下拉列表。

由于您没有提供有关HTML的大量信息,我将尝试回答一些假设:

  1. 您有一个select元素,其ID为intentDropdown以显示意图。
  2. 您有一个select元素,其ID为entitiesDropdown,用于显示实体。
  3. 你正在使用jQuery。
  4. 该代码包含一些注释,以解释它的作用。

    <!-- intents dropdown -->
    <select id="intentsDrowpdown">
        <!-- intent options-->
    </select>
    
    <!-- entities dropdown -->
    <select id="entitesDrowpdown"></select>
    
    <!-- Javascript -->
    <script>
    var data = {"rasa_nlu_data": { ... }}; // the json data
    
    var totalExamples = data.rasa_nlu_data.common_examples.length; // total items inside common_examples
    
    // listen to the event when selected value in 
    // the intent dropdown changes
    $("#intentsDropdown").on('change', function() {
    
        $("#entitiesDropdown").empty(); // clear the previously added entities from entities drowpdown
    
        var selectedIntent = this.value; // currently selected intent
    
        // loop over the items in common_examples
        for (var i = 0; i < totalExamples; i++) {
    
            var currentExample = data.rasa_nlu_data.common_examples[i] // current example in the loop
    
            // see if the selected intent matches the 
            // intent of the current example in the loop
            if (currentExample.intent == selectedIntent) {
    
                // if intent matches
                // loop over the items inside entities 
                // of the current example
                for (var j = 0; j < currentExample.entities.length; j++) {
                    // add the option in the dropdown
                    $("#entitiesDropdown").append($('<option>', {
                        value: currentExample.entities[j].value,
                        text: currentExample.entities[j].entity
                    }));
                }
    
            }
        }
    });
    
    </script>
    

    最后,我想提醒你注意一件事。考虑以下示例:

    "entities": [
      {
        "start": 8,
        "end": 15,
        "value": "chinese",
        "entity": "cuisine"
      }
    

    entities列表中有一个项目。该项目中有4个子项目。在您的问题中,您尚未明确是否要在一个下拉选项中显示所有子项(例如start: 8, end: 15, value: chinese, entity: cuisine),或者您是否希望为每个子项单独选项。

    我发布的JS代码将创建一个下拉选项,如下所示:
    <option value="chinese">cuisine</option>

    如果您想显示其他项目,您可以创建另一个循环并继续将项目添加到下拉列表中。