83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
import json
|
|
|
|
class ParserIntentJson:
|
|
def __init__(self, json_path: str):
|
|
self.json_path = json_path
|
|
with open(json_path, 'r', encoding='utf-8') as f:
|
|
self.jsons = json.load(f)
|
|
self.lv1_intent_names_str = ""
|
|
self.intent_lv2_str = ""
|
|
|
|
self.intent_struct = {item["一级意图"]["name"]: [sub["name"] for sub in item["二级意图"]] for item in self.jsons}
|
|
|
|
# 初始化时生成所有结构
|
|
self.generate_intent_lv1_struction()
|
|
self.generate_intent_lv2_struction()
|
|
self.generate_pydantic_model()
|
|
|
|
def generate_intent_lv1_struction(self):
|
|
lv1_intent_names = []
|
|
for item in self.jsons:
|
|
lv1_intent_names.append(item["一级意图"]["name"])
|
|
self.lv1_intent_names_str = str(lv1_intent_names).replace("'", "")
|
|
|
|
def generate_intent_lv2_struction(self):
|
|
intent_lv2_str = ""
|
|
for item in self.jsons:
|
|
str1 = f'## {item["一级意图"]["name"]}\n'
|
|
str2 = ""
|
|
for sub in item["二级意图"]:
|
|
str2 += f'{sub["name"]}({sub["description"]})\n'
|
|
intent_lv2_str += str1 + str2
|
|
self.intent_lv2_str = intent_lv2_str
|
|
|
|
def generate_pydantic_model(self):
|
|
|
|
self.pydantic_dict_lv1 = {}
|
|
self.pydantic_dict_lv2 = []
|
|
for i in range(len(self.jsons)):
|
|
lv1_name = self.jsons[i]["一级意图"]["name"]
|
|
|
|
intent_name_lv1 = f"slot_struct_lv1_{i}"
|
|
slot_lv1 = self.jsons[i]['一级意图'].get('slot')
|
|
class_def_lv1 = f"class {intent_name_lv1}(BaseModel):\n"
|
|
for field_name, description in slot_lv1['required'].items():
|
|
class_def_lv1 += f' {field_name}_required: str = Field(description="{description}")\n'
|
|
for field_name, description in slot_lv1['optional'].items():
|
|
class_def_lv1 += f' {field_name}_optional: str = Field(description="{description}")\n'
|
|
self.pydantic_dict_lv1[lv1_name] = class_def_lv1
|
|
# dict_temp_lv1 = {lv1_name: class_def_lv1}
|
|
# self.pydantic_dict_lv1.append(dict_temp_lv1)
|
|
|
|
intent_name_lv2 = f"slot_struct_lv2_{i}"
|
|
pydantic_dict_temp = []
|
|
for j in range(len(self.jsons[i]["二级意图"])):
|
|
lv2_name = self.jsons[i]["二级意图"][j].get("name")
|
|
temp_list = [lv1_name, lv2_name]
|
|
slot_lv2 = self.jsons[i]["二级意图"][j].get("solt")
|
|
|
|
class_def_lv2 = f"class {intent_name_lv2}_{j}(BaseModel):\n"
|
|
for field_name, description in slot_lv2['required'].items():
|
|
class_def_lv2 += f' {field_name}_required: str = Field(description="{description}")\n'
|
|
for field_name, description in slot_lv2['optional'].items():
|
|
class_def_lv2 += f' {field_name}_optional: str = Field(description="{description}")\n'
|
|
# for field_name, description in slot['inferred'].items():
|
|
# class_def += f' {field_name}: str = Field(description="{description}")\n'
|
|
dict_temp = {tuple(temp_list): class_def_lv2}
|
|
pydantic_dict_temp.append(dict_temp)
|
|
self.pydantic_dict_lv2.append(pydantic_dict_temp)
|
|
|
|
|
|
|
|
|
|
# 使用示例
|
|
if __name__ == "__main__":
|
|
parser = ParserIntentJson("../data/dynamic_structure/intent_json.json")
|
|
|
|
print(parser.lv1_intent_names_str)
|
|
|
|
print(parser.intent_lv2_str)
|
|
|
|
print(parser.pydantic_dict_lv1)
|
|
|
|
print(parser.pydantic_dict_lv2) |