这是字符级 BPE,而且每轮只能合并一次。先把字符串拆成字符列表,给每条规则记下它在 merges 里的下标,下标越小越优先。
每一轮扫描当前所有相邻对。能在规则里找到的,用(优先级,位置)比较,取最小的那一对合并成一个新 token。合并会改变左右邻居,所以必须合并完再重新扫描,不能在同一轮里把所有不重叠的对一起并掉。没有任何相邻对还能合并时停止,再按词表输出 id。
实现字符级 BPE 编码。给定字符串 text、合并规则 merges 和词表 vocab,返回 token id 列表。
先把 text 拆成单个字符。然后反复检查相邻 token 是否能按 merges 合并。merges 里下标越小优先级越高。每一轮只合并一次:在当前还能合并的相邻对里,选优先级最高的;优先级相同就选最左边。合并后再检查新的相邻对,直到没有任何一对出现在规则里。
最后按 vocab 把剩下的 token 换成 id,按从左到右的顺序返回。保证最终每个 token 都在词表里。规则里的二元组互不相同。token 本身不含空格。
实现 class Solution 的 encode(self, text, merges, vocab)。text 是字符串,merges 是二元组列表,vocab 是 token 到 id 的字典,返回 id 列表。
第一行是 text。
第二行一个整数 m,表示规则条数。接下来 m 行,每行两个 token,表示一条合并规则,顺序就是优先级。
接下来一行一个整数 v。再接下来 v 行,每行一个 token 和一个整数 id。
1≤∣text∣≤2000
0≤m≤400
token 只含小写字母,不含空格。
一行,按顺序输出 id,用空格隔开。
输入
abcab
3
a b
b c
ab c
6
a 0
b 1
c 2
ab 3
bc 4
abc 5
输出
5 3
说明
开始是 a b c a b。规则 (a,b) 优先级最高,而且出现了两次,先并最左边,得到 ab c a b,再并右边,得到 ab c ab。接着 (ab,c) 把左边合成 abc。abc 的 id 是 5,ab 的 id 是 3。
输入
ab
0
2
a 0
b 1
输出
0 1
说明
没有合并规则,两个字符各自对应词表里的 id。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册