import json
import re
from tqdm import tqdm

input_set = set()
type_set = set()

def strip_csv(src):
    if src and src[0] == '"' and src[-1] == '"':
        return src[1:-1]
    return src

def get_j(j):
    annos = [row['value']['choices'][0] for row in j['annotations'][0]['result']]
    input = j['data']['text']
    return annos, input

# ls = open(fn, 'r', encoding='utf-8').read().strip().split('\n')
# ls = ls[1:]
def json_2_json(fn, trans_fun=None, ls_fun=None):
    src = open(fn, 'r', encoding='utf-8').read().strip()
    if ls_fun:
        ls = ls_fun(src)
    elif src[0] == '[':
        ls = json.loads(src)
    else:
        ls = src.split('\n')
    fh = open(re.sub(r'\..*', '.aa.jsonl', fn), 'w', encoding='utf-8')
    out_js = []
    for l in tqdm(ls):
        j = l
        if l and type(l) == str and l[0] == '{':
            j = json.loads(l)
        out_j = {
            'types': trans_fun['types'](j),
            'annos': trans_fun['annos'](j),
            'input': trans_fun['input'](j),
        }
        out_js.append(out_j)
        fh.write(json.dumps(out_j, ensure_ascii=False) + '\n')
    return out_js

if __name__ == '__main__':
    import random
    import pandas as pd
    
    # fn = 'E:/NLP/NER/54_cls_ChnSentiCorp_htl_all.csv'
    # types = ['负面', '正面']
    # json_2_json(fn, trans_fun={
    #     'types': lambda j: types,
    #     'annos': lambda j: types[j[0]],
    #     'input': lambda j: j[1],
    # }, ls_fun=lambda src: [[int(l[0]), strip_csv(l[2:])] for l in src.strip().split('\n')[1:]])
    # fn = 'E:/NLP/NER/01_cls_label_studio.json'
    # types = '病情诊断\n治疗方案\n病因分析\n指标解读\n就医建议\n疾病表述\n后果表述\n注意事项\n功效作用\n医疗费用\n其他'.split('\n')
    # json_2_json(fn, trans_fun={
    #     'types': lambda j: types,
    #     'annos': lambda j: [row['value']['choices'][0] for row in j['annotations'][0]['result']],
    #     'input': lambda j: j['data']['text'],
    # })
    # fn = 'E:/NLP/NER/51_cls_toutiao_cat_data.txt'
    # code_type_map = { '100': '民生', '101': '文化', '102': '娱乐', '103': '体育', '104': '财经', '106': '房产', '107': '汽车', '108': '教育', '109': '科技', '110': '军事', '112': '旅游', '113': '国际', '114': '证券', '115': '农业', '116': '电竞', }
    # types = list(code_type_map.values())
    # json_2_json(fn, trans_fun={
    #     'types': lambda j: types,
    #     'annos': lambda j: [code_type_map[j[1]]],
    #     'input': lambda j: j[-2],
    # }, ls_fun=lambda src: [l.split('_!_') for l in src.strip().split('\n')])
    # fn = 'E:/NLP/NER/44_cls_guwenee.json'
    # types = ['人生','战争','政治','民事','日常','文化','地理']
    # json_2_json(fn, trans_fun={
    #     'types': lambda j: types,
    #     'annos': lambda j: list(set([event['class'] for event in j['event_list']])),
    #     'input': lambda j: j['text'],
    # })
    # fn = 'E:/NLP/NER/20_cls_fenlei_odkg_document.json'
    # types = ['原材料工业管理', '辐射源安全监管', '电子基础产品行业管理工作', '交通', '商贸', '科技管理', '纺织行业管理', '产业政策', '科技管理,高技术管理', '宗教', '水文', '规划', '质量管理工作', '卫生', '消费品工业管理', '司法', '消费电子行业管理工作', '环境标准', '救灾', '地震', '装备工业管理', '技术基础管理', '人口与计划生育', '技术创新管理', '旅游', '消费品工业综合指导工作', '林业', '装备工业管理,其他', '综合政务', '测绘', '政策法规', '人事教育', '民族', '核设施安全监管', '科技', '无线电管理', '航空', '人事', '公安', '工业', '能源', '财经政策', '运行监测协调', '电子信息', '有色金属工业管理', '食品工业行业管理', '教育', '软件和信息技术', '畜牧业', '装备工业行业管理', '渔业', '安全', '国防', '环境保护', '标准', '执法监督', '通信发展', '原材料工业管理,石化化工行业管理', '扶贫', '汽车工业行业管理', '城乡建设', '原材料工业管理,钢铁', '水利', '监察', '妇女儿童工作', '规划,装备工业管理', '信息通信管理', '核电厂安全监管', '其他生态环境管理业务信息', '综合协调管理,其他', '科技管理,产业政策,规划', '农业', '其他', '对外事务', '网络安全管理', '劳动', '国土资源', '节能与综合利用', '民政', '集成电路与半导体器件产业管理工作', '中小企业管理', '海关', '体育', '外事', '安全生产', '核与辐射安全管理']
    # json_2_json(fn, trans_fun={
    #     # 'types': lambda j: [types.add(type.split('\\')[0]) for type in j['分类'].split('、')],
    #     'types': lambda j: list(set(sum([random.choices(types, k=5), [type.split('\\')[0] for type in j['分类'].split('、')] if j['分类'] else []], []))),
    #     'annos': lambda j: [type.split('\\')[0] for type in j['分类'].split('、')] if j['分类'] else [],
    #     'input': lambda j: j['正文'],
    # })
    # fn = 'E:/NLP/NER/20_cls_tygwlb_odkg_document.json'
    # types = ['通告', '通报', '命令', '报告', '公告', '通知', '决定', '函', '意见', '批复']
    # json_2_json(fn, trans_fun={
    #     # 'types': lambda j: [types.append(type) for type in j['通用公文类别'].split('、')],
    #     'types': lambda j: types,
    #     'annos': lambda j: [j['通用公文类别']],
    #     'input': lambda j: j['正文'],
    # })
    # fn = 'E:/NLP/NER/20_cls_ywgwlb_odkg_document.json'
    # types = ['科技-国防科技', '军事-人事任命', '安全-网络安全', '军事-军事批复', '科技-创新改革', '安全-核安全', '军事-战功命令', '科技-航空探月', '科技-新能源', '安全-社会安全', '政府类型公文', '军事-征兵通知']
    # json_2_json(fn, trans_fun={
    #     # 'types': lambda j: [types.append(type) for type in j['业务公文类别'].split('、')],
    #     'types': lambda j: types,
    #     'annos': lambda j: [j['业务公文类别']],
    #     'input': lambda j: j['标题'],
    # })
    # print(list(set(types)))
    # fn = 'E:/NLP/NER/32_cls_event_type_entity_extract_train.csv'
    # types = ['涉嫌传销', '资金账户风险', '财务造假', '失联跑路', '涉嫌欺诈', '重组失败', '资产负面', '产品违规', '业绩下滑', '不能履职', '歇业停业', '公司股市异常', '信批违规', '高管负面', '提现困难', '其他', '实控人股东变更', '投诉维权', '涉嫌违法', '涉嫌非法集资', '评级调整', '交易违规']
    # out_js = json_2_json(fn, trans_fun={
    #     'types': lambda j: list(set(sum([types[:5], [j[-2]]], []))),
    #     'annos': lambda j: [j[-2]],
    #     'input': lambda j: j[1],
    # }, ls_fun=lambda src: [l[1:-1].split('","') for l in src.split('\n')])
    # fn = 'E:/NLP/NER/26_cls_pokemons.csv'
    # types = ['岩石', '飞行', '龙', '电', '一般', '恶', '火', '幽灵', '水', '钢', '地面', '草', '格斗', '虫', '超能力', '妖精', '冰', '毒']
    # out_js = json_2_json(fn, trans_fun={
    #     'types': lambda j: list(set(sum([random.choices(types, k=5), j[0].split('|[')[0].split('|')], []))),
    #     'annos': lambda j: j[0].split('|[')[0].split('|'),
    #     'input': lambda j: j[-1],
    # }, ls_fun=lambda src: [j for j in sum([
    #     [[j[5], j[-7]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[5], j[-6]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[5], j[-5]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[5], j[-4]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[5], j[-3]] for j in pd.read_csv(fn).values.tolist()[1:]],
    # ], []) if str(j[-1]) != 'nan'])
    # types = list(set(sum([j['types'] for j in out_js], [])))
    # fn = 'E:/NLP/NER/26_cls_color_pokemons.csv'
    # types = ['褐色', '黄色', '粉红色', '黑色', '绿色', '紫色', '未知色', '红色', '灰色', '白色', '蓝色']
    # out_js = json_2_json(fn, trans_fun={
    #     # 'types': lambda j: [j[0]],
    #     'types': lambda j: list(set(sum([random.choices(types, k=5), [j[0]]], []))),
    #     'annos': lambda j: [j[0]],
    #     'input': lambda j: j[-1],
    # }, ls_fun=lambda src: [j for j in sum([
    #     [[j[10], j[-7]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[10], j[-6]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[10], j[-5]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[10], j[-4]] for j in pd.read_csv(fn).values.tolist()[1:]],
    #     [[j[10], j[-3]] for j in pd.read_csv(fn).values.tolist()[1:]],
    # ], []) if str(j[-1]) != 'nan'])
    # types = list(set(sum([j['types'] for j in out_js], [])))
    fn = 'E:/NLP/NER/26_cls_class_pokemons.csv'
    # types = []
    types = ['单朵宝可梦', '陆鲨宝可梦', '修行宝可梦', '蓄电池宝可梦', '雪笠宝可梦', '看护宝可梦', '南海宝可梦', '维京宝可梦', '王者宝可梦', '巨大宝可梦', '恶颜宝可梦', '小猪宝可梦', '猪猴宝可梦', '火鼠宝可梦', '王剑宝可梦', '鸟宝可梦', '勾蜓宝可梦', '昆虫宝可梦', '大胃王宝可梦', '大角宝可梦', '双面宝可梦', '境界宝可梦', '新雪宝可梦', '漩涡宝可梦', '叶子宝可梦', '狐狸宝可梦', '波纹宝可梦', '幼君宝可梦', '鼠宝可梦', '脑宝可梦', '时空穿越宝可梦', '水兔宝可梦', '季节宝可梦', '不倒翁宝可梦', '发电宝可梦', '火炬宝可梦', '巨蜈蚣宝可梦', '突击宝可梦', '半梦半醒宝可梦', '音波宝可梦', '清高宝可梦', '骑兵宝可梦', '苹果翅宝可梦', '幼蜂宝可梦', '贪欲宝可梦', '挖洞宝可梦', 'ＤＮＡ宝可梦', '毒针宝可梦', '潜水宝可梦', '前锋宝可梦', '拳法宝可梦', '魔法宝可梦', '岩石肤宝可梦', '怨念宝可梦', '捉弄宝可梦', '油灯宝可梦', '反抗宝可梦', '喷粉宝可梦', '大声宝可梦', '重量级宝可梦', '冥想宝可梦', '入门宝可梦', '天线罩宝可梦', '长颈宝可梦', '进化宝可梦', '罗盘宝可梦', '河狸宝可梦', '石墙宝可梦', '古虾宝可梦', '牙蛇宝可梦', '搬运宝可梦', '虫宝宝宝可梦', '冰蛾宝可梦', '灯饰宝可梦', '抓狂宝可梦', '软体生物宝可梦', '耐力宝可梦', '毒蜂宝可梦', '远古鸟宝可梦', '月光宝可梦', '垃圾场宝可梦', '听力宝可梦', '鳞粉宝可梦', '锹形虫宝可梦', '白鸟宝可梦', '火山宝可梦', '海底宝可梦', '地蛇宝可梦', '刺铠宝可梦', '无限宝可梦', '芳草宝可梦', '爽朗宝可梦', '自制宝可梦', '蝴蝶宝可梦', '球鲸宝可梦', '水枪宝可梦', '气体状宝可梦', '化石宝可梦', '荆棘宝可梦', '铁球宝可梦', '合金宝可梦', '拍手宝可梦', '冰块宝可梦', '风隐宝可梦', '放水宝可梦', '陨石宝可梦', '雪国宝可梦', '风筝宝可梦', '放电宝可梦', '利刃宝可梦', '天空宝可梦', '磁场宝可梦', '流氓宝可梦', '雷宝可梦', '哼唱宝可梦', '蝎怪宝可梦', '橡实宝可梦', '铳炮宝可梦', '围巾宝可梦', '地幔宝可梦', '水珠宝可梦', '水母宝可梦', '摔角宝可梦', '新月宝可梦', '沙蛇宝可梦', '独唱者宝可梦', '蜂巢宝可梦', '发酵宝可梦', '海鼬宝可梦', '闪电宝可梦', '暴牛宝可梦', '树冰宝可梦', '野猪宝可梦', '铁爪宝可梦', '石居宝可梦', '喷火宝可梦', '深海宝可梦', '噪音宝可梦', '钻锥宝可梦', '蜈蚣宝可梦', '子弹宝可梦', '祝福宝可梦', '小熊宝可梦', '穿刺宝可梦', '大火猪宝可梦', '空壳宝可梦', '孤独宝可梦', '影子宝可梦', '雏鸡宝可梦', '蓑衣蛾宝可梦', '筋骨宝可梦', '冰雪宝可梦', '青铜宝可梦', '凶恶宝可梦', '蚁狮宝可梦', '蜷缩宝可梦', '水鸟宝可梦', '野鸽宝可梦', '胃袋宝可梦', '小鱼宝可梦', '镰草宝可梦', '人工宝可梦', '泡沫奶油宝可梦', '黑金宝可梦', '飞蝎宝可梦', '雏鹰宝可梦', '棱镜宝可梦', '破冰宝可梦', '幼狮宝可梦', '鼹鼠宝可梦', '沙丘宝可梦', '海百合宝可梦', '怕麻烦宝可梦', '象征宝可梦', '柔术宝可梦', '护盾宝可梦', '红茶宝可梦', '五星宝可梦', '蟋蟀宝可梦', '国王宝可梦', '螳螂宝可梦', '分割宝可梦', '毒蛾宝可梦', '河马宝可梦', '宁静宝可梦', '停止宝可梦', '盆栽宝可梦', '神秘宝可梦', '怪力宝可梦', '毒蜥宝可梦', '白阳宝可梦', '大头目宝可梦', '心情宝可梦', '龙玉宝可梦', '藤壶宝可梦', '知更鸟宝可梦', '三头鸟宝可梦', '顽皮宝可梦', '热气球宝可梦', '雷击宝可梦', '箭羽宝可梦', '蜕皮宝可梦', '重量宝可梦', '污泥宝可梦', '放哨宝可梦', '连结宝可梦', '电气宝可梦', '暹罗猫宝可梦', '凶暴宝可梦', '萤火虫宝可梦', '独角宝可梦', '海参宝可梦', '烈马宝可梦', '新绿宝可梦', '冻结宝可梦', '甲胄宝可梦', '破坏宝可梦', '电击宝可梦', '强臂宝可梦', '蜥蜴宝可梦', '乌鸦宝可梦', '冰冻宝可梦', '鱼宝可梦', '杂草宝可梦', '齿轮宝可梦', '忍者宝可梦', '鸭宝可梦', '节拍宝可梦', '像铜宝可梦', '鸟嘴宝可梦', '舔舔宝可梦', '顽童宝可梦', '铃铛宝可梦', '煤炭宝可梦', '气球宝可梦', '驴宝可梦', '引诱宝可梦', '泼水宝可梦', '绵羊宝可梦', '沼鱼宝可梦', '棉球宝可梦', '迟钝宝可梦', '鼓手宝可梦', '猫头鹰宝可梦', '树丛宝可梦', '刃羽宝可梦', '企鹅宝可梦', '感谢宝可梦', '针球宝可梦', '空手道宝可梦', '毒气宝可梦', '头锤宝可梦', '浮鲸宝可梦', '鲜奶油宝可梦', '牙宝可梦', '月轮宝可梦', '电鱼宝可梦', '催眠宝可梦', '亲子宝可梦', '仙人掌宝可梦', '捕蝇宝可梦', '蹲守宝可梦', '捕虫宝可梦', '育儿宝可梦', '人形宝可梦', '细胞宝可梦', '海鸥宝可梦', '金鱼宝可梦', '刀刃宝可梦', '狗宝可梦', '水果宝可梦', '猛推宝可梦', '大陆宝可梦', '暗黑宝可梦', '回转宝可梦', '冰山宝可梦', '灾祸宝可梦', '渡魂宝可梦', '回游宝可梦', '懒人宝可梦', '海兔宝可梦', '威吓宝可梦', '爆燃宝可梦', '苹果居宝可梦', '树桩宝可梦', '黑阴宝可梦', '缠人宝可梦', '勇猛宝可梦', '矿石宝可梦', '倒立宝可梦', '细语宝可梦', '电光宝可梦', '知识宝可梦', '须鱼宝可梦', '古代龟宝可梦', '发热宝可梦', '水黾宝可梦', '寂静宝可梦', '一口吞宝可梦', '膨胀宝可梦', '猛火宝可梦', '幸福宝可梦', '蜗牛宝可梦', '海胆宝可梦', '樱花宝可梦', '小猴宝可梦', '铁心宝可梦', '巡回宝可梦', '冻原宝可梦', '念力宝可梦', '拳击宝可梦', '带电宝可梦', '双手宝可梦', '强者宝可梦', '坏心眼宝可梦', '旋风宝可梦', '长鼻宝可梦', '保姆宝可梦', '洞穴宝可梦', '皇帝宝可梦', '似草宝可梦', '风铃宝可梦', '花宝可梦', '爱骨宝可梦', '刺猴宝可梦', '火猫宝可梦', '天体宝可梦', '吐泡宝可梦', '结晶宝可梦', '碎藻宝可梦', '暴风雪宝可梦', '凝视宝可梦', '雷电宝可梦', '波导宝可梦', '打斗宝可梦', '新种宝可梦', '隐形宝可梦', '虎斑猫宝可梦', '宝石宝可梦', '爆炎宝可梦', '钩爪宝可梦', '尿布宝可梦', '草原宝可梦', '小狗宝可梦', '哀怨宝可梦', '亲吻宝可梦', '日轮宝可梦', '发射宝可梦', '邪恶宝可梦', '椋鸟宝可梦', '阴暗宝可梦', '求爱宝可梦', '贤者宝可梦', '刺球宝可梦', '椰子宝可梦', '幼虫宝可梦', '音符宝可梦', '偶像宝可梦', '震动宝可梦', '熔岩宝可梦', '水泡宝可梦', '警戒宝可梦', '贪吃宝可梦', '婴儿宝可梦', '岩窟宝可梦', '茧蜈蚣宝可梦', '欺骗宝可梦', '喷射宝可梦', '刀剑宝可梦', '庞克宝可梦', '阵形宝可梦', '小猫宝可梦', '花饰宝可梦', '绵毛宝可梦', '夜啼宝可梦', '瞌睡宝可梦', '藤蔓状宝可梦', '忠犬宝可梦', '蘑菇宝可梦', '特工宝可梦', '铁蚁宝可梦', '沙堡宝可梦', '挽马宝可梦', '火种宝可梦', '天气宝可梦', '吐火宝可梦', '恶党宝可梦', '芳香宝可梦', '暴君宝可梦', '蒸汽宝可梦', '南瓜宝可梦', '绵鸟宝可梦', '脸面宝可梦', '钳子宝可梦', '花束宝可梦', '喜剧演员宝可梦', '电蜘蛛宝可梦', '刺栗宝可梦', '燕子宝可梦', '星形宝可梦', '密林宝可梦', '高压宝可梦', '花镰宝可梦', '操纵宝可梦', '两头鸟宝可梦', '旋律宝可梦', '啃咬宝可梦', '幼鸡宝可梦', '狼宝可梦', '甲壳宝可梦', '屏障宝可梦', '电松鼠宝可梦', '头锤牛宝可梦', '灯宝可梦', '牙蝎宝可梦', '草猴宝可梦', '猛冲宝可梦', '粗暴宝可梦', '刺果宝可梦', '嫩叶宝可梦', '流星宝可梦', '土地神宝可梦', '恶猿宝可梦', '星云宝可梦', '滚球宝可梦', '家家酒宝可梦', '变色宝可梦', '感情宝可梦', '似鸟宝可梦', '咬住宝可梦', '烟火宝可梦', '毛毛虫宝可梦', '水蜥宝可梦', '垃圾袋宝可梦', '啄木鸟宝可梦', '包容宝可梦', '水鼠宝可梦', '蜂虻宝可梦', '画画宝可梦', '创造宝可梦', '自尊心宝可梦', '海狮宝可梦', '肃静宝可梦', '七星宝可梦', '泥偶宝可梦', '岩石宝可梦', '原始星宝可梦', '抑制宝可梦', '种子宝可梦', '恶狐宝可梦', '黄嘴鸭宝可梦', '岩山宝可梦', '珊瑚宝可梦', '爆炸龟宝可梦', '圆鼠宝可梦', '栖影宝可梦', '踢腿宝可梦', '非星宝可梦', '喇叭喙宝可梦', '地底宝可梦', '坚硬脑袋宝可梦', '烈火宝可梦', '长尾宝可梦', '太阳宝可梦', '食梦宝可梦', '配合宝可梦', '装乖宝可梦', '蝙蝠宝可梦', '超极巨宝可梦', '钢甲鸟宝可梦', '黑暗宝可梦', '奶牛宝可梦', '铁蛇宝可梦', '小鼠宝可梦', '布偶宝可梦', '模仿宝可梦', '增幅宝可梦', '双牙宝可梦', '结冰宝可梦', '坐骑宝可梦', '无赖宝可梦', '磨牙宝可梦', '生命宝可梦', '贵宾犬宝可梦', '健美宝可梦', '水鱼宝可梦', '火山口宝可梦', '人偶宝可梦', '加油宝可梦', '憨憨宝可梦', '发光宝可梦', '发射器宝可梦', '栗鼠宝可梦', '猛禽宝可梦', '长腿宝可梦', '幼燕宝可梦', '棺木宝可梦', '龟宝可梦', '小龟宝可梦', '毛蟹宝可梦', '利器宝可梦', '巨石宝可梦', '人造宝可梦', '招手宝可梦', '火猪宝可梦', '虹色宝可梦', '倒转宝可梦', '香水宝可梦', '丰饶宝可梦', '乘载宝可梦', '清水蟹宝可梦', '猫鼬宝可梦', '音速宝可梦', '海獭宝可梦', '双壳贝宝可梦', '魔像宝可梦', '默剧宝可梦', '长寿宝可梦', '秩序宝可梦', '沙漠鳄鱼宝可梦', '闪光宝可梦', '魂宝可梦', '祈愿宝可梦', '毒袋宝可梦', '吸附宝可梦', '颚斧宝可梦', '集合宝可梦', '武术宝可梦', '裁缝宝可梦', '大颚宝可梦', '棉草宝可梦', '寄居蟹宝可梦', '天雷宝可梦', '等离子宝可梦', '根茎宝可梦', '薄翼宝可梦', '宽大宝可梦', '浮萍宝可梦', '极光宝可梦', '疾行宝可梦', '臭鼬宝可梦', '火宝可梦', '忍耐宝可梦', '陷阱宝可梦', '鳞片宝可梦', '花苞宝可梦', '豆狸宝可梦', '蓑衣虫宝可梦', '足不出叶宝可梦', '钥匙串宝可梦', '草蛇宝可梦', '弹跳宝可梦', '寄生宝可梦', '基因宝可梦', '霓虹宝可梦', '凶猛宝可梦', '脱壳宝可梦', '海洋宝可梦', '铁铠宝可梦', '小鸽宝可梦', '天线宝可梦', '冷酷宝可梦', '蝎子宝可梦', '变身宝可梦', '拔刀宝可梦', '妖怪猫宝可梦', '皇家宝可梦', '慈爱宝可梦', '暴猿宝可梦', '装甲宝可梦', '毅力宝可梦', '蝌蚪宝可梦', '飞翅鱼宝可梦', '目光宝可梦', '古生代宝可梦', '幼马宝可梦', '时间宝可梦', '龙宝可梦', '食蚁兽宝可梦', '妖狐宝可梦', '眼珠宝可梦', '高温宝可梦', '蜡烛宝可梦', '意志宝可梦', '舞蹈宝可梦', '兔子宝可梦', '火马宝可梦', '花园宝可梦', '岩居宝可梦', '冬眠宝可梦', '老树宝可梦', '胜利宝可梦', '蛙宝可梦', '棉花糖宝可梦', '毒击宝可梦', '电子宝可梦', '谜宝可梦', '漂浮宝可梦', '尖尖宝可梦', '铁足宝可梦', '蛋宝可梦', '乐天宝可梦', '苹果汁宝可梦', '蛹宝可梦', '斑点熊猫宝可梦', '棉饰宝可梦', '美艳宝可梦', '粗鲁宝可梦', '虚拟宝可梦', '草羽宝可梦', '骨鹰宝可梦', '岩蛇宝可梦', '铠甲宝可梦', '妖精宝可梦', '球宝可梦', '拳斗宝可梦', '吐丝宝可梦', '火花宝可梦', '飞鼠宝可梦', '开朗宝可梦', '林蜥宝可梦', '泡蛙宝可梦', '磁铁宝可梦', '反派宝可梦', '封印宝可梦', '骏马宝可梦', '相随宝可梦', '传说宝可梦', '眼镜蛇宝可梦', '抓握宝可梦', '柔道宝可梦', '画皮宝可梦', '樱桃宝可梦', '异食宝可梦', '螺帽宝可梦', '火焰宝可梦', '长躯干宝可梦', '铜钟宝可梦', '紧咬宝可梦', '琵琶鱼宝可梦', '摘花宝可梦', '蛇宝可梦', '小鸟宝可梦', '威严宝可梦', '空间宝可梦', '奔雷宝可梦', '稻草人宝可梦', '悠游宝可梦']
    out_js = json_2_json(fn, trans_fun={
        # 'types': lambda j: [j[0]],
        'types': lambda j: list(set(sum([random.choices(types, k=5), [j[0]]], []))),
        'annos': lambda j: [j[0]],
        'input': lambda j: j[-1],
    }, ls_fun=lambda src: [j for j in sum([
        [[j[6], j[-7]] for j in pd.read_csv(fn).values.tolist()[1:]],
        [[j[6], j[-6]] for j in pd.read_csv(fn).values.tolist()[1:]],
        [[j[6], j[-5]] for j in pd.read_csv(fn).values.tolist()[1:]],
        [[j[6], j[-4]] for j in pd.read_csv(fn).values.tolist()[1:]],
        [[j[6], j[-3]] for j in pd.read_csv(fn).values.tolist()[1:]],
    ], []) if str(j[-1]) != 'nan'])
    types = list(set(sum([j['types'] for j in out_js], [])))
    
