Text classification
- Multi-class: many labels, only one correct
- Binary-class: two labels, only one correct
- Muti-label classification: many labels, several can be correct
我们假设我们有一个带有真实标签的文档集合。分类器的输入是带有标记 ( ( x 1 , … , x n ) ) ((x_1, \dots, x_n)) ((x1,…,xn)) 的文档 ( x = ( x 1 , … , x n ) ) (x=(x_1, \dots, x_n)) (x=(x1,…,xn)),输出是一个标签 ( y ∈ 1 … k ) (y \in 1\dots k) (y∈1…k)。通常,分类器估计类的概率分布,我们希望正确类的概率最高。
文本分类器
-
特征提取器
经典方法或者学习(神经网络)
-
分类器
必须为给定文本的特征表示形式分配类概率。最常见的方法是逻辑回归,也可以用贝叶斯分类器或者svm
生成模型:
p ( x , y ) = p ( x ∣ y ) ⋅ p ( y ) p(x, y) = p(x|y)\cdot p(y) p(x,y)=p(x∣y)⋅p(y)
y = a r g max k p ( x ∣ y = k ) ⋅ p ( y = k ) y=arg \max\limits_kp(x|y=k)⋅p(y=k) y=argkmaxp(x∣y=k)⋅p(y=k)
选取联合概率最高的类
条件模型
p ( y ∣ x ) p(y|x) p(y∣x)
$ y=arg \max\limits_kp(y=k|x)$
选取一个条件概率最高的类
经典方法
朴素贝叶斯分类器
朴素贝叶斯是一个生成模型:它对数据的联合概率进行建模。
- 先验概率 P ( y = k ) P(y=k) P(y=k):查看数据之前的类概率(即,在知道x之前);
- 后验概率 P ( y = k ∣ x ) P(y=k|x) P(y=k∣x):查看数据后的类概率(即,在知道特定的x之后);
- 联合概率 P ( x , y ) P(x,y) P(x,y):数据的联合概率(即,示例 x 和标签 y ) ;
- 最大后验(MAP)估计:我们选择具有最高后验概率的类。
朴素贝叶斯假设:
- 词序无关
- 给定类的特征是独立的
P ( x ∣ y = k ) = P ( x 1 , … , x n ∣ y = k ) = ∏ t = 1 n P ( x t ∣ y = k ) P(x|y=k)=P(x_1,…,x_n|y=k)=∏ \limits_{t=1}^nP(x_t|y=k) P(x∣y=k)=P(x1,…,xn∣y=k)=t=1∏nP(xt∣y=k)
$P(x_i|y=k)=\frac{N(x_i,y=k)}{\sum\limits_{t=1}^{|V|}N(x_t,y=k)} $
如果 N ( x i , y = k ) = 0 N(x_i, y=k)=0 N(xi,y=k)=0怎么办?需要避免这种情况!
使用一个简单的技巧:我们将所有单词的计数添加一个小的 δ \delta δ,称为拉普拉斯平滑
$P(x_i|y=k)=\frac{\color{red}{\delta} +\color{black} N(x_i, y=k) }{\sum\limits_{t=1}^{|V|}(\color{red}{\delta} +\color{black}N(x_t, y=k))}= \frac{\color{red}{\delta} +\color{black} N(x_i, y=k) }{\color{red}{\delta\cdot |V|}\color{black} + \sum\limits_{t=1}^{|V|}\color{black}N(x_t, y=k)} $
朴素贝叶斯(以及更广泛的生成模型)根据数据和类的联合概率进行预测: y ∗ = arg max k P ( x , y = k ) = arg max k P ( y = k ) ⋅ P ( x ∣ y = k ) y^{\ast} = \arg \max\limits_{k}P(x, y=k) = \arg \max\limits_{k} P(y=k)\cdot P(x|y=k) y∗=argkmaxP(x,y=k)=argkmaxP(y=k)⋅P(x∣y=k)
在情感分析方面,用单词做指标,累加判断整个句子是正类还是负类
在实践中,我们通常会处理对数概率而不是概率。
最大熵分类器
-
获取 h = ( f 1 , f 2 , . . . , f n ) h=(f_1,f_2,...,f_n) h=(f1,f2,...,fn) 输入文本的特征表示;
-
拿 w ( i ) = ( w 1 ( i ) , . . . , w n ( i ) ) w(i)=(w_1(i),...,w_n(i)) w(i)=(w1(i),...,wn(i)) - 具有每个类的特征权重的向量;
-
对于每个类,权衡特征,即取特征表示的点积h具有特征权重 w ( k ) : w ( k ) h = w 1 ( k ) ⋅ f 1 + ⋯ + w n ( k ) ⋅ f n , k = 1 , … , K w^{(k)}:w^{(k)}h=w_1^{(k)}⋅f_1+⋯+w_n{(k)}⋅f_n, k=1,…,K w(k):w(k)h=w1(k)⋅f1+⋯+wn(k)⋅fn,k=1,…,K
为了得到上述总和中的偏差项,我们将其中一个特征定义为1(例如, f 0 = 1 f_0=1 f0=1)
w ( k ) : w ( k ) h = w 0 ( k ) + w 1 ( k ) ⋅ f 1 + ⋯ + w n ( k ) ⋅ f n , k = 1 , … , K w^{(k)}:w^{(k)}h=w_0^{(k)}+w_1^{(k)}⋅f_1+⋯+w_n{(k)}⋅f_n, k=1,…,K w(k):w(k)h=w0(k)+w1(k)⋅f1+⋯+wn(k)⋅fn,k=1,…,K
-
使用 softmax 获取类概率: P ( c l a s s = k ∣ h ) = e x p ( w ( k ) h ) ∑ i = 1 K e x p ( w ( i ) h ) P(class=k|h)=exp(w^{(k)}h)∑_{i=1}^Kexp(w^{(i)}h) P(class=k∣h)=exp(w(k)h)∑i=1Kexp(w(i)h).
Softmax 规范化K我们在上一步得到的值是输出类上的概率分布。
训练方式:最大似然估计 w ∗ = arg max ∑ i = 1 N log P ( y = y i ∣ x i ) w^*=\arg \max \sum\limits_{i=1}^N \log P(y=y^i|x^i) w∗=argmaxi=1∑NlogP(y=yi∣xi)
I这等价于最小化交叉熵 l o s s ( p ∗ , p ) = − ∑ i = 1 K p i ∗ log ( p i ) loss(p^*, p)=-\sum\limits_{i=1}^Kp_i^*\log (p_i) loss(p∗,p)=−i=1∑Kpi∗log(pi)
SVM
最基本(和流行)的功能是单词袋和 ngram 包(ngram 是 n 个单词的元组)。通过这些简单的功能,具有线性核的SVM的性能优于朴素贝叶斯
神经网络方法
使用神经网络获得输入文本的特征表示
获取K-大小矢量。
从d-大小,我们可以使用线性层。一旦我们有了K-大小向量,剩下的就是应用 softmax 运算将原始数字转换为类概率。
文本分类模型
我们需要一个可以为不同长度的输入生成固定大小的矢量的模型。
嵌入带(BOE)
BOE是嵌入的总和,BOW是一热向量的总和:BOE对语言的了解更多。预先训练的嵌入(例如,Word2Vec或GloVe)理解单词之间的相似性。
循环网络:RNN/LSTM
Vanilla RNN: h t = t a n h ( h t − 1 W h + x t W t ) h_t = tanh(h_{t-1}W_h+x_tW_t) ht=tanh(ht−1Wh+xtWt)
存在梯度消失和梯度爆炸的问题
- 简单:阅读文本,采取最终状态
最简单的循环模型是单层 RNN 网络。在这个网络中,我们必须采取对输入文本有更多的了解的状态。因此,我们必须使用最后一个状态 - 只有此状态看到了所有输入令牌。
- 多层:将状态从一个 RNN 馈送到下一个 RNN
要获得更好的文本表示,可以堆叠多个图层。在这种情况下,较高 RNN 的输入是来自上一层的表示形式。
主要假设是,通过几个层,较低层将捕获局部现象(例如,短语),而较高层将能够学习更多高级事物(例如,主题)。
- 双向:使用来自前向和后向RNN的最终状态。
以前的方法可能有一个问题:最后一个状态可以很容易地"忘记"早期的令牌。即使是像LSTM这样的强大模型仍然会受到这种影响!
为了避免这种情况,我们可以使用两个 RNN:向前,它从左到右读取输入,向后,它从右到左读取输入。然后,我们可以使用两个模型的最终状态:一个将更好地记住文本的最后部分,另一个 - 开头。这些状态可以串联,或求和,或其他东西 - 这是你的选择!
CNN卷积神经网络
文本采用一维卷积,根据窗口的线性层(过滤器)提取特征
最流行的是最大池化:它在每个维度上获取最大值,即获取每个特征的最大值。
使用多个具有不同内核大小的卷积,而不是为卷积选择一个内核大小。配方很简单:将每个卷积应用于数据,在每个卷积之后添加非线性和全局池化