自然语言情感分析

    简单的说,我们可以将情感分析(sentiment classification)任务定义为一个分类问题,即指定一个文本输入,机器通过对文本进行分析、处理、归纳和推理后自动输出结论,如图1所示。

    图1:情感分析任务

    通常情况下,人们把情感分析任务看成一个三分类问题,如 图2 所示:

    自然语言情感分析 - 图2

    图2:情感分析任务

    • 负向: 表示负面消极的情感,如难过,伤心,愤怒,惊恐等。
    • 其他: 其他类型的情感。

    在情感分析任务中,研究人员除了分析句子的情感类型外,还细化到以句子中具体的“方面”为分析主体进行情感分析(aspect-level),如下:

    关于薯片的口味方面是一个负向评价(咸,太辣),然而对于口感方面却是一个正向评价(很脆)。

    我很喜欢夏威夷,就是这边的海鲜太贵了。

    关于夏威夷是一个正向评价(喜欢),然而对于夏威夷的海鲜却是一个负向评价(价格太贵)。

    上一节课我们学习了通过把每个单词转换成向量的方式,可以完成单词语义计算任务。那么我们自然会联想到,是否可以把每个自然语言句子也转换成一个向量表示,并使用这个向量表示完成情感分析任务呢?

    在日常工作中有一个非常简单粗暴的解决方式:就是先把一个句子中所有词的embedding进行加和平均,再用得到的平均embedding作为整个句子的向量表示。然而由于自然语言变幻莫测,我们在使用神经网络处理句子的时候,往往会遇到如下两类问题:

    我不爱吃你做的饭。

    你不爱吃我做的饭。

    因此,我们需要找到一个可以考虑词和词之间顺序(关系)的神经网络,用于更好地实现自然语言句子建模。

    在使用神经网络处理变长数据时,需要先设置一个全局变量max_seq_len,再对预料中的句子进行处理,将不同的句子组成mini-batch,用于神经网络学习和处理。

    1. 设置全局变量

    设定一个全局变量max_seq_len,用来控制神经网络最大可以处理文本的长度。我们可以先观察语料中句子的分布,再设置合理的max_seq_len值,以最高的性价比完成句子分类任务(如情感分类)。

    2. 对语料中的句子进行处理

    我们通常采用截断+填充 的方式,对语料中的句子进行处理,将不同的句子组成mini-batch,以便让句子转换成一个张量给神经网络进行处理计算,如 图 3 所示。

    图3:变长数据处理

    • 对于长度超过max_seq_len的句子,我们通常会把这个句子进行截断,以便可以输入到一个张量中。句子截断的过程是有技巧的,有时截取句子的前一部分会比后一部分好,有时则恰好相反。当然也存在其他的截断方式,有兴趣的读者可以翻阅一下相关资料,这里不做赘述。
    • 对于句子长度不足max_seq_len的句子,我们一般会使用一个特殊的词语对这个句子进行填充,这个过程称为Padding。假设给定一个句子“我,爱,人工,智能”,max_seq_len=6,那么可能得到两种填充方式:
      • 前向填充: “[pad],[pad],我,爱,人工,智能”

    同样,不同的填充方式也对网络训练效果有一定影响。一般来说,我们比较倾向选择后向填充的方式。

    学习句子的语义

    上一节课我们已经学习了如何学习每个单词的语义信息,从刚才的举例中我们也会观察到,一个句子中词的顺序往往对这个句子的整体语义有比较重要的影响。因此,在刻画整个句子的语义信息过程中,不能撇开顺序信息。如果简单粗暴地把这个句子中所有词的向量做加和,会使得我们的模型无法区分句子的真实含义,例如:

    我不爱吃你做的饭。

    你不爱吃我做的饭。

    一个有趣的想法,把一个自然语言句子看成一个序列,把整个自然语言的生成过程看成是一个序列生成的过程。例如对于句子“我,爱,人工,智能”,这句话的生成概率

    可以被表示为:

    自然语言情感分析 - 图5

    其中

    自然语言情感分析 - 图7 是两个特殊的不可见符号,表示一个句子在逻辑上的开始和结束。

    上面的公式把一个句子的生成过程建模成一个序列的决策过程,这就是香农在1950年左右提出的使用马尔可夫过程建模自然语言的思想。使用序列的视角看待和建模自然语言有一个明显的好处,那就是在对每个词建模的过程中,都有一个机会去学习这个词和之前生成的词之间的关系,并利用这种关系更好地处理自然语言。如 图4 所示,生成句子“我,爱,人工”后,“智能”在下一步生成的概率就变得很高了,因为“人工智能”经常同时出现。

    图4:自然语言生成过程示意图