Datawhale AI夏令营——催化反应产率预测方向Task3

小白学习笔记,如有错误麻烦各位大佬指正

Transformer建模SMILES进行反应产率预测

一、baseline代码跑通流程及分析

1.导入压缩包
2.建好文件夹目录(参照往期笔记)
3.在code文件夹里加入Task3的文件(Datawhale教程内)
4.代码:安装环境
# !pip install torchtext
!pip install pandas
5.导入库
import pandas as pd  #用于处理结构化数据。
from torch.utils.data import Dataset, DataLoader, Subset  #用于数据加载和批处理的模块。
from typing import List, Tuple  #用于类型提示,指定变量的类型为列表和元组。
import re   #用于处理文本数据。
import torch   
import torch.nn as nn   #构建神经网络模型的基础。
import time   #时间处理模块。
import torch.optim as optim   #优化器模块。
6.自定义SMILES
# tokenizer,鉴于SMILES的特性,这里需要自己定义tokenizer和vocab
# 这里直接将smiles str按字符拆分,并替换为词汇表中的序号
class Smiles_tokenizer():
    def __init__(self, pad_token, regex, vocab_file, max_length):  #初始化函数
        self.pad_token = pad_token  #从参数中获取填充标记
        self.regex = regex     #从参数中获取正则表达式模式
        self.vocab_file = vocab_file  #从参数中获取词汇表文件路径 
        self.max_length = max_length  #从参数中获取最大长度限制

        with open(self.vocab_file, "r") as f:  #打开词汇表文件
            lines = f.readlines()
        lines = [line.strip("\n") for line in lines]  #每行去除换行符
        vocab_dic = {}
        for index, token in enumerate(lines):
            vocab_dic[token] = index
        self.vocab_dic = vocab_dic    #作为词汇表中的一个token,构建词汇字典

    def _regex_match(self, smiles):   #正则表达式匹配
        regex_string = r"(" + self.regex + r"|"
        regex_string += r".)"   #构建包含正则表达式模式和单字符的字符串 
        prog = re.compile(regex_string)

        tokenised = []
        for smi in smiles:
            tokens = prog.findall(smi)
            if len(tokens) > self.max_length:  #长度超过最大长度,则进行截断
                tokens = tokens[:self.max_length]
            tokenised.append(tokens) # 返回一个所有的字符串列表
        return tokenised
    
    def tokenize(self, smiles):   #对SMILES字符串进行token化,并将token映射为整数索引
        tokens = self._regex_match(smiles)
        # 添加上表示开始和结束的token:<cls>, <end>
        tokens = [["<CLS>"] + token + ["<SEP>"] for token in tokens]
        tokens = self._pad_seqs(tokens, self.pad_token)
        token_idx = self._pad_token_to_idx(tokens)
        return tokens, token_idx   #回tokens列表和对应的索引列表

    def _pad_seqs(self, seqs, pad_token):   #对tokens列表进行填充,使其长度相同
        pad_length = max([len(seq) for seq in seqs])  #计算所有tokens列表中最长的长度 
        padded = [seq + ([pad_token] * (pad_length - len(seq))) for seq in seqs]  #将长度不足的部分填充到与最长列表相同的长度
        return padded

    def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值