当前位置: 首页 > news >正文

如何将生物序列tokenization为token?

原理讲解

tokenization是自然语言处理领域非常成熟的一项技术,tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。


在生物领域,如何把核苷酸或氨基酸序列tokenization成token呢?

我们可以使用k-mer技术: k-mer指的是将k个序列单元作为一个滑动窗口,从第一个序列单元开始扫描,提取出序列中的k-mer。然后我们再对k-mer建立索引。


如下图所示,我们采用了3-mer窗口将“AGCACT”每次滑动1个碱基。

3-mer
3-mer

k-mer技术有两个可选值:窗口大小k值和k-mer的滑动步长

tokenization示意图
tokenization示意图

为什么不使用one-hot编码和直接将AGCT编码为1 2 3 4进行序列的tokenization呢?而且这样占用的内存要小很多。

原因在于:功能序列一般都是多核苷酸或多氨基酸,k-mer技术可以将一段序列表示为1个数字,模型记住1个数字要比记住k个数字容易的多。


代码实现:利用k-mer技术把核苷酸或氨基酸序列tokenization成token

def seq2kmer(file_dir, k):
    """
    将file文件中的序列转换为 kmers,滑动步长固定为1
    :param file_dir: 原始序列文件路径
    :param k: 自定义窗口大小
    :return:
    "
""

    """读取示例数据,由于示例数据是多行的,为了避免换行符对结果产生影响,需要将多行字符串转换为单行字符串。"""
    with open(file_dir) as object:
        contents = object.read()

    seq = contents.replace('\n''')  # contents.replace('\n', '') 将换行符全都去掉,将行与行紧密相连。

    kmer = [seq[x:x + k] for x in range(len(seq) - k + 1)]
    kmers = " ".join(kmer)  # .join(kmer) 将列表kmer连接成一个字符串,kmer之间用空格分隔。
    """输出1:将转换为的的kmers保存到txt文本中。"""
    with open(f"{k}mers_{file_dir}""w") as object:
        object.write(kmers)

    from itertools import product
    nucleotides = 'ACGT'
    """生成所有kmers"""
    kmers_all = [''.join(combination) for combination in product(nucleotides, repeat=k)]  # 使用itertools.product生成所有可能的组合
    """输出2:穷举生成所有kmers,并保存到txt文本中。"""
    with open(f"{k}mers_all.txt""w") as object:
        contents = str(kmers_all)
        object.write(contents)

    """输出3:将file_dir文件的kmers索引写入txt文本"""
    index = [kmers_all.index(seq[x:x + k]) for x in range(len(seq) - k + 1)]
    with open(f"index_{k}mers_{file_dir}""w") as object:
        object.write(str(index))


# 使用示例数据运行seq2kmer
k = 6
seq2kmer("acrA.txt", k)

输入文件和结果文件


输入文件acrA.txt和生成的三个文件
输入文件acrA.txt和生成的三个文件

输入文件acrA.txt
输入文件acrA.txt

6mers_acrA.txt
6mers_acrA.txt

6mers_all.txt
6mers_all.txt

index_6mers_acrA.txt
index_6mers_acrA.txt

注意:以上代码暂未将[CLS]分类token、[PAD]填充token、[UNK]未知token、[SEP]分句token和[MASK]掩码token(“[]” 也是token的一部分)加入到词汇表中


谢谢阅读

本文由 mdnice 多平台发布


http://www.mrgr.cn/news/33146.html

相关文章:

  • 速盾:cdn 支持 php 吗?
  • 【Linux】进程的概念
  • 大语言模型理论基础
  • Redis - 哨兵(Sentinel)
  • 探索Python的HTTP利器:Requests库的神秘面纱
  • 软件测试必学的16个高频数据库操作及命令
  • C++ 笔试常用算法模板
  • Python | Leetcode Python题解之第423题从英文中重建数字
  • ESP32-WROOM-32 [ESP连接路由器+TCP Client 透传 + TCP Server数据发送]
  • C++ | Leetcode C++题解之第424题替换后的最长重复字符
  • Linux:login shell和non-login shell以及其配置文件
  • 注册建造师执业工程规模标准(电力工程)
  • Python 数据类型
  • 使用Postman测试MQTT协议接口
  • 【数据结构与算法】LeetCode:哈希表
  • 在 Linux (aarch64) 编译 OpenJDK 8
  • [Redis][List]详细讲解
  • 每天五分钟玩转深度学习pytorch:L1正则化和L2正则化的应用
  • WPF入门教学九 样式与模板
  • Kubeadm安装k8s集群
  • [产品管理-32]:NPDP新产品开发 - 30 - 文化、团队与领导力 - 领导力与团队的可持续发展
  • 2024/9/21 数学20题
  • 电机学习-有感BLDC开环控制(六步换相)
  • l2p论文环境安装(2) 复刻源码低版本环境版
  • docker minio启动命令
  • 【TypeScript】 数据类型