如何将生物序列tokenization为token?
原理讲解
tokenization是自然语言处理领域非常成熟的一项技术,tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。
在生物领域,如何把核苷酸或氨基酸序列tokenization成token呢?
我们可以使用k-mer技术: k-mer指的是将k个序列单元作为一个滑动窗口,从第一个序列单元开始扫描,提取出序列中的k-mer。然后我们再对k-mer建立索引。
如下图所示,我们采用了3-mer窗口将“AGCACT”每次滑动1个碱基。
k-mer技术有两个可选值:窗口大小k值和k-mer的滑动步长
为什么不使用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)
输入文件和结果文件
注意:以上代码暂未将[CLS]分类token、[PAD]填充token、[UNK]未知token、[SEP]分句token和[MASK]掩码token(“[]” 也是token的一部分)加入到词汇表中
谢谢阅读
本文由 mdnice 多平台发布