目录
多分类文本处理与特征工程
1. 语言模型
语言模型(LM,Language Model)就是用来判断某个句子是否语义通顺。首先对句子进行分词,句子的概率可以表示为各个词的联合概率: P ( s ) = P ( w 1 , w 2 , . . . , w n ) P(s)=P(w_1,w_2,...,w_n) P(s)=P(w1,w2,...,wn)。
根据Chain rule: P ( A , B , C , D ) = P ( A ) P ( B ∣ A ) P ( C ∣ A , B ) P ( D ∣ A , B , C ) P(A,B,C,D)=P(A)P(B|A)P(C|A,B)P(D|A,B,C) P(A,B,C,D)=P(A)P(B∣A)P(C∣A,B)P(D∣A,B,C),可以转化:
P
(
s
)
=
P
(
w
1
,
w
2
,
.
.
.
,
w
n
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
,
w
2
)
.
.
.
P
(
w
n
∣
w
1
,
w
2
,
w
3
,
.
.
.
,
w
n
−
1
)
P(s)=P(w_1,w_2,...,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,w_3,...,w_{n-1})
P(s)=P(w1,w2,...,wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wn∣w1,w2,w3,...,wn−1)
对于概率
P
(
w
n
∣
w
1
,
w
2
,
w
3
,
.
.
.
,
w
n
−
1
)
P(w_n|w_1,w_2,w_3,...,w_{n-1})
P(wn∣w1,w2,w3,...,wn−1),条件很长,corpus里找不到单词,就容易导致稀疏性(sparsity),因此引入Markov Assumption:
- Unigram Model(1-gram): P ( w n ∣ w 1 , w 2 , w 3 , . . . , w n − 1 ) = P ( w n ) P(w_n|w_1,w_2,w_3,...,w_{n-1})=P(w_n) P(wn∣w1,w2,w3,...,wn−1)=P(wn)
- Bigram Model(2-gram): P ( w n ∣ w 1 , w 2 , w 3 , . . . , w n − 1 ) = P ( w n ∣ w n − 1 ) P(w_n|w_1,w_2,w_3,...,w_{n-1})=P(w_n|w_{n-1}) P(wn∣w1,w2,w3,...,wn−1)=P(wn∣wn−1)
- Trigram Model(3-gram): P ( w n ∣ w 1 , w 2 , w 3 , . . . , w n − 1 ) = P ( w n ∣ w n − 2 , w n − 1 ) P(w_n|w_1,w_2,w_3,...,w_{n-1})=P(w_n|w_{n-2},w_{n-1}) P(wn∣w1,w2,w3,...,wn−1)=P(wn∣wn−2,wn−1)
- …
- N-gram Model
因此,语言模型可表示为:
- Unigram Model: P ( w 1 , w 2 , . . . , w n ) = ∑ i = 1 n P ( w i ) P(w_1,w_2,...,w_n)= \sum_{i=1}^n P(w_i) P(w1,w2,...,wn)=∑i=1nP(wi)
- Bigram Model: P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) ∑ i = 2 n P ( w i ∣ w i − 1 ) P(w_1,w_2,...,w_n)= P(w_1)\sum_{i=2}^n P(w_i|w_{i-1}) P(w1,w2,...,wn)=P(w1)∑i=2nP(wi∣wi−1)
- Trigram Model: P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) ∑ i = 3 n P ( w i ∣ w i − 1 , w i − 2 ) P(w_1,w_2,...,w_n)= P(w_1)P(w_2|w_1)\sum_{i=3}^n P(w_i|w_{i-1},w_{i-2}) P(w1,w2,...,wn)=P(w1)P(w2∣w1)∑i=3nP(wi∣wi−1,wi−2)
那么如何估计每个单词的概率呢?统计语料库corpus里出现的单词的频数来估计概率,即模型的训练过程。
比如,根据以下不同阶段的工作或选择构建不同的LM?
- N-gram里N的选择:Unigram, Bigram, Trigram,…
- 平滑处理方法的不同:Laplace smoothing, Interpolation, Good-Turing smoothing等10几种方法。(计算概率避免出现概率为0,在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。)
- 预处理方法:预料中去掉某些特定的人名地名等词,停用词等。
1.1 模型评估(概率估计)
根据不同的选择可以有很多LM,又如何从中选择最好的一个呢?训练出来的语言模型效果是好还是坏?
理想情况下:
- 假设有语言模型A,B
- 选定一个特定的任务,比如拼写纠错,机器翻译(MT,Machine Translation)
- 把两个模型都应用到此任务中
- 最后比较准确率,从而判断A,B的表现
核心思路: P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w 1 , w 2 , w 3 , . . . , w n − 1 ) P(w_1,w_2,...,w_n)= P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,w_3,...,w_{n-1}) P(w1,w2,...,wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wn∣w1,w2,w3,...,wn−1)使概率乘积最大。
更简单的评估方法,不需要放在特定任务中——Perplexity:
P
e
r
p
l
e
x
i
t
y
=
2
−
x
,
x
:
a
v
e
r
a
g
e
l
o
g
l
i
k
e
l
i
h
o
o
d
Perplexity=2^{-x}, x:average\quad log\quad likelihood
Perplexity=2−x,x:averageloglikelihood
i.e. Bigram Model:
P
(
w
1
,
w
2
,
w
3
,
w
4
,
w
5
)
P(w_1,w_2,w_3,w_4,w_5)
P(w1,w2,w3,w4,w5)
l o g P ( w 1 ) + l o g P ( w 2 ∣ w 1 ) + l o g P ( w 3 ∣ w 2 ) + l o g P ( w 4 ∣ w 3 ) + l o g P ( w 5 ∣ w 4 ) 5 = x ⟹ 2 − x \frac{logP(w_1)+logP(w_2|w_1)+logP(w_3|w_2)+logP(w_4|w_3)+logP(w_5|w_4)}{5} = x \Longrightarrow 2^{-x} 5logP(w1)+logP(w2∣w1)+logP(w3∣w2)+logP(w4∣w3)+logP(w5∣w4)=x⟹2−x
Perplexity越小(LM中所有单词的概率乘积越大),LM越好
1.2 平滑方法
为了解决使用N-Gram模型时可能引入的稀疏数据问题,人们设计了多种平滑算法。
计算概率应避免出现概率为0,在文本分类的问题中,当一个词语没有在训练样本中出现,该词语的概率为0,使用连乘计算文本出现概率时也为0。
可以用平滑处理方法:Laplace smoothing, Interpolation, Good-Turing smoothing等10几种方法。
- Add-one Smoothing(Laplace Smoothing)
P ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) + 1 c ( w i − 1 ) + V P(w_i|w_{i-1})=\frac{c(w_{i-1},w_i)+1}{c(w_{i-1})+V} P(wi∣wi−1)=c(wi−1)+Vc(wi−1,wi)+1
,V是词库大小(分母+V为了归一化,所有概率和=1)
- Add-K Smoothing(Laplace Smoothing)
P ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) + k c ( w i − 1 ) + k V P(w_i|w_{i-1})=\frac{c(w_{i-1},w_i)+k}{c(w_{i-1})+kV} P(wi∣wi−1)=c(wi−1)+kVc(wi−1,wi)+k
,V是词库大小(V=set(corpus))
-
Interpolation插值
在使用插值算法时,把不同阶别的N-Gram模型线性加权组合后再来使用。简单线性插值(Simple Linear Interpolation)可以用下面的公式来定义:
P ( w i ∣ w i − 2 , w i − 1 ) = λ 1 P ( w i ) + λ 2 P ( w i ∣ w i − 1 ) + λ 3 P ( w i − 2 , w i − 1 ) λ 1 + λ 2 + λ 3 = 1 P(w_i|w_{i-2},w_{i-1})=\lambda_1P(w_i)+\lambda_2P(w_i|w_{i-1})+\lambda_3P(w_{i-2},w_{i-1}) \\ \lambda_1 + \lambda_2 + \lambda_3 = 1 P(wi∣wi−2,wi−1)=λ1P(wi)+λ2P(wi∣wi−1)+λ3P(wi−2,wi−1)λ1+λ2+λ3=1
-
Good-Turing smoothing
基本思想: 用观察计数较高的 N-gram 数量来重新估计概率量大小,并把它指派给那些具有零计数或较低计数的 N-gram.
Idea: reallocate the probability mass of n-grams that occur r+1 times in the training data to the n-grams that occur r times.
在 Good Turing 下,对每一个计数 r,我们做一个调整,变为 r’,n_r表示出现过r次的N-gram:
r ′ = ( r + 1 ) n r + 1 / n r P ( x : c ( x ) = r ) = r ′ / N r'= (r+1)n_{r+1}/n_r \\ P(x:c(x)=r)=r'/N r′=(r+1)nr+1/nrP(x:c(x)=r)=r′/N
1.3 LM在拼写纠正(Spell Correction)中的应用
一般地,拼写错误有两种:第一,词拼写错;第二,没有错词,语法有问题。
对于错词,之前的方法VS现在的方法
之前的方法:
用户输入 --> 从词典中寻找编辑距离最小的词(需要遍历整个词典O(|V|) --> 返回
现在的方法:
用户输入 --> 生成编辑距离为1,2的字符串(candidates) --> 过滤 (根据上下文)--> 返回
如何过滤?
假设w是错词,改成正确的形式c:
c
∗
=
arg
max
c
∈
C
a
n
d
i
d
a
t
e
s
P
(
c
∣
w
)
=
arg
max
c
∈
C
a
n
d
i
d
a
t
e
s
P
(
w
∣
c
)
P
(
c
)
/
P
(
w
)
=
arg
max
c
∈
C
a
n
d
i
d
a
t
e
s
P
(
w
∣
c
)
P
(
c
)
c^{*} = \mathop{\arg\max}\limits_{c \in Candidates} P(c|w) \\ = \mathop{\arg\max}\limits_{c \in Candidates} P(w|c)P(c)/P(w) \\ = \mathop{\arg\max}\limits_{c \in Candidates} P(w|c)P(c)
c∗=c∈CandidatesargmaxP(c∣w)=c∈CandidatesargmaxP(w∣c)P(c)/P(w)=c∈CandidatesargmaxP(w∣c)P(c)
P ( w ∣ c ) P(w|c) P(w∣c)是(w,c)相关的score, P ( c ) P(c) P(c)是语言模型
第一,词拼写错:
-
首先是获取candidates,w所有可能的c,有两种方法来过滤出最优的正确词。
-
Edit Distance
设定不同编辑距离下(w,c)相关的score,例如d=1, score=0.8; d=2, score=0.2; other, score=0. -
Collected data
P(w|c):当用户拼c时,有多少概率把它拼错位w?
从搜索引擎可以得到相关的历史数据,例如输入搜索词“appl",搜索框历史给出相关的可能的匹配词,统计出现的频率即可。
-
-
然后对候选词根据N-gram的概率最大化来选择最优的词c。
第二,没有错词,语法有问题。
根据LM来检查。
2. 预处理
-
过滤词
先把停用词、特殊的标点符号、出现频率很低的词过滤掉。
-
英文:Normalization (Lemmatization词形还原、Stemming词干提取)
3. Word Representation: 独热编码,tf-idf
-
-
词表示:0-1 one-hot encoding --> 句子表示:0-1(Boolean)
构建词库V,对每个句子的表示:根据每个分词是否在V中出现(0/1),表示向量的大小为|V|。
-
-
-
词表示:0-1 one-hot encoding --> 句子表示:0-1(Count)
构建词库V,对每个句子的表示:统计每个分词在V中出现次数,表示向量的大小为|V|。
-
-
- 句子相似度:欧式距离,余弦相似度
-
-
TF-IDF: t f i d f ( w ) = t f ( d , w ) ∗ i d f ( w ) tfidf(w)=tf(d,w)*idf(w) tfidf(w)=tf(d,w)∗idf(w)
t f ( d , w ) tf(d,w) tf(d,w): 文档d中w的词频
i d f ( w ) idf(w) idf(w): = l o g ( N N ( w ) ) =log(\frac{N}{N(w)}) =log(N(w)N),单词的重要性,逆文档频率(inverse document frequency)
N: 语料库中的文档总数
N(w): 词语w出现在多少个文档中
-
4. Word2Vec
one-hot representation:无法表示词的meaning,数据稀疏性
one-hot representation —>distributed representation
4.1 Word Embedding
Word Embedding 词向量模型:(依据分布式假设:挨在一起的单词的相似度更高)
传统: SkipGram, CBOW,Glove, FastText, Matrix Factorization(MF)
考虑上下文(动态表征):ELMo, BERT, XLNet
词向量降维:T-sne
Word Embedding --> Sentence Embedding: Average Pooling, Max Pooling, …
-
SkipGram: 经典的局部方法,根据window-size选取关联的上下文词。Make use of context window。
-
FastText核心思想:解决OOV(out-of-vocabulary)问题,一些出现频率低的词处理问题。利用n-gram feature,在训练过程中考虑每个单词的2-gram, 3-gram, 4-gram等子词特征,特征融合后利用SkipGram进行训练。
-
Matrix Factorization: 经典的全局方法,make use of co-occurance counts
-
Glove: 同时结合全局性(如MF)和局部性(如SkipGram),使用加权的最小平方误差。Use weighted least square error.
Question: CBOW和Skip-Gram哪个更好?
不一定,但一般Skip-Gram效果好于CBOW:
- Data size(window size):例如在 w 1 , w 2 , w 3 , w 4 , w 5 {w_1,w_2,w_3,w_4,w_5} w1,w2,w3,w4,w5中,window size = 1, CBOW中有3个样本,Skip-Gram中有8个样本。
- 难易度:CBOW由多个上下文词预测中心词相对简单,Skip-Gram由单个中心词预测上下文词相对困难。
- Smoothing effect:在CBOW中,对于出现次数少的词效果不好,对于出现次数多的词效果很好。上下文单词中有词频多与少的词被Average Pooling(平均值)过程综合了部分单词特征:平均值减弱了词频数少的单词的表示效果。
4.2 Gaussian Embedding
用来衡量两个概率分布的相似度/差异性:KL Divergence(Kullback–Leibler divergence,KL散度)
对于概率分布P(x)和Q(x):
D ( P ∣ ∣ Q ) = ∑ P ( x ) l o g ( P ( x ) / Q ( x ) ) D(P||Q)= \sum P(x)log(P(x)/Q(x)) D(P∣∣Q)=∑P(x)log(P(x)/Q(x))
P(x)和Q(x)相似性越高,KL散度越小。
问题:对corpus中出现频率高和低的词学习到的词向量有什么问题?
从统计学角度,出现次数多的可信度更高,对于每个词的词向量可以计算概率分布 N ( μ , σ ) N(\mu,\sigma) N(μ,σ)。通过计算两个词向量分布之间的KL散度,判断相似性高低。
4.3 Contextual Embedding
解决一词多义问题。
考虑上下文:ELMo, BERT, XLNet
5. 文本特征工程
Text Features:
- tf-idf:词库大小|V|
- Word2vec/Sentence2Vec: 词向量的嵌入维数k
- n-gram:使用bigram,trigram等特征,大小S>>|V|
- POS词性
- 主题特征:可以LDA计算得到
- Task-specific features:
- word count (每句话有多少单词)
- 大写有多少个?
- 是否包含人名?(0/1)
- 字符的长度
- 句子的长度
- (情感分析)出现多少个负面词?
- (情感分析)出现多少个正面词?
- (情感分析)出现多少个否定词?
- …
n-gram特征:对于词库V,Bi-gram可以构建从V中选出任意两个词的所有组合,(组合个数)大小为S>>|V|(每两个词看作是一个“词”,形成新的词库),对于corpus里每个句子,可以根据Bi-gram进行0-1编码(对句子单词前后两两组合,如果组合出现在Bi-gram就为1,否则0)。
欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。