09 情感分类(Sentiment Classification)
这一节在讲什么
这节课讲词嵌入在一个非常实用的任务里的应用:情感分类。
任务形式是:
- 输入一段文本
- 输出这段文本表达的是正面、负面还是几星评价
课程里的例子
例如餐馆评论:
The dessert is excellent.-> 四星Service was quite slow.-> 两星Good for a quick meal but nothing special.-> 三星Completely lacking in good taste, good service and good ambiance.-> 一星
这就是典型的从文本 $x$ 到标签 $y$ 的分类任务。
为什么词嵌入在这里特别有用
因为情感分类往往标注数据不算特别大。
课程里提到,很多情感分类数据集规模大概在:
- 10000 到 100000 词
- 甚至更小
这时候,预训练词嵌入就很有帮助。
最简单的模型:词向量求和或平均
课程先讲了一个非常简单但有效的模型。
步骤 1:把每个词转成词嵌入
例如句子:
\[\text{dessert is excellent}\]把每个词查成向量:
\[e_{\text{dessert}}, e_{\text{is}}, e_{\text{excellent}}\]步骤 2:求和或求平均
\[v = \frac{1}{T} \sum_{t=1}^{T} e_{w_t}\]这里 $v$ 就是整句的表示。
步骤 3:送进 softmax
用它预测情感标签:
\[\hat y = \mathrm{softmax}(Wv+b)\]这个简单模型为什么有效
因为词嵌入已经把词义信息压到了向量里。
所以“dessert”“excellent”这样的词平均起来,
句子整体就会偏向正面语义。
但它有一个严重缺点:不看词序
课程特别用一个反例说明:
\[\text{Completely lacking in good taste, good service, and good ambiance.}\] 这里虽然出现了很多次 good,
但整句话其实是强烈负面。
如果你只做词向量求和/平均,模型可能会被很多个 good 误导,错判成好评。
更好的模型:RNN
于是课程给出更强的方案:
- 先把每个词变成嵌入向量
- 再送进 RNN
- 用最后一步隐藏状态做分类
这本质上是一个多对一结构:
\[(e_{w_1}, e_{w_2}, \dots, e_{w_T}) \xrightarrow{\mathrm{RNN}} \hat y\]这样模型就能利用词序。
所以它能区分:
goodnot goodlacking in good taste
这些完全不同的表达。
为什么预训练词嵌入还能继续帮忙
即使标注情感数据集里没出现某个词,
如果这个词在大语料预训练阶段出现过,
词嵌入仍然能帮助模型理解它的语义。
课程里举的例子是:
lackingabsent
如果嵌入知道它们语义相近,
分类器就有机会正确泛化。
小白怎么理解这两种模型的区别
平均词向量模型
像是:
把一句话里所有词义混在一起,求一个总印象。
快、简单,但不懂语序。
RNN 模型
像是:
按顺序把整句话读一遍,再综合判断情感。
更懂语境,也更能处理否定和修饰。
这一节最该记住的公式
句子向量的简单做法
\[v = \frac{1}{T} \sum_{t=1}^{T} e_{w_t}\]softmax 分类
\[\hat y = \mathrm{softmax}(Wv+b)\]这一节最该记住的要点
要点 1:情感分类是词嵌入非常实用的落地场景
尤其适合中小规模标注数据。
要点 2:词向量平均是简单但有效的基线模型
实现容易,效果往往不差。
要点 3:它的最大问题是不看词序
这会让否定句和复杂句容易出错。
要点 4:RNN 版本更适合真实语义判断
因为它能理解顺序和上下文。
这一节一句话总结
情感分类中,预训练词嵌入能显著提升小数据任务效果;最简单的做法是对词向量求平均再分类,但要真正处理 not good、lacking in good taste 这类表达,通常需要 RNN 这类会看词序的模型。