当前位置:   article > 正文

最详细NER实战讲解-bilstm+crf(5)生成映射字典_ner label to id

ner label to id

我们要将每一个字 分词边界 词性 偏旁部首 拼音都要映射成向量

现在要来统计里面有多少个不同的字 标签 分词边界这些 然后做成idtolabel labeltoid这种(这个在我们之前做QA的时候也用过)

送到模型之前 要把里面每一个字都转化成下标 然后在模型里根据不同的下表映射成不同的向量

#为什么要对句子长短进行排序?    
#因为到时候喂入模型 都是拿若干个句子为一批次送入模型
#如果长短差距非常大 就会导致结果非常差
#每次填充是是以最长的句子作为标准 如果长短差距过大 padding就会过多

也会减慢训练速度  因为要一直等长句子

  1. #为什么要对句子长短进行排序?
  2. #因为到时候喂入模型 都是拿若干个句子为一批次送入模型
  3. #如果长短差距非常大 就会导致结果非常差
  4. #每次填充是是以最长的句子作为标准 如果长短差距过大 padding就会过多
  5. from collections import Counter
  6. import pickle
  7. def mapping(data, threshold=10, is_word=False, sep='sep'): # 返回词频
  8. count = Counter(data)
  9. if sep is not None:
  10. count.pop('sep')
  11. if is_word:
  12. # 如果句子长度不一致 就补PPPPPP然后送到lstm
  13. count['PAD'] = 10000001
  14. count['UNK'] = 10000000
  15. data = sort(count.items(), key=lambda x:x[1]), reverse=True)
  16. data = [x[0] for x in data if x[1]>=threshold] # 去掉频率小区10的元素
  17. # 删掉未登录词 因为可能有的偏旁部首在训练集有但是在测试集里没有 字的话就设置成unknown
  18. # bound 就只有BEMS四种
  19. id2item=data
  20. item2id={id2item[i]:i for i in range(len(id2item))}
  21. else:
  22. count['PAD'] = 10000001
  23. data = sort(count.items(), key=lambda x:x[1]), reverse=True)
  24. data = [x[0] for x in data]
  25. id2item=data
  26. item2id={id2item[i]:i for i in range(id2item)}
  27. return id2item,item2id
  28. def get_dict():
  29. map_dict = {}
  30. from glob import glob # 遍历文件的一个工具
  31. all_w = []
  32. all_bound = []
  33. all_flag = []
  34. all_label = []
  35. all_radical = []
  36. all_pinyin = []
  37. # 要把上面的东西都拿到
  38. for file in glob('data/prepare/train/*.csv')+glob('data/prepare/test/*.csv'):
  39. # 遍历到目录下以.csv为扩展名的每一个文件
  40. df = pd.read_csv(file, sep=',') # 拿到每一个文件
  41. all_w += df['word'].tolist()
  42. all_bound += df['bound'].tolist()
  43. all_flag += df['flag'].tolist()
  44. all_label += df['label'].tolist()
  45. all_radical += df['radical'].tolist()
  46. all_pinyin += df['pinyin'].tolist()
  47. map_dict['word']=mapping(all_w, threshold=20, is_word=True)
  48. map_dict['bound']=mapping(all_bound)
  49. map_dict['flag']=mapping(all_flag)
  50. map_dict['label']=mapping(all_label)
  51. map_dict['radical']=mapping(all_radical)
  52. map_dict['pinyin'] = mapping(all_pinyin)
  53. return map_dict
  54. with open(f'data/prepare/dict.pkl', 'wb') as f:
  55. pickle.dump(map_dict, f)
  56. # 生成dict.pkl
  57. if __name__ =='__main__':
  58. multi_process(split_text)
  59. print(get_dict())
  60. # 测试一下 打开文件with open(f'data/prepare/dict.pkl','rb') as f:
  61. # data = pickle.load(f)
  62. # print(data['bound'])

输出结果

字典在训练的时候用 把数据转化成下标

预测的时候 用list 根据下标转化成对应的标记 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/826401
推荐阅读
相关标签
  

闽ICP备14008679号