NLP技术基础整理

什么是自然语言处理?

自然语言处理(NLP)是一门融语言学、计算机科学、人工智能于一体的(实验性)科学,解决的是“让机器可以理解自然语言”。

NLP = NLU + NLG

NLP问题的难点

  • 自然语言有歧义(ambiguity),同样的含义又有不同的表达方式(variability)
    • ambiguity:同样的一段表述能表示不同的意思
    • variability:不同的表达方式是同一个意思

coreference resolution

爸爸已经抱不动小明了,因为太胖了。

爸爸已经抱不动小明了,因为太虚弱了。

WSC: GPT-2

机器学习与NLP

使用机器学习的方法让模型能够学到输入和输出之间的映射关系。在NLP中,输入一般都是语言文字,而输出则是各种不同的label。

单词

自然语言的基本构成单元。

分词

英文中的单词一般用空格隔开(标点符号等特殊情况除外),所以天然地完成了分词。中文的分词则不那么自然,需要人为分词。比较好用的分词工具:https://github.com/lancopku/pkuseg-python

jieba

1
2
3
4
5
6
7
pip install pkuseg
>>> import pkuseg
>>>
>>> seg = pkuseg.pkuseg() # 以默认配置加载模型
>>> text = seg.cut('我爱北京天安门') # 进行分词
>>> print(text)
['我', '爱', '北京', '天安门']

英文分词可以使用NLTK

