赞
踩
我们要将每一个字 分词边界 词性 偏旁部首 拼音都要映射成向量
现在要来统计里面有多少个不同的字 标签 分词边界这些 然后做成idtolabel labeltoid这种(这个在我们之前做QA的时候也用过)
送到模型之前 要把里面每一个字都转化成下标 然后在模型里根据不同的下表映射成不同的向量
#为什么要对句子长短进行排序?
#因为到时候喂入模型 都是拿若干个句子为一批次送入模型
#如果长短差距非常大 就会导致结果非常差
#每次填充是是以最长的句子作为标准 如果长短差距过大 padding就会过多
也会减慢训练速度 因为要一直等长句子
- #为什么要对句子长短进行排序?
- #因为到时候喂入模型 都是拿若干个句子为一批次送入模型
- #如果长短差距非常大 就会导致结果非常差
- #每次填充是是以最长的句子作为标准 如果长短差距过大 padding就会过多
- from collections import Counter
- import pickle
- def mapping(data, threshold=10, is_word=False, sep='sep'): # 返回词频
- count = Counter(data)
- if sep is not None:
- count.pop('sep')
- if is_word:
- # 如果句子长度不一致 就补PPPPPP然后送到lstm
- count['PAD'] = 10000001
- count['UNK'] = 10000000
- data = sort(count.items(), key=lambda x:x[1]), reverse=True)
- data = [x[0] for x in data if x[1]>=threshold] # 去掉频率小区10的元素
- # 删掉未登录词 因为可能有的偏旁部首在训练集有但是在测试集里没有 字的话就设置成unknown
- # bound 就只有BEMS四种
- id2item=data
- item2id={id2item[i]:i for i in range(len(id2item))}
- else:
- count['PAD'] = 10000001
- data = sort(count.items(), key=lambda x:x[1]), reverse=True)
- data = [x[0] for x in data]
- id2item=data
- item2id={id2item[i]:i for i in range(id2item)}
-
- return id2item,item2id
-
-
- def get_dict():
- map_dict = {}
- from glob import glob # 遍历文件的一个工具
- all_w = []
- all_bound = []
- all_flag = []
- all_label = []
- all_radical = []
- all_pinyin = []
- # 要把上面的东西都拿到
- for file in glob('data/prepare/train/*.csv')+glob('data/prepare/test/*.csv'):
- # 遍历到目录下以.csv为扩展名的每一个文件
- df = pd.read_csv(file, sep=',') # 拿到每一个文件
- all_w += df['word'].tolist()
- all_bound += df['bound'].tolist()
- all_flag += df['flag'].tolist()
- all_label += df['label'].tolist()
- all_radical += df['radical'].tolist()
- all_pinyin += df['pinyin'].tolist()
- map_dict['word']=mapping(all_w, threshold=20, is_word=True)
- map_dict['bound']=mapping(all_bound)
- map_dict['flag']=mapping(all_flag)
- map_dict['label']=mapping(all_label)
- map_dict['radical']=mapping(all_radical)
- map_dict['pinyin'] = mapping(all_pinyin)
- return map_dict
-
- with open(f'data/prepare/dict.pkl', 'wb') as f:
- pickle.dump(map_dict, f)
- # 生成dict.pkl
- if __name__ =='__main__':
- multi_process(split_text)
- print(get_dict())
- # 测试一下 打开文件with open(f'data/prepare/dict.pkl','rb') as f:
- # data = pickle.load(f)
- # print(data['bound'])

输出结果
字典在训练的时候用 把数据转化成下标
预测的时候 用list 根据下标转化成对应的标记
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。