• NLP中常用的utils


    这是我在自己做实验中总结的一些工具方法,对于我这种菜鸟来说,经常不记得这些方法,可以拿出来使用使用.后续会持续更新.

    1. 数据持久化成pkl格式\json格式,保存和获取pkl格式文件

    • 导包
    import pickle as pkl
    import codecs
    
    • 1
    • 2
    • 保存数据成pkl格式
    def sava_pkl(path, obj, obj_name):
        print(f'save {obj_name} in {path}')
        with codecs.open(path, 'wb') as f:
            pkl.dump(obj, f)
    
    • 1
    • 2
    • 3
    • 4
    • 获取pkl格式数据
    def load_pkl(path, obj_name):
        print(f'load {obj_name} in {path}')
        with codecs.open(path,'rb') as f:
            data = pkl.load(f)
        return data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 将数据保存成JSON格式
    def save_json(path,data):
        # 先将字典对象转换成可读写的字符串
        item=json.dumps(data,ensure_ascii=False,indent=2)
        with open(path,"w",encoding='utf-8')as f:
            f.write(item)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ensure_ascii默认是True,则就会将中文保存成十六进制格式

    • 将数据处理成字典,然后再保存成JSON格式
        for i in range(len(sen_lis)):
            item = dict()
            item["guid"] = i
            item["text_a"] = sen_lis[i]
            item["label"] = label_lis[i]
            res.append(item)
        print("all of %d instances" % (i + 1))
        out_path=os.path.join(out_path,'ChnSenticrop'+index+'.json')
        with open(out_path, "w",encoding='utf-8') as jfile:
            json.dump(res, jfile, ensure_ascii=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.读取CSV和JSON格式的数据

    • 导包
    import json
    import csv
    import codecs
    
    • 1
    • 2
    • 3
    • 读取CSV格式的数据
    def load_csv(file):
        data_list = []
    
        with codecs.open(file, encoding='utf-8') as f:
            reader = csv.DictReader(f)
            for line in reader:
                data = list(line.values())
                data_list.append(data)
        return data_list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 读取JSON格式的数据
    def load_json(file):
        data_list = []
    
        with codecs.open(file, encoding='utf-8') as f:
            for line in f:
                json_data = json.load(line)
                data = list(json_data.values())
                data_list.append(data)
        return data_list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    或者:

    def load_json(file):
        assert os.path.exists(file),'这个路径不存在'
        data_list=[]
        with codecs.open(file,encoding='utf-8')as f:
            json_data=json.load(f)
            for data in json_data:
                data_list.append(data)
        return data_list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ###3.拼接成完整的路径,并且判断这个路径是否存在,如果不存在就创建路径

    • 导包
    import os
    
    • 1
    • 拼接路径,一般在保存文件的时候要用
    data_path='data/out'
    train_data_path=os.path.join(data_path,'triain.pkl')
    if not os.path.exists(train_data_path):
          os.makedirs(train_data_path)
    
    • 1
    • 2
    • 3
    • 4

    4.tqdm和enumerate一起使用,可视化进度

    from tqdm import tqdm
    # 首先讲数据用tqdm包裹
    epoch_iterator=tqdm(data_loader,desc='Iteration')
    for batch_idx, batch in enumerate(epoch_iterator):
                   ..............
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意导入包一定是:from tqdm import tqdm

    5.读取文件路径

    • 读取文件夹的一级目录
    import os
    dirs=os.listdir('-文件夹名称-')
    
    • 1
    • 2
    • 读取多级目录
    def get_Filelist(path):
        for root, dirs, files in os.walk(path):
            # root 表示当前正在访问的文件夹路径
            # dirs 表示该文件夹下的子目录名list
            # files 表示该文件夹下的文件list
            print('root-dir',root)
            print('sub-dirs',dirs)
            print('files:',files)
            print("=====================")
        return dirs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6.同时打乱2个集合的顺序

    def shuffle2list(a: list, b: list):
        # shuffle two list with same rule, you can also use sklearn.utils.shuffle package
        c = list(zip(a, b))
        random.shuffle(c)
        a[:], b[:] = zip(*c)
        return a, b
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7.lambda表达式

    • lamdba表达式其实就是一种函数
      例如:
    def f(x):
        return x*x
    # 这个表达式就和上面的表示式是一个意思,其中第一个x表示函数的输入,冒号后面表示函数体
    g=lambda x:x*x
    
    • 1
    • 2
    • 3
    • 4

    print(g(5))输出的结果就是25

    • lambda也可以输入两个数据
    h=lambda x,y:x*y
    
    • 1

    print(h(5,4))输出的结果为20

    • lambda还可以放在函数中使用
    # 有的时候函数y=a*x*x+b*x+c,其中abc和x表示的意义不一样,这个时候就可以使用lambda表达式
    def quadratic(a,b,c):
        return lambda x:a*x*x+b*x+c
    # 此时表示的就是a=1,b=-1,c=2的一元二次方程
    f=quadratic(1,-1,2)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    print(f(5))输出的结果为22

    8.数据打包

    • zip()函数
      有三个list
      test1=[“ccc”,“aaa”,“ddd”,“yyy”,“xxx”]
      test2=(200,100,400,800,500)
      test3=“daceb”
      希望他们能列一起输出,即输出(“ccc”,200,d)这样的格式,这个时候就需要使用zip()函数将三个list封装到一起.见代码:
    test1=["ccc","aaa","ddd","yyy","xxx"]
    test2=(200,100,400,800,500)
    test3="daceb"
    feature=zip(test1,test2,test3)
    for i in feature:
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    ('ccc', 200, 'd')
    ('aaa', 100, 'a')
    ('ddd', 400, 'c')
    ('yyy', 800, 'e')
    ('xxx', 500, 'b')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 使用字典打包数据
      有的时候要传递数据,如果数据比较多,不是很好传递到函数中,这个时候就可以使用字典打包数据,见代码:
    test1=["ccc","aaa","ddd","yyy","xxx"]
    test2=(200,100,400,800,500)
    test3="daceb"
    feature={'test1':test1,'test2':test2,'test3':test3}
    # 这个时候就可以使用字典直接调用其中的数据
    print(feature['test1'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    ['ccc', 'aaa', 'ddd', 'yyy', 'xxx']
    
    • 1
  • 相关阅读:
    URL地址解析至页面展示全过程(面试详细解答)
    【无标题】
    C#基础语法--变量
    【信号去噪】基于gammatone滤波器实现信号去噪研究附matlab代码
    atguigu----16-自定义指令
    正则表达式基础
    JavaScript面向对象学习(一)
    系统应用--android 10.0去掉系统USB权限弹窗
    【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
    选择「程序员」职业的8个理由
  • 原文地址:https://blog.csdn.net/qq_35653657/article/details/126003604