1
2
3
4
5
6
>>> import nltk
>>> sentence = “hello, world"
>>> tokens = nltk.word_tokenize(sentence)
>>> tokens
['hello', ‘,', 'world']
>>> sents = nltk.sent_tokenize(documents)

NLTK还有一些好用的功能,例如POS Tagging

1
2
3
4
5
6
>>> import nltk
>>> text = nltk.word_tokenize('what does the fox say')
>>> text
['what', 'does', 'the', 'fox', 'say']
>>> nltk.pos_tag(text)
[('what', 'WDT'), ('does', 'VBZ'), ('the', 'DT'), ('fox', 'NNS'), ('say', 'VBP')]

Named Entity Recognition

img

去除停用词

1
2
3
4
5
6
from nltk.corpus import stopwords
# 先token一把,得到一个word_list
# ...
# 然后filter一把
filtered_words =
[word for word in word_list if word not in stopwords.words('english')]

one hot vector [0, 0, 0, 1, 0, 0…]

Bag of Words和TF-IDF

词包模型

vocab: 50000个单词

文本–> 50000维向量

{a: 0, an: 1, the:2, ….}

[100, 50, 30, …]

TF: Term Frequency, 衡量一个term在文档中出现得有多频繁。

TF(t) = (t出现在文档中的次数) / (文档中的term总数)

文档一个10000个单词,100个the

TF(the) = 0.01

IDF: Inverse Document Frequency, 衡量一个term有多重要。

有些词出现的很多,但是信息量可能不大,比如’is’,’the‘,’and‘之类。

为了平衡,我们把罕见的词的重要性(weight)调高,把常见词的重要性调低。

IDF(t) = lg(文档总数 / 含有t的文档总数 + 1)

语料一共在3篇文章中出现,但是我们一共有100,000篇文章。IDF(julyedu) = log(100,000/3)

TF-IDF = TF * IDF

TFIDF词包

a, 100*0.000001

[0.0001, ]

Distributional Word Vectors 词向量

distributional semantics

“The distributional hypothesis in linguistics is derived from the semantic theory of language usage, i.e. words that are used and occur in the same contexts tend to purport similar meanings.”

如果两个单词总是在同样的语境下出现,那么表示他们之间存在某种相关性/相似性。

Counting Context Words

img

50000 * 50000

50000*300

300*300

300*50000

在我们定义的固定大小的context window下出现的单词组,就是co-occuring word pairs。

对于句子的开头和结尾,我们可以定义两个特殊的符号 <s> 和 </s>。

单词相似度

使用词向量间的cosine相似度(cosine 夹角), u, v是两个词向量

img= cosine(u, v)

单词”cooked”周围context windows最常见的单词

img

Pointwise Mutual Information (PMI)

img

独立 P(x)*P(y) = P(x, y)

PMI表示了事件 x 和事件 y 之间是否存在相关性。

与 “cooked” PMI值最高的单词

img

如何评估词向量的好坏?

标准化的单词相似度数据集

  • Assign a numerical similarity score between 0 and 10 (0 = words are totally unrelated, 10 = words are VERY closely related).

imgimg

cosine(journey, voyage) =

cosine(king, queen) =

spearman’s R 分数

Sparse vs. dense vectors

根据context window定义的词向量非常长,很多位置上都是0. 表示我们的信息密度是很低的

  • 低维度词向量更容易训练模型,占用的内存/硬盘也会比较小。

  • 低维度词向量能够学到一些单词间的关系,例如有些单词之间是近义词。

降维算法

  • PCA

  • SVD

  • Brown cluster

  • Word2Vec

Contextualized Word Vectors

近两年非常流行的做法,不仅仅是针对单个单词训练词向量,而是根据单词出现的语境给出词向量,是的该词向量既包含当前单词的信息,又包含单词周围context的信息。

  • BERT, RoBERTa, ALBERT, T5

  • GPT2

文本分类

NLP数据集

  • NLP数据集一般包含输入(inputs,一般是文字)和输出(outputs,一般是某种标注)。

标注

  • 监督学习需要标注过的数据集,这些标注一般被称为ground truth。

  • 在自然语言处理数据集中,标注往往是由人手动标注的

  • 人们往往会对数据的标注有不同的意见,因为很多时候不同的人对同样的语言会有不同的理解。所以我们也会把这些标注称为gold standard,而不是ground truth。

NLP数据集如何构建

  • 付钱请人标注

    • 比较传统的做法
    • 研究员写下标注的guideline,然后花钱请人标注(以前一般请一些专业的语言学家)
    • 标注的质量会比较高,但是成本也高
    • 例如,Penn Treebank(1993)
  • Croudsourcing

    • 现在比较流行
    • 一般不专门训练标注者(annotator),但是可以对同一条数据取得多条样本
    • 例如,Stanford Sentiment Treebank
  • 自然拥有标注的数据集

    • 法律文件的中英文版本,可以用于训练翻译模型
    • 报纸的内容分类
    • 聊天记录
    • 文本摘要(新闻的全文和摘要)

标注者同意度 Annotator Agreement

  • 给定两个标注者给出的所有标注,如何计算他们之间的标注是否比较统一?
    • 相同标注的百分比?
    • Cohen’s Kappa

img

来自维基百科

  • 也有更多别的测量方法

常见的文本分类数据集

英文:

中文:

文本分类模型

什么是一个分类器?

  • 一个从输入(inputs)特征x投射到标注y的函数

  • 一个简单的分类器:

    • 对于输入x,给每一个label y打一个分数,score(x, y, w),其中w是模型的参数
    • 分类问题也就是选出分数最高的y:classify(x, w) = argmax_y score(x, y, w)

Modeling, Inference, Learning

img

Modeling

二元情感分类

classify(x, w) = argmax_y score(x, y, w)

如果我们采用线性模型,那么模型可以被写为

img

现在的问题是,我们如何定义f?对于比较常见的机器学习问题,我们的输入往往是格式固定的,但是NLP的输入一般是长度不固定的文本。这里就涉及到如何把文本转换成特征(feature)。

  • 过去25年:特征工程(feature engineering),人为定制,比较复杂,只适用于某一类问题

  • 过去5年:表示学习(representation learning), ICLR, international conference for learning representations

常见的features:

f1: 文本是正面情感,文本包含“好”

f2: 文本是负面情感,文本包含“好”

。。。

Inference

比较直观,给定一段话,在每个Label上打分,然后取分数最大的label作为预测。

Learning

  • 根据训练数据得到模型权重w

  • 把数据分为训练集(train),验证集(dev, val)测试集(test)

  • 在NLP中,我们常常使用一种learning framework: Empirical Risk Minimization

    • 损失函数(cost function):对比模型的预测和gold standard,计算一个分数img
    • 损失函数与我们真正优化的目标要尽量保持一致
    • 一般来说如果cost为0,表示我们的模型预测完全正确
    • 对于文本分类来说,我们应该使用怎样的损失函数呢?

错误率:img

Risk Minimization:

给定训练数据 imgx表示输入,y表示label

我们的目标是img

Empirical Risk Minimization img

我们之前定义的0-1损失函数是很难优化的,因为0-1loss不连续,所以无法使用基于梯度的优化方法。

loss.backward() # \d loss / \d w = gradient

optimizer.step() # w - learning_rate*gradient

cost = -score(x, y_label, w) 问题:没有考虑到label之间的关系!

一些其他的损失函数

perceptron loss

img

hinge loss

img

img

Log Loss/Cross Entropy Loss

img

我们之前只有score(x, y, w),怎么样定义p_w(y | z)

  • 让gold standard label的条件概率尽可能大

  • 使用softmax把score转化成概率

  • 其中的score function可以是各种函数,例如一个神经网络

损失函数往往会结合regularization 正则项

  • L2 regularization img

  • L1 regularization img

模型训练

  • (stochastic, batch) gradient descent

语言模型

语言模型:给句子计算一个概率

为什么会有这样一个奇怪的任务?

  • 机器翻译:P(我喜欢吃水果)> P(我喜欢喝水果)

  • 拼写检查:P(我想吃饭)> P(我像吃饭)

  • 语音识别:P (我看见了一架飞机)> P(我看见了一架斐济)

  • summarizaton, question answering, etc.

文本自动补全。。。

概率语言模型(probablistic language modeling)

  • 目标:计算一串单词连成一个句子的概率 P(w) = P(w_1, …, w_n)

  • 相关的任务 P(w_4|w_1, …, w_3)

  • 这两个任务的模型都称之为语言模型

条件概率

img

马尔科夫假设

  • 上述条件概率公式只取决于最近的n-1个单词 P(w_i|w_1, …, w_{i-1}) = P(w_i | w_{i-n+1}, …, w_{i-1})

  • 我们创建出了n-gram模型

  • 简单的案例,bigram模型

img

一些Smoothing方法

  • “Add-1” estimation

img

  • Backoff,如果一些trigram存在,就是用trigram,如果不存在,就是用bigram,如果bigram也不存在,就退而求其次使用unigram。

  • interpolation:混合使用unigram, bigram, trigram

Perplexity: 用于评估语言模型的好坏。评估的语言,我现在给你一套比较好的语言,我希望自己的语言模型能够给这段话尽可能高的分数。

img l 越大越好,-l 越小越好

imgPP 越小越好 困惑度

perplexity越低 = 模型越好

简单的Trigram神经网络语言模型

img

这个模型可以使用log loss来训练。

我们还可以在这个模型的基础上增加hidden layer

img

循环神经网络(Recurrent Neural Networks)

img

基于循环神经网络的语言模型

img

img

Long Short-term Memory

img

Gates

img

Gated Recurrent Unit (GRU)

img

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

Word2Vec

img

我们的目标是利用没有标注过的纯文本训练有用的词向量(word vectors)

skip-gram (window size = 5)

agriculture is the tradional mainstay of the cambodian economy . but benares has been destroyed by an earthquake.

img

skip-gram中使用的score function

img

模型参数,所有的单词的词向量,包括输入向量和输出向量

learning

img

img

注意这个概率模型需要汇总单词表中的所有单词,计算量非常之大

Negative Sampling

img

随机生成一些负例,然后优化以上损失函数

img

文章目录
  1. 1. 什么是自然语言处理?
  2. 2. NLP问题的难点
  3. 3. 机器学习与NLP
  4. 4. 单词
  5. 5. 分词
  6. 6. Bag of Words和TF-IDF
  7. 7. Distributional Word Vectors 词向量
  8. 8. 单词相似度
  9. 9. 如何评估词向量的好坏?
  10. 10. Contextualized Word Vectors
  11. 11. 文本分类
  12. 12. 常见的文本分类数据集
  13. 13. 文本分类模型
  14. 14. Modeling
  15. 15. Inference
  16. 16. Learning
    1. 16.1. Log Loss/Cross Entropy Loss
  17. 17. 语言模型
  18. 18. 概率语言模型(probablistic language modeling)
  19. 19. 简单的Trigram神经网络语言模型
  20. 20. 循环神经网络(Recurrent Neural Networks)
  • Word2Vec
    1. 1. learning
    2. 2. Negative Sampling
  • |