星座侃论 > 杂谈 > 正文

​中文词组的输入方法 词嵌入方法

2024-02-22 19:33 来源:星座侃论 点击:

中文词组的输入方法 词嵌入方法

感谢阅读「美图数据技术团队」的原创文章,关注我们持续获取美图最新数据技术动态。

计算机理解自然语言是个很困难的问题。第一个重要的步骤是如何将文字表达成计算机可识别的方式。通常的做法是通过数学模型进行运算把文字(词语)转化成数字或向量表示。以下我们将分别简述几种常用的数学表述方法及中文词嵌入最新的进展:

1# 索引(Index)

索引是把句子中所有出现的词语提取出来建立一个词典,给每个词语赋予唯一的序号。如下例所示:

[一棵,是,枣树,另,一棵,也,是,枣树] = [0, 1, 2, 3, 0, 4, 1, 2]

由于这种序号可作为分类信号,序号之间的数值没有实际物理意义,不能直接用于运算。

2# 独热编码(One-Hot Encoding)

独热编码是将每个词语表达为一个词典长度的向量,每个词向量中对应词语序号所在的位置为数值 1,其它位置均为 0。以上文中 [一棵,是,枣树,另,一棵,也,是,枣树] 为例,该编码表达为:

[[1, 0, 0, 0, 0],

[0, 1, 0, 0, 0],

[0, 0, 1, 0, 0],

[0, 0, 0, 1, 0],

[1, 0, 0, 0, 0],

[0, 0, 0, 0, 1],

[0, 1, 0, 0, 0],

[0, 0, 1, 0, 0]]

这种方法虽然可以对模型进行运算,但映射出来的词向量都是两两正交,无法体现词语间的语义相关性;而且矩阵过于稀疏,在词典较大的情况下空间浪费很大。

3# 共现编码(Co-Occurence Encoding)

共现编码则是以某个词为中心,找到它左右区间的词语,根据临近词的位置定坐标,等所有词都定好坐标后再将相同项相加,得到最终坐标向量。以上文中[一棵,是,枣树,另,一棵,也,是,枣树] 以 2-gram 为例, 该编码表达为:

[[0,1, 0, 0, 0],

[1,0,1,0,0],

[0,1,0,1,0],

[1,0,1,0,0],

[0,0,0,1,1],

[1,0,1,0,0],

[0,0,1,0,1],

[0,1,0,0,0]]

由于相同意义的词周围往往容易出现相同的词,因此这种方法适用于找出词义相近的词语,同时亦考虑了词出现的次序,但它同样面临着词向量过长的问题。

此外,还有其他各种传统词语的表示法,但是大多传统的方法都会面临词典过大时带来的词向量过长、数据过于稀疏的问题。为了解决以上的问题,基于神经网络的词嵌入(word embedding)方法逐渐成为主流。

词嵌入是自然语言处理中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

via 维基百科

通俗来说,词嵌入就是把词典里的每一个词分别表示为一个向量,得到的向量通常称为「词向量」,好的映射可以有效抽取词语间的语义相关性。根据这个定义,实际上传统的 one-hot encoding、index 等方法也可以被称为词嵌入方法,但从狭义的角度而言,以下讨论的「词向量」一词,都是指基于神经网络训练的词嵌入方法。

词嵌入在自然语义理解领域内所有任务中都担任着最基础、最核心的功能,包括文本分类、文本摘要、信息检索、自动对话等,通过词嵌入得到好的词向量作为模型的初始参数,可以帮助几乎所有的各类 NLP 任务取得更好的效果。

一个好的「词嵌入」可以读取词语与词语之间的语义信息,同时也会避免稀疏性,节省空间。我们把词语与词语之间的语义相近程度称为相似度,举个例子:

高兴 = (1.00, -0.31, 0.42, -0.02, -0.23)

开心 = (0.90, -0.25, 0.45, -0.10, -0.11)

难过 = (-0.80, 0.33, -0.35, 0.04, 0.09)

天气 = (0.82, 0.21, -0.30, 0.55, 0.71)

假设以上四个词存在于同一个五维空间内,其中「高兴」与「开心」语义较为接近,他们每个向量正负相同,在同一个区域内,并且各个维度的数值都十分接近,这种情况下可以说它的相似度高。而「高兴」与「难过」是反义词,用向量表达时正负值一般为相反,距离更远。词语「天气」与其余词没有很明显的语义相关关系,故无呈现出特殊相关规则。

以上是对于相似度定性的讨论,而一般定量地,相似度大小可以通过余弦相似度来衡量,余弦相似度可通过以下公式计算: