NLP

基于字/词的 NLP 技术

TF-IDF & BM25

TF-IDF

TF-IDF 用于计算文档中的每个单词的重要性,这样便可以得到文档中的关键词,问题定义为:给定一个文本集合 D={di}i=1ND=\{d_i\}_{i=1}^{N},对于每个文档 dd,需要计算文档 dd 中每个单词 ww 的重要性

计算公式为:

tfidf(w,d)=tf(w,d)idf(w,d)tf-idf(w, d) = tf(w, d)\cdot idf(w, d)

term frequecy(词频): tf(w,d)tf(w, d)

tf(w,d)=f(w,d)dDf(w,d)tf(w,d) = \frac{f(w,d)}{\sum_{d\in D}{f(w, d)}}

其中 f(w,d)f(w,d) 为单词 ww 在文档 dd 中出现的次数。

inverse document frequency(逆文档词频): idf(w,d)idf(w, d)

idf(w,d)=log(Ndfw+1)idf(w, d)=\log(\frac{N}{df_{w}+1})

其中 dfwdf_{w} 在文档底库中有多少个文档包含词 ww

BM25

BM 算法用于文本检索 (elasticsearch 2.x 版本所使用的算法)。检索问题的定义如下:给定一个文本集合 D={di}i=1ND=\{d_i\}_{i=1}^{N},输入一个文本 qq,按相关性得到底库 DD 中最相关的文本。

BM25 算法框架为:对于每个底库文档 dd,计算查询 qq 与文档 dd 的相似度,之后按相似度排序即可。

具体计算相似度的方法为:

Score(q,d)=i=1nWiR(qi,d)Score(q, d) = \sum_{i=1}^{n}W_iR(q_i, d)

其中 nn 表示查询 qq 中不同的单词的个数。

单词权重:WiW_i

其中 qiq_iqq 的每个单词(如果某个单词出现了多次,求和项中只计算一次),WiW_i 为每个单词的权重。而 WiW_i 的定义为:

Wi=IDF(qi)=log(Ndfqi+0.5dfqi+0.5+1)(0,log(2N+1))W_i = IDF(q_i) = \log(\frac{N-df_{q_i}+0.5}{df_{q_i}+0.5}+1)\in(0, \log(2N+1))

其中 dfqidf_{q_i} 为底库中包含单词 qiq_i 的文档个数。因此词 qiq_i 在每个文档出现的越频繁(例如停用词),则其对搜索结果的权重越小。

单词相关度:R(qi,d)R(q_i, d)

R(qi,d)R(q_i, d) 的定义为:

R(qi,d)=(k1+1)tf(qi,d)tf(qi,d)+k1(1b+bLdLave)R(q_i, d) = \frac{(k_1+1)tf(q_i, d)}{tf(q_i, d)+k_1(1-b+b\frac{L_d}{L_{ave}})}

其中 k1k_1bb 为超参数,一般设置为 k1[1.2,2.0],b=0.75k_1\in[1.2, 2.0], b=0.75, LdL_d 为文档 dd 的长度, LaveL_{ave} 为文档底库 DD 的平均长度。而 tf(qi,d)tf(q_i,d) 即为 term frequency

tf(qi,d)=f(qi,d)dDf(qi,d)tf(q_i,d) = \frac{f(q_i,d)}{\sum_{d\in D}{f(q_i, d)}}

其中 f(qi,d)f(q_i,d) 为单词 qiq_i 在文档 dd 中出现的次数。

修正项(非必须,且不同 BM25 算法对此项的处理略有不同)

qq 比较长时,还需要对权重 WiW_i 做一步修正:

S(qi,q)=(k3+1)tf(qi,q)k3+tf(qi,q)S(q_i, q) = \frac{(k_3+1)tf(q_i, q)}{k_3 + tf(q_i, q)}

完整公式

Score(q,d)=i=1n(k3+1)tf(qi,q)k3+tf(qi,q)log(Ndfqi+0.5dfqi+0.5+1)(k1+1)tf(qi,d)tf(qi,d)+k1(1b+bLdLave)Score(q, d) = \sum_{i=1}^{n}{\frac{(k_3+1)tf(q_i, q)}{k_3 + tf(q_i, q)}\cdot\log(\frac{N-df_{q_i}+0.5}{df_{q_i}+0.5}+1)\cdot\frac{(k_1+1)tf(q_i, d)}{tf(q_i, d)+k_1(1-b+b\frac{L_d}{L_{ave}})}}

其中 tf(w,d)tf(w, d) 表示 term frequency (单词 ww 在文档 dd 中出现的次数),而 dfwdf_{w} 在文档底库中有多少个文档包含词 ww

评估指标

BLEU

预训练模型

Tokenizer

BPE 算法

动机

对于英文来说,词的数量可能太多。同一个词根,可以通过修改前/后缀的方式来得到动词形式,名词形式,副词形式,例如如下词表:

own、owner、play、player、research、researcher、care、careful、hope、hopeful。

使用词作为 embeding 的最小单位,需要 10 个向量。但如果拆解为:

own、play、research、care、hope、er、ful。

那么仅需要 7 个向量,且这些词根和前/后缀有着某种含义。因此 embeding 的对象为这些 word piece,似乎比较合理。这带来一个问题,上面的拆解过程是人工找的规律(需要语言学的专业知识),因此需要用一个算法来自动发现这些 word piece。BPE 算法就是一种自动发现 word piece 的算法

具体算法流程参考博客:Byte Pair Encoding

NLP 小工具(常用正则、文本预处理工具等)

英文正则化(上撇号缩写等)

import contractions
contractions.fix("I'm")  # "I am"

Draft

Causal Language Modeling (CausalLM, LM)

即普通的语言模型: 根据已经见到的内容预测下一个 token

参考博客: https://www.projectpro.io/recipes/what-is-causal-language-modeling-transformers

The task of predicting the token after a sequence of tokens is known as causal language modeling. In this case, the model is just concerned with the left context (tokens on the left of the mask).

Last updated

Was this helpful?