📘
notes
  • Center
  • Language
    • Python
      • Python environment
      • Advanced Python
      • Python Standard Libary
      • Python Third Party
      • CPython
      • Python MISC
    • C++
      • C++ Draft
    • Java
      • JavaSE
    • SQL
      • SQL
    • Rust
      • Rust
  • Tool
    • Git
    • Docker
    • Database
    • Linux & Shell
      • shell-cheet-sheet
    • Vim
    • gcc & make & cmake
    • misc
  • Note
    • DL
      • DL-deploy
      • huggingface
      • pytorch-lightning
      • Pytorch
      • TensorFlow
    • NLP
    • CV
      • OpenCV
      • mmlab
    • Audio
    • GNN
    • CUDA
    • Triton
    • TODO LIST
    • Draft
  • Learn
    • C++ Primer
    • C++ Primer Plus
    • CSAPP
    • CPython Internals
Powered by GitBook
On this page
  • 基于字/词的 NLP 技术
  • TF-IDF & BM25
  • 评估指标
  • BLEU
  • 预训练模型
  • Tokenizer
  • NLP 小工具(常用正则、文本预处理工具等)
  • 英文正则化(上撇号缩写等)
  • Draft
  • Causal Language Modeling (CausalLM, LM)

Was this helpful?

Edit on GitHub
  1. Note

NLP

基于字/词的 NLP 技术

TF-IDF & BM25

TF-IDF

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

计算公式为:

tf−idf(w,d)=tf(w,d)⋅idf(w,d)tf-idf(w, d) = tf(w, d)\cdot idf(w, d)tf−idf(w,d)=tf(w,d)⋅idf(w,d)

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

tf(w,d)=f(w,d)∑d∈Df(w,d)tf(w,d) = \frac{f(w,d)}{\sum_{d\in D}{f(w, d)}}tf(w,d)=∑d∈D​f(w,d)f(w,d)​

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

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

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

其中 dfwdf_{w}dfw​ 在文档底库中有多少个文档包含词 www。

BM25

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

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

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

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

其中 nnn 表示查询 qqq 中不同的单词的个数。

单词权重:WiW_iWi​

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

Wi=IDF(qi)=log⁡(N−dfqi+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))Wi​=IDF(qi​)=log(dfqi​​+0.5N−dfqi​​+0.5​+1)∈(0,log(2N+1))

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

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

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

R(qi,d)=(k1+1)tf(qi,d)tf(qi,d)+k1(1−b+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}})}R(qi​,d)=tf(qi​,d)+k1​(1−b+bLave​Ld​​)(k1​+1)tf(qi​,d)​

其中 k1k_1k1​ 与 bbb 为超参数,一般设置为 k1∈[1.2,2.0],b=0.75k_1\in[1.2, 2.0], b=0.75k1​∈[1.2,2.0],b=0.75, LdL_dLd​ 为文档 ddd 的长度, LaveL_{ave}Lave​ 为文档底库 DDD 的平均长度。而 tf(qi,d)tf(q_i,d)tf(qi​,d) 即为 term frequency:

tf(qi,d)=f(qi,d)∑d∈Df(qi,d)tf(q_i,d) = \frac{f(q_i,d)}{\sum_{d\in D}{f(q_i, d)}}tf(qi​,d)=∑d∈D​f(qi​,d)f(qi​,d)​

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

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

当 qqq 比较长时,还需要对权重 WiW_iWi​ 做一步修正:

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)}S(qi​,q)=k3​+tf(qi​,q)(k3​+1)tf(qi​,q)​

完整公式

Score(q,d)=∑i=1n(k3+1)tf(qi,q)k3+tf(qi,q)⋅log⁡(N−dfqi+0.5dfqi+0.5+1)⋅(k1+1)tf(qi,d)tf(qi,d)+k1(1−b+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}})}}Score(q,d)=i=1∑n​k3​+tf(qi​,q)(k3​+1)tf(qi​,q)​⋅log(dfqi​​+0.5N−dfqi​​+0.5​+1)⋅tf(qi​,d)+k1​(1−b+bLave​Ld​​)(k1​+1)tf(qi​,d)​

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

评估指标

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 的算法

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).

PreviousTensorFlowNextCV

Last updated 2 years ago

Was this helpful?

具体算法流程参考博客:

Byte Pair Encoding