HuggingfaceNLP笔记6.7Unigram tokenization

Unigram算法常用于SentencePiece中,这是Albert、T5、mBART、Big Bird和XLNet等模型使用的分词算法。

💡 本节将深入讲解Unigram,包括完整的实现过程。如果你只想了解分词算法的概要,可以跳到最后。

训练算法

与BPE和WordPiece不同,Unigram的工作方式相反:它从一个大型词汇表开始,然后逐步移除其中的词汇,直到达到所需的词汇大小。构建基础词汇表的方法有很多种,例如,我们可以取预处理单词中最常见的子串,或者在初始语料库上应用大词汇量的BPE。

在训练的每一步,Unigram算法会根据当前词汇表计算语料库的损失。然后,对于词汇表中的每个符号,算法计算如果移除该符号,整体损失会增加多少,并寻找那些增加损失最少的符号。这些符号对语料库的整体损失影响较小,可以说它们“需求较低”,是最佳的移除候选。

由于这个过程很昂贵,这里的 “𝑝” 是一个超参数,你可以控制它,通常设置为10%或20%。这个过程不是仅仅移除与最小损失增加相关联的单个符号,而是移除与最小损失增加相关联的𝑝百分比的符号。然后重复这个过程,直到词汇表达到期望的大小。

注意,我们永远不会移除基本字符,以确保任何单词都能被分割。

现在,这仍然有些模糊:算法的主要部分是计算语料库的损失,并查看移除一些词汇后它如何变化,但我们还没有解释如何做到这一点。这一步依赖于Unigram模型的分词算法,我们将在下一部分深入探讨。

我们将使用之前的示例语料库:

("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)

在这个例子中,我们将使用所有严格的子串作为初始词汇:

["h", "u", "g", "hu", "ug", "p", "pu", "n", "un", "b", "bu", "s", "hug", "gs", "ugs"]

分词算法

Unigram模型是一种语言模型,它假设每个令牌与之前的令牌独立。这是最简单的语言模型,因为给定先前上下文的令牌X的概率只是令牌X的概率。如果使用Unigram语言模型生成文本,我们总是预测最常出现的令牌。

给定令牌的概率是它在原始语料库中的频率(找到它的次数),除以词汇表中所有令牌频率之和(确保概率总和为1)。例如,“ug"在"hug”、"pug"和"hugs"中出现,所以它在我们的语料库中的频率为20。

以下是词汇表中所有可能子词的频率:

("h", 15) ("u", 36) ("g", 20) ("hu", 15) ("ug", 20) ("p", 17) ("pu", 17) ("n", 16)
("un", 16) ("b", 4) ("bu", 4) ("s", 5) ("hug", 15) ("gs", 5) ("ugs", 5)

所有频率的总和为210,因此子词"ug"的概率为20/210。

📝 现在轮到你了! 编写代码计算上述频率,并检查显示的结果是否正确,以及总和是否正确。

现在,要对给定的单词进行分词,我们查看所有可能的分割方式,并根据Unigram模型计算每种方式的概率。由于所有令牌都被视为独立的,这个概率是每个令牌概率的乘积。例如,"pug"的分词["p", "u", "g"]的概率为:

P([“p”,“u”,“g”])=P(“p”)×P(“u”)×P(“g”)=5210×36210×20210=0.000389P([“p”,“u”,“g”])=P(“p”)\times P(“u”)\times P(“g”)=\frac{5}{210}\times\frac{36}{210}\times\frac{20}{210}=0.000389P([p,u,g])=P(p)×P(u)×P(g)=2105×21036×

### Unigram算法原理 Unigram模型是一种基础的语言模型,它假设每个词的出现是独立于前一个或几个词的。这种模型简化了语言处理的复杂性,使得计算变得相对简单。在Unigram模型中,给定词汇表中某个词的概率等于该词在整个语料库中的频率,即该词出现的次数除以语料库中所有词的总出现次数 [^2]。 对于分词任务,Unigram模型可以用来确定一个句子的最佳分割方式,即找到概率最高的单词序列。这通常涉及到动态规划等算法来高效地搜索最佳路径 [^3]。 ### 实现Unigram算法 实现Unigram模型的一个常见场景是在自然语言处理中的文本生成或者分词任务。以下是一个简单的Python示例,展示如何基于Unigram模型计算词语的概率: ```python from collections import Counter def unigram_probability(text): words = text.split() word_counts = Counter(words) total_words = len(words) def probability(word): return word_counts[word] / total_words return probability # 示例文本 text = "the cat sat on the mat" prob = unigram_probability(text) # 查询某个词的概率 print(prob("the")) # 输出: 0.4 ``` 在这个例子中,`unigram_probability`函数接收一段文本并返回一个内部函数`probability`,这个函数接受一个词并返回其在给定文本中的概率。 ### 应用 Unigram模型因其简单性和有效性,在多种自然语言处理任务中有广泛的应用,包括但不限于: - **文本分类**:通过统计不同类别文档中词语的频率来进行分类。 - **信息检索**:评估查询词与文档的相关性。 - **拼写纠正**:预测用户可能想输入的正确单词。 - **语音识别**:帮助选择最有可能被说出的词序列。 此外,Unigram也是构建更复杂的语言模型的基础,如Bigram和Trigram模型,这些模型考虑了更多的上下文信息 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NJU_AI_NB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值