tokenization方法(自用)

本文介绍了文本分析中tokenization的关键步骤,包括词粒度、字粒度问题以及子词粒度(如BPE和WordPiece)的解决方案。重点讨论了如何处理大词汇量、OOV问题和保留语义,同时提及了GPT-2和RoBERTa所用的BPE算法以及Bert的WordPiece策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在文本分析和文本模型构建过程中,第一步都需要将文本转化为数字,这样计算机才能去处理,这一过程称之为tokenization。tokenization是将文本句子切分成一个个子单元,然后将子单元数值化(映射成向量),接着将这些向量输入到模型进行编码,最后输出到下游任务中进一步得到最终结果。它为数值化作准备,数值化的过程必然需要映射,而映射又需要一个目标集合或者说映射表,其难点在于如何获得理想的切分,使文本中所有的token都具有正确的语义,并且不会存在OOV问题。

        tokenization方法分为三类:词粒度、字粒度、子词粒度(subword)。

词粒度问题:

        1、超大规模词典,比如中文的常用词可以达到20W个

        2、OOV问题

        3、词典存在大量相似词,如如由"look"衍生出的"looks", "looking", "looked",意思相近但会被当作不同的词处理,训练冗余,大词汇量。

字粒度问题:

        1、失去语义信息;

        2、模型输入过长,收敛困难

子词力度方法:目前有三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE), WordPiece和Unigram Language Model。

BPE (GPT)

        简单有效,是主流的方法。GPT-2RoBERTa使用的Subword算法都是BPE。

        BPE获得Subword的步骤如下:

  1. 准备足够大的训练语料,并确定期望的Subword词表大小;
  2. 将单词拆分为成最小单元。比如英文中26个字母加上各种符号,这些作为初始词表;
  3. 在语料上统计单词内相邻单元对的频数,选取频数最高的单元对合并成新的Subword单元;
  4. 重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1。

        BPE是统计词对的频数,每次挑选频数最大的那个作为word unit。

     详细例子及过程见:NLP-Tokenizer-BPE算法原理及代码实现 - 知乎 (zhihu.com)

WordPiece (Bert)

        Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。

        与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表

  1. 先构建一个基础的char级别的vocabulary
  2. 然后利用语言模型计算句子似然概率值
  3. 合并词后的得到一个词库中没有的新词,然后重新计算句子的似然概率值,
  4. 回到第2步,直到vocabulary size已经达到了之前设定的值或者似然概率值的增长小于设定的thresold

参考:



NLP-Tokenizer-BPE算法原理及代码实现 - 知乎 (zhihu.com)
NLP三大Subword模型详解:BPE、WordPiece、ULM - 知乎 (zhihu.com)LLM大语言模型之Tokenization分词方法(WordPiece,Byte-Pair Encoding (BPE),Byte-level BPE(BBPE)原理及其代码实现) - 知乎 (zhihu.com)

### 关于自然语言处理中的分词概念 文本分词是将连续的字符序列按照一定的规则切分成具有语义合理性的词语片段的过程[^1]。这一过程对于不同语言有着不同的挑战;例如,英文可以通过空格来较为容易地区分单词边界,而中文则缺乏明显的词间分隔符。 #### 基础分词方法 基础的分词方式主要包括简单依据空白字符或标点符号来进行切割。这种方式适用于像英语这样有明显间隔的语言环境。然而,这种方法并不总是能给出最理想的分词效果,尤其是在面对诸如缩写形式(如 I.B.M)、称呼前缀(如 Mr.)等情况时可能会出现问题[^4]。 ```python import re def simple_tokenizer(text): # 使用正则表达式匹配非字母数字字符作为分隔符 tokens = re.split(r'\W+', text.lower()) return [t for t in tokens if t] text_example = "Hello, how are you?" print(simple_tokenizer(text_example)) ``` #### 复杂分词技术 为了提高准确性,还可以采用更加先进的算法和技术: - **基于统计的方法**:通过计算相邻字串共现频率构建n-gram模型,以此预测最优的词语划分方案。 - **基于机器学习的方式**:利用监督学习训练特定类型的分类器(如条件随机场CRF、最大熵MaxEnt),让其学会识别正确的词汇边界位置。 以下是使用Python NLTK库实现的一个例子,该库提供了多种内置工具支持高效完成高质量的分词操作: ```python import nltk from nltk.tokenize import word_tokenize # 下载必要的资源包 nltk.download('punkt') sample_text = "Hello, how are you?" # 应用NLTK自带的word_tokenize函数进行分词 result_tokens = word_tokenize(sample_text) for idx, tok in enumerate(result_tokens, start=1): print(f'Token {idx}: "{tok}"') ``` 此外,TensorFlow Keras API同样提供了一个简易接口用于快速创建并适应自定义语料库特征提取需求的Tokenizer对象[^2]: ```python from tensorflow.keras.preprocessing.text import Tokenizer sentences_list = [ 'i love my dog', 'I, love my cat', 'You love my dog!' ] keras_tokenizer = Tokenizer(num_words=100) keras_tokenizer.fit_on_texts(sentences_list) # 输出词汇表映射关系 print(keras_tokenizer.word_index) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值