BPE(Byte-Pair Encoding )代码实现

BPE 是使用最广泛的sub-word tokenization算法之一。尽管贪婪,但它具有良好的性能,并被作为机器翻译等主流NLP任务的首选tokenize方法之一。

BPE算法原理传送门

1. Byte-Pair Encoding Tokenizer Training


import pandas as pd

# Import gc, a library for controlling the garbage collector
import gc

# Import various classes and functions from the tokenizers library, which is used for creating and using custom tokenizers 
from tokenizers import (
    decoders,
    models,
    normalizers,
    pre_tokenizers,
    processors,
    trainers,
    Tokenizer,
)

# Import PreTrainedTokenizerFast, a class for using fast tokenizers from the transformers library
from transformers import PreTrainedTokenizerFast

# Import TfidfVectorizer, a class for transforming text into TF-IDF features
from sklearn.feature_extraction.text import TfidfVectorizer

# Import tqdm, a library for displaying progress bars 
from tqdm.auto import tqdm

# Import Dataset, a class for working with datasets in a standardized way 
from datasets import Dataset

# Set the LOWERCASE flag to False
LOWERCASE = False 

# Set the VOCAB_SIZE to 10000000.
# This means that the maximum number of words in the vocabulary will be 10 million.
VOCAB_SIZE = 10000000
test = pd.read_csv(
### BPE 算法原理 Byte-Pair Encoding (BPE) 是一种基于统计的子词分词方法,最初是一种数据压缩技术,后来被应用于自然语言处理领域。其核心思想是通过迭代地合并语料库中最常出现的连续字节对(或字符对)来生成一组子词单元。这一过程可以分为以下几个步骤: 1. **初始化**:将语料库中的每个单词拆分为字符序列,并在每个字符之间插入一个特殊符号(如“_”)表示单词边界。然后统计每个字符对的出现频率。 2. **合并最频繁的字节对**:找到语料库中出现频率最高的字节对,并将其合并为一个新的子词单元。例如,如果“a”和“b”是最常出现的字节对,则将它们合并为“ab”。 3. **更新语料库并重复**:在合并之后,更新语料库中的字符对频率,并重复上述步骤,直到达到预设的词汇表大小或者合并次数。 4. **生成最终的子词词表**:最终的子词词表包含原始字符和所有合并生成的新子词单元,这些子词单元可以用于文本的分词处理 [^1]。 ### 应用场景 BPE 在自然语言处理领域有广泛的应用,主要体现在以下几个方面: - **机器翻译**:BPE 可以显著减少词汇表的大小,同时保留语言的子词结构,使得翻译模型能够更好地处理未见过的单词。例如,在神经机器翻译(NMT)任务中,使用 BPE 进行分词可以有效提升模型的泛化能力 。 - **文本分类**:通过将文本分解为子词单元,BPE 能够捕捉到文本的语义信息,从而提高分类模型的准确性 [^2]。 - **文本生成**:在生成式语言模型中,BPE 能够帮助模型处理罕见词和新词,使得生成的文本更加自然流畅 [^2]。 - **多语言处理**:由于 BPE 的子词单元是基于统计生成的,因此它能够适应不同语言的特性,适用于多语言的 NLP 任务 。 ### 示例代码 以下是一个使用 Python 实现 BPE 的简单示例: ```python from collections import defaultdict def get_vocabulary(text): vocab = defaultdict(int) for word in text.split(): vocab[' '.join(word)] += 1 # 在字符之间插入空格 return vocab def get_most_frequent_pair(vocab): pairs = defaultdict(int) for word, freq in vocab.items(): chars = word.split() for i in range(len(chars) - 1): pair = (chars[i], chars[i+1]) pairs[pair] += freq return max(pairs, key=pairs.get) def merge_pair(vocab, pair): merged_vocab = defaultdict(int) for word, freq in vocab.items(): merged_word = word.replace(f' {pair[0]} {pair[1]} ', f' {pair[0]+pair[1]} ') merged_vocab[merged_word] += freq return merged_vocab text = "low lowest newer newest" vocab = get_vocabulary(text) print("Initial Vocabulary:", vocab) for _ in range(3): # 合并3次 pair = get_most_frequent_pair(vocab) print(f"Merging pair: {pair}") vocab = merge_pair(vocab, pair) print("Updated Vocabulary:", vocab) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值