【问题标题】:Why are the letters appended instead of the word?为什么附加字母而不是单词?
【发布时间】:2021-05-23 06:24:38
【问题描述】:

我目前正在处理来自 DSTC8 模式对话的 JSON 文件:https://github.com/google-research-datasets/dstc8-schema-guided-dialogue

我正在尝试为每个对话提取键“act”的值,我的代码如下所示:

with open('path/dialogues_001.json', 'r') as f:
data = json.load(f)

    col = []
    #Looping through each dialogue
    for i in data:
        row = []
        x.append(q)
         #For every turns, we will loop through the 'frames' and 'actions'
         for j in i['turns']:
             for k in j['frames']:
                 for l in k['actions']:
                    #Looping through the key ; 'act'
                    for m in l['act']:
                        q.append(m)

print(x[0])

追加有效,但结果写为

['I', 'N', 'F', 'O', 'R', 'M', 'I', 'N', 'F', 'O', 'R', 'M', 'I', 'N', 'F', 'O', 'R', 'M', '_', 'I', 'N', 'T', 'E', 'N', 'T', 'R', 'E', 'Q', 'U', 'E', 'S', 'T']

而不是['INFORM', 'INFORM, INFORM_INTENT, 'REQUEST']

你们知道我的代码中出现了什么问题吗?是附加字母而不是单词值?

【问题讨论】:

  • for m in l['act'] 循环遍历l['act'] 中的每个字母。删除它,只需要q.append(l['act'])。我认为,如果您在每个步骤中添加 cmets 以了解数据的内容,并且变量名称描述了内容是什么,那么您会发现查看正在发生的事情会更有帮助。
  • 感谢您的提示和建议!我肯定会添加 cmets
  • 是的,使用有意义的变量名。
  • 哇——嵌套太多了!
  • @costaparas 让我知道您是否有另一种简单的方法来解析 JSON 文件而无需太多 for 循环 :)

标签: python json loops append


【解决方案1】:

您不需要最后一个 for 循环,因为它正在迭代为键 act 找到的值的字母。

此外,如果您使用有意义的对象名称将帮助您更好地维护代码:

import json

acts = []
with open('inp.json', 'r') as f:
    data = json.load(f)

    for dialogue in data:
        for turn in dialogue.get('turns', []):
            for frame in turn.get('frames', []):
                for action in frame.get('actions', {}):
                    act = action.get('act')
                    acts.append(act)
print(acts)

输出的子集:

['INFORM', 'INFORM_INTENT', 'REQUEST', 'REQUEST', 'INFORM']

注意:如果您只想要唯一的行为名称,您可能需要使用 set() 数据类型。

【讨论】:

    【解决方案2】:

    或者,您可以将json 转换为dataframe 并通过对话框ID 查找所有带有正则表达式的行为。

    import pandas as pd
    import re
    
    df = pd.read_json('path/dialogues_001.json')
    df.turns = df.turns.apply(str)
    df['acts'] = [re.findall(r"'act': '(\w+)'", row) for row in df['turns']]
    

    现在您有了所有对话 ID 及其行为名称。它也有效,因为根据DSTC8 中的方案表示,acts 仅出现在actions 下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      相关资源
      最近更新 更多