语言模型编码中/英文句子格式详解

文章目录

前言

最近一直在学习多模态大模型相关内容,特别是图像CV与语言LLM模型融合方法,如llama-1.5、blip、meta-transformer、glm等大模型。其语言模型的中文和英文句子如何编码成计算机识别符号,使我困惑。我查阅资料,也发现很少有博客全面说明。为此,我以该博客记录其整过过程,并附有对应代码供读者参考。

处理语言模型需要将英文或中文等字符表示成模型能识别的符号,为此不同模型会按照某些方法表示,但不同模型转计算机能识别思路是一致的。

一、Bert的vocab.txt内容查看

来源tokenization.py文件内容。

c 复制代码
PRETRAINED_VOCAB_ARCHIVE_MAP = {
    'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt",
    'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt",
    'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt",
    'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt",
    'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt",
    'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt",
    'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt",
}

vocab.txt内容:

上图是我截取vocab.txt的内容,基本很多有的符号/数字/运算符/中文/字母/单词等均在该txt文件夹中。

二、BERT模型转换方法(vocab.txt)

加入有2句话,分别为text01与text02(如下),他们会转换vocab.txt中已有的单词形式。其中需要留意:'##符号连接长单词在vocab.txt部件方式,如embeddings表示为['em','##bed','##ding','s']。同时,vocab.txt不存在单词部件会化成最小组件,单个字母(vocab.txt最小部件是字母)。

代码如下:

c 复制代码
from pytorch_pretrained_bert import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('../voccab.txt')

text01 = "Here is the sentence I want embeddings for."
text02 = "wish for world peace."
marked_text = "[CLS] " + text01 + " [SEP] " + text02 + " [SEP]"
print('marked_text = ', marked_text)

tokenized_text = tokenizer.tokenize(marked_text)
print('tokenized_text = ', tokenized_text)


indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)

for tup in zip(tokenized_text, indexed_tokens):
    print("tup = ", tup)

marked_text是将句子使用符号分开表示其句子含义;

tokenized_text表示将句子化成vocab.txt文件提供的部件,其中##bed有单独表示;

tup = ('[CLS]', 101)后的内容表示其符号对应的索引。

其结果如下:

c 复制代码
marked_text =  [CLS] Here is the sentence I want embeddings for. [SEP] wish for world peace. [SEP]
tokenized_text =  ['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]', 'wish', 'for', 'world', 'peace', '.', '[SEP]']

tup =  ('[CLS]', 101)
tup =  ('here', 2182)
tup =  ('is', 2003)
tup =  ('the', 1996)
tup =  ('sentence', 6251)
tup =  ('i', 1045)
tup =  ('want', 2215)
tup =  ('em', 7861)
tup =  ('##bed', 8270)
tup =  ('##ding', 4667)
tup =  ('##s', 2015)
tup =  ('for', 2005)
tup =  ('.', 1012)
tup =  ('[SEP]', 102)
tup =  ('wish', 4299)
tup =  ('for', 2005)
tup =  ('world', 2088)
tup =  ('peace', 3521)
tup =  ('.', 1012)
tup =  ('[SEP]', 102)

总结:最终词汇等内容转为对应的索引数字表达。

三、vocab内容与模型转换对比

从图中可知,vocab的索引值总比模型给出索引值小1,这是因为模型从0开始索引,而vocab展示内容从1开始,因此相差1。

再次强调:模型对词汇编码实际为人为给出对应表(如:vocab.txt)所对应的索引,用索引值替换词语。

四、中文编码

以上内容已全部告知读者,模型如何编码句子。而该部分内容是拓展,使用中文编码,查看其结果。

代码如下:

c 复制代码
from pytorch_pretrained_bert import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('../voccab.txt')
text01 = "the sentence I want embeddings for."
text02 = "愿世界和平。"
marked_text = "[CLS] " + text01 + " [SEP] " + text02 + " [SEP]"
print('marked_text = ', marked_text)
tokenized_text = tokenizer.tokenize(marked_text)
print('tokenized_text = ', tokenized_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
for tup in zip(tokenized_text, indexed_tokens):
    print("tup = ", tup)

结果如下:

c 复制代码
marked_text =  [CLS] the sentence I want embeddings for. [SEP] 愿世界和平。 [SEP]
tokenized_text =  ['[CLS]', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]', '[UNK]', '世', '[UNK]', '和', '平', '。', '[SEP]']
tup =  ('[CLS]', 101)
tup =  ('the', 1996)
tup =  ('sentence', 6251)
tup =  ('i', 1045)
tup =  ('want', 2215)
tup =  ('em', 7861)
tup =  ('##bed', 8270)
tup =  ('##ding', 4667)
tup =  ('##s', 2015)
tup =  ('for', 2005)
tup =  ('.', 1012)
tup =  ('[SEP]', 102)
tup =  ('[UNK]', 100)
tup =  ('世', 1745)
tup =  ('[UNK]', 100)
tup =  ('和', 1796)
tup =  ('平', 1839)
tup =  ('。', 1636)
tup =  ('[SEP]', 102)

图显示:

可发现,和上面英文句子编码是一样的。

总结

一句话,模型是根据提供对应表,将中/英文句子或符号编译成对应索引,被计算识别。

相关推荐
martian66544 分钟前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础
人机与认知实验室2 小时前
人、机、环境中各有其神经网络系统
人工智能·深度学习·神经网络·机器学习
黑色叉腰丶大魔王2 小时前
基于 MATLAB 的图像增强技术分享
图像处理·人工智能·计算机视觉
迅易科技5 小时前
借助腾讯云质检平台的新范式,做工业制造企业质检的“AI慧眼”
人工智能·视觉检测·制造
古希腊掌管学习的神6 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI6 小时前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长7 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME8 小时前
知识库管理系统可扩展性深度测评
人工智能
海棠AI实验室8 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself8 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot