Kaggle_NBME NLP比赛Baseline详解(2)
这部分主要讲代码
分四个部分讲解
1.Dataset设计
2.Model设计
3.Loss函数设计
4.一些QA
1.Dataset设计
目标:每次迭代计算的时候要取出部分数据放入模型
实现的方法:继承torch.utils.data.Dataset
具体转化方法:先定义一个prepare_input的方法将文本转化为tensor
再定义一个create label的方法将annotation的标记转化为tensor
我们碰到nlp问题的时候 一定要搞清楚模型的输入和输出是什么 其实现在都在用bert那套框架 只要理解我们模型的输入和输出长什么样子就可以很好的套用模型的框架来解决问题
因为我们的模型不能一次性把我们的数据加入到我们显存里 所以我们就要一个batch的把数据送进去 完成梯度更新 然后一步一步迭代的过程
我们只需要准备两个函数 prepare_input 和create label train data
def prepare_input(cfg, text, feature_text):# 调用transformers里tokenizer的方法 然后把text和feature_text一起放到tokenizer里面后就会有一个输出inputs = cfg.tokenizer(text, feature_text, add_special_tokens=True, max_length=CFG.max_len, padding='max_length',return_offsets_mapping=False)for k, v in inputs.items():inputs[k] = torch.tensor(v, dtype=torch.long)return inputs
# 调用transformers里tokenizer的方法 然后把text和feature_text一起放到tokenizer里面后就会有一个输出 输出的话就是 input_ids(对输入的句子转化成数字的结果),attention_mask(这里面全部是1,表示让模型关注里面的所有词),token_types_ids(用来表示返回的数字编码中,哪些属于第一个句子,哪些属于第二个句子 0属于第一句话 1属于第二句话)这几个k 具体可以看这篇文章(yosemite1998) train_data:就是一个带标记的训练数据
###data loading
train = pd.read_csv('你的路径')
train['annotation'] = train['annotation'].apply(ast.literal_eval)
# ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要# 计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
train['location'] = train['location'].apply(ast.literal_eval)
features = pd.read_csv('。。。')
def preprocess_features(features):features.loc[27, 'feature_text'] = 'Last-Pap-swear-1-year-ago'return features
features = preprocess_features(features)
patient_notes = pd.read_csv('...')
print(train features patient_notes的shape)
输出结果
train_data
可以看到shape 14300行 6列
这6列表示的意思我们上节讲过了
pn_num -- patient note 病例id 病历号
case_num -- case num用来关联起病人patient note的文本描述和对应症状的文本描述
feature_num 每个病症的id
annotation :patient note中体现相关症状的描述 病例中可能对同一个疾病症状存在多处描述
location: annotation 所在的病例中char级别的位置
feature
patient_notes
然后我们要把这些数据merge一下
train和features patient_notes数据merge 起来
train = train.merge(features, on=['feature_num', 'case_num'], how='left')
train = train.merge(patient_notes, on=['pn_um', 'case_num'], how='left')
train['pn_history'] = train['pn_history'].apply(lambda x:x.replace('dad with recent heart attcak', 'dad with recent heart attack')) #这里看到一个错别字 改一下
完整的train
然后会写一些incorrect annotation的修正
照这样写
train.loc[338, 'annotation'] = ast.literal_eval('[["father heart attack"]]')
train.loc[338, 'location'] = ast.literal_eval('[["764 783"]]')
然后看dataset的完整代码
def prepare_input(cfg, text, feature_text):# 调用transformers里tokenizer的方法 然后把text和feature_text一起放到tokenizer里面后就会有一个输出inputs = cfg.tokenizer(text, # text就相当于paragraphfeature_text, # 就相当于questionadd_special_tokens=True,
# 是否要把seq cls加到句子里面max_length=CFG.max_len,
# 354 如果不够354就要paddingpadding='max_length', # return_offsets_mapping=False)
# return_offsets_mapping 会在create label里面用到for k, v in inputs.items():inputs[k] = torch.tensor(v, dtype=torch.long)return inputsdef create_label(cfg, feature, text, annotation_length, location_list, answers):encoded = cfg.tokenizer(feature, #疾病名称text, # 病例add_special_tokens=True,
# 把cls,sep加到输出中 max_length=CFG.max_len, padding='max_length', return_offsets_mapping=True )offset_mapping = encoded['offset_mapping']squence_ids = encoded.sequence_ids()ignore_idxes = np.where(np.array(encoded.sequence_ids()) !=1)[0] # 找到不需要算入loss的indexlabel = np.zeros(len(offset_mapping))label[ignore_idxes] = -1for label_ids, location in enumerate(test_location):loaction = [s.split() for s in location.split(';')]for loc in location:answer = test_answers[label_ids]start_char = int(loc[0])end_char = start_char+len(answer)# token start indextoken_start_index = 0while squence_ids[token_start_index] != 1:token_start_index += 1# token end indextoken_end_index = len(offset_mapping)-1while squence_ids[tokens_end_index] != 1:token_end_index -= 1while token_start_index < len(offset_mapping) and offset_mapping[token_start_index][0] <= start_char:token_start_index += 1token_start_index -= 1while offset_mapping[token_end_index][1] >= end_char:token_end_index -= 1token_end_index += 1label[token_start_index:token_end_index+1] = 1.0return torch.tensor(label, dtype=torch.float)class TrainDataset(Dataset):def __init__(self, cfg, df):self.cfg = cfgself.feature_texts = df['features_text'].valuesself.pn_historys = df['pn_history'].valuesself.annotation_lengths = df['annotation_length'].valuesself.locations = df['location'].valuesdef __len__(self):return len(self.feature_texts)def __getitem__(self, item):inputs = prepare_input(self.cfg, self.pn_historys[item],self.feature_texts[item])label = create_label(self.cfg,self.pn_historys[item],self.feature_texts[item]self.annotation_length[item],self.location[item])return inputs, label
token_types_id 0表示第一句话 1表示第二句话
解释一下offsets_mapping: tokenizer 之后 会把一个词拆成两个词或者更多 拆成这种token以后 要 把token映射回去 就是每个token对应的原文中所在的char的位置
(0,0)就是cls or sep token在原文中没有映射
例:CFG.tokenizer.decode(encode['input_ids'][1]) 输出 'Family'
再说一下 sequence_ids
encoded.sequence_ids() 输出为
就是0表示第一句话 1表示第二句话 cls sep padding都为none
通过原文的char级别信息 映射回label上 需要转成和原文输出长度一样的0,1 sequence tensor
0表示没有出现相关疾病的表现
下节继续~
Kaggle_NBME NLP比赛Baseline详解(2)相关推荐
- 【NLP】Transformer详解
[NLP]Transformer详解 Transformer在Google的一篇论文Attention is All You Need被提出,为了方便实现调用Transformer Google还 ...
- NLP技术路线详解:这是从数学到算法的艺术
自然语言处理路线图详解,从数学基础.语言基础到模型和算法,这是你该了解的知识领域. 自然语言处理很多时候都是一门综合性的学问,它远远不止机器学习算法.相比图像或语音,文本的变化更加复杂,例如从预处理来 ...
- 【NLP】word2vec详解
前言 word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量的工具包,它简单.高效,因此引起了很多人的关注.word2vec 可以根据给定的语料库,通过优化后的训练模型快 ...
- 【NLP】Word2Vec详解(含数学推导)
word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:并且,该工具得到的训练结果--词向量(word embedding),可以很好地度量词与词之间的相似性.随着深度学习(Deep L ...
- NLP之——Word2Vec详解
2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:其次,该工具得到的训 ...
- NLP重要模型详解,换个方式学(内附资源)
(图片有AI科技大本营付费下载自视觉中国) 作者 | Jaime Zornoza,马德里技术大学 译者 | 陈之炎 校对 | 王威力 编辑 | 黄继彦 来源 | 数据派THU(ID:DatapiTHU ...
- 【NLP】全面详解 | 深度学习中的注意力机制(一)
NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 目前深度学习中热点之一就是注意力机制(Attention Mechanisms).Attention源于人类视觉系统,当 ...
- 送书福利 | 哈工大SCIR倾力打造NLP新书,详解预训练语言模型
车万翔,郭江,崔一鸣 著 电子工业出版社-博文视点 2021-07-01 ISBN: 9787121415128 定价: 118.00 元 新书推荐 ????今日福利 |关于本书| 自然语言处理被誉为 ...
- 哈工大SCIR倾力打造NLP新书,详解预训练语言模型
自然语言处理被誉为"人工智能皇冠上的明珠"! 深度学习等技术的引入为自然语言处理技术带来了一场革命,近年来也出现了自然语言处理的新范式. 为什么自然语言是"人工智能皇冠上 ...
最新文章
- 正则表达式模式修正符
- 通过神经图稳定对脑机接口的即插即用控制,四肢瘫痪患者可以轻松控制电脑光标...
- 人工智能论坛_浙江大学人工智能论坛在北京召开
- 夏天有稍微热一点的说法,但是没有冬天没有稍微冷一点的说法
- context:component-scan使用说明
- 隔离型RS232串口电路
- python list去重时间复杂度_List集合去重的一种方法 z
- DataReader终结篇
- Acer 4750 安装黑苹果_自己安装黑苹果,其实黑苹果也没那么难~
- Chaarshanbegaan at Cafebazaar 水题
- 『计算机视觉』Mask-RCNN_训练网络其一:数据集与Dataset类
- 分屏如何保持运行状态_如何提升心理素质,在比赛中保持更好的状态
- Infopath入门到精通系列-3 Infopath manifest.xsf文件 解析
- 矢量绘图工具 Ipe
- php的电阻率是多少,PTF65517KBT-10B14
- buu——girlfriend
- golang 解析 --- 进程,线程,协程
- centos7.5.1804配置本地yum源和阿里云yum源以及163源
- 文件下载中文名乱码问题
- vi编辑器 末尾添加_vi编辑器操作指令分享