1 前言
在NLP中,会遇到这样的一个应用问题:如何将文本中的某个短语/实体归一化为(对齐)某个标准名?解决该问题的办法很多,比如使用近义词词库进行匹配,或检索词语类的知识库(HowNet),也可用word2vec之类的词向量技术进行cosine相似计算。再高级点,可利用像BERT之类的预训练模型进行预测。但是上述的方法都存在一个共同的缺陷,都没考虑关键词所在的语义环境。基于这个问题,有两个方法来解决。
2 方法一
论文《CASE: Context-Aware Semantic Expansion》基于上下文语义来挖掘相似词或近义词。如要挖掘句子中与“氨基酸”(amino acid)相似的语义词,若不考虑语义环境,与之匹配的有维生素(vitamin)、抗氧化剂(antioxidant)、脂肪(fat)等等;但若考虑文本语义,脂肪不能作为氨基酸扩充的语义词,因为青稞草(amino acid)不富含脂肪,这在语料库中也不会有类似的描述。
先定义如下学习任务:
其中 C为句子文本,"__"为替代文本中seed term(s)的占位符,T表示潜在与占位符同级的下义词(hyponym)集合,任务的目标即为找到除s外的语义词,即训练目标如下:
表示为,在输入句子文本C与种子词s条件下,求除种子词的其他词最大概率。下图为模型的整体框架。
从模型图可以看出,主要分三个部分:Context Encoder、Seed Encoder、Prediction Layer,下面简单介绍下这三个模块。
2.1 Context Encoder
文中作者提出四种编码方法,第一种为Neural Bag-of-Words Encoder,该方法是利用N-gram的思路,通过looksup词表的方式,得到句子的所有词向量,然后以纵向相加求平均得到句子向量; 第二,三种分布为RNN-Based Encoders 、 CNN-Based Encoders,通过两种编码网络得到句子向量;第四种为Position-Aware Encoders,具体采用类似CNN+PF的方式,将位置信息也嵌入进行学习。最后,通过Context Encoder得到句子向量V_C。
2.2 Seed Encoder
关于句子中Seed Term的编码,文章同样是采用Neural Bag-of-Words Encoder,因为Seed Term有可能是由多个word组成的,所以得到的向量V_S如下:
2.4 Prediction Layer
模型的第三部分就是预测扩充的词条,Predicting Expansion Terms,具体为想将上述两个编码层得到的两个向量 concatenation方式得到最终向量x,然后输入softmax层进行预测:
在实际中,相似的语义词有可能很多,而softmax正常只是输出概率最大的一个。文中为了缓解该问题,作者采用sampled softmax loss的方式,实现multi-label的方式进行预测,这样可以大大提高预测效率。
此外,文中在Context Encoder部分还尝试了Attention机制,并提出两种结合方式,一种为Seed-Oblivious Attention,该方法是将句子每个词学一个权重,然后再加权计算最终句子向量;另中为Seed-Aware Attention,该方法是将句子每个词相对Seed Term学一个权重,这里文中提出DOT与TRANS-DOT两种计算方法,然后再加权计算最终句子向量。此环节详情若有兴趣可查看原文。
2 方法二
最粗暴的方法是直接转化为短文本相似度计算的问题,分别对对待查询的短语和标准词做encode,然后计算二者之间的相似度,因为两者之间的相似度比原文的文本表征更为重要,最典型的方法就是孪生网络