文章

09 情感分类(Sentiment Classification)

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\]

  这样模型就能利用词序。

  所以它能区分:

  • good
  • not good
  • lacking in good taste

  这些完全不同的表达。

为什么预训练词嵌入还能继续帮忙

  即使标注情感数据集里没出现某个词,
如果这个词在大语料预训练阶段出现过,
词嵌入仍然能帮助模型理解它的语义。

  课程里举的例子是:

  • lacking
  • absent

  如果嵌入知道它们语义相近,
分类器就有机会正确泛化。

小白怎么理解这两种模型的区别

平均词向量模型

  像是:

把一句话里所有词义混在一起,求一个总印象。

  快、简单,但不懂语序。

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 goodlacking in good taste 这类表达,通常需要 RNN 这类会看词序的模型。

本文由作者按照 CC BY 4.0 进行授权