提问人:Naeemah Small 提问时间:10/31/2023 最后编辑:tripleeeNaeemah Small 更新时间:10/31/2023 访问量:51
如何修复 TypeError:字符串索引必须是 json 文件中的整数
How to fix TypeError: string indices must be integers in a json file
问:
我收到错误:TypeError:字符串索引必须是整数 如何解决此问题?
我这样做的原因是我可以将我的数据帧转换为拥抱脸数据集,这样我就可以使用转换器开发一个聊天机器人。
我使用 huggingface.co 的虚拟数据编写了一个聊天机器人,但我现在需要使用自己的数据。
请出示证据证明您的答案有效。
数据帧:
标记 | 模式 | 响应 |
---|---|---|
有组织的艺术家 | 将相关用品保存在同一区域。 | 如果您是摄影师,请保留所有必要的镜头、电线和电池 |
创作新波现实主义艺术作品 | 使用黑色墨水笔在一小张纸x上以新波普现实主义的方式创作未来壁画的草图。 | 请参阅图像,了解此图如何逐步发展。但是,有一个重要的细节: |
视觉特效艺术家 | 注册基于工作室的课程。 | 没有大学学位也可以成为一名视觉特效艺术家,但有了大学学位,这条路往往更容易。 |
成为艺术投资人 | 从对艺术的一些经验或兴趣开始。 | 最好的艺术品投资者会对他们购买的艺术品进行研究,因此受过一定教育的人 |
有组织的艺术家 | 保留您的参考资料、草图、文章、照片等, | 当你开始计划一个项目或工作时,你可能会收集一些灵感和测试草图。 |
我的代码:
data = pd.read_csv('wikihowAll.csv')
data = data.dropna()
data['clean_title'] = data['title'].map(lambda s:preprocess(s))
data['clean_headline'] = data['headline'].map(lambda s:preprocess(s))
data['clean_text'] = data['text'].map(lambda s:preprocess(s))
data['clean_title'] = data['clean_title'].astype(str)
data['clean_headline'] = data['clean_headline'].astype(str)
data['clean_text'] = data['clean_text'].astype(str)
data['title_clean_sent'] = data['title'].apply(clean)
data['headline_clean_sent'] = data['headline'].apply(clean)
data['text_clean_sent'] = data['text'].apply(clean)
data = data[['clean_title','headline_clean_sent','text_clean_sent']]
data.columns = ['tag', 'patterns', 'responses']
data['tag'] = data['tag'].astype(str)
data['patterns'] = data['patterns'].astype(str)
data['responses'] = data['responses'].astype(str)
intents = data.to_json(orient='records')
new_collection = [] # store our reformed records
# loop over parsed json, and reshape it the way we want
for record in json.loads(intents):
nested = {'intents': [record]} # matching specs of question
new_collection.append(nested)
intents = json.dumps(new_collection)
with open("myfile.json","w") as outfile:
json.dump(intents, outfile)
data_file = open('myfile.json').read()
intents = json.loads(data_file)
for intent in intents['intents']:
for pattern in intent['patterns']:
#tokenize each word
w = nltk.word_tokenize(pattern)
words.extend(w)
#add documents in the corpus
documents.append((w, intent['tag']))
# add to our classes list
if intent['tag'] not in classes:
classes.append(intent['tag'])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[12], line 1
----> 1 for intent in intents['intents']:
2 for pattern in intent['patterns']:
3
4 #tokenize each word
5 w = nltk.word_tokenize(pattern)
TypeError: string indices must be integers
如何解决错误消息。请解释我做错了什么以及如何解决。
我被告知将完整的代码放入我提出的问题中。我想了解如何在没有错误消息的情况下保存 json 文件。
答:
1赞
JimOfAllTrades
10/31/2023
#1
您的问题是 JSON 的双重编码。
用线
intents = json.dumps(new_collection)
你把json结构写成一个字符串,这个字符串就存储在.例如,如果您的 python 结构是 ,则该字符串将是该 python 结构的 JSON 编码版本: 。new_collection
intents
{ 'a': [ 1, 2 ] }
"{"a": [1, 2, 3]}"
对于下一个块,
with open("myfile.json","w") as outfile:
json.dump(intents, outfile)
将编码为 JSON 的字符串写入文件。String 是一种 JSON 数据类型,它通过转义会破坏 JSON 代码的字符进行编码:."{\"a\": [1, 2, 3]}"
跟
data_file = open('myfile.json').read()
intents = json.loads(data_file)
再次读取该 JSON 文件,从 JSON 对其进行解码并取回字符串,即 JSON 编码结构的字符串表示形式,而不是结构本身。
因此,使用转储和转储序列,您可以对结构进行双重编码,因此要解决这个问题,请摆脱 并直接在转储方法中使用它将其写入文件。intents = json.dumps(new_collection)
new_collection
评论
intents
是一个字符串。如果不提供数据,您将不得不自己调试它。