- 中文同义词挖掘简介
- 词对的数据来源
- 词对数据的解决思路
- 同义语句的数据来源
- 同义语句数据的解决思路
- 其他
同义词挖掘是自然语言处理中一个较为基础的问题,但是现有的同义词词表不足以应对许多场景下的工作,所以我们需要在新的词对中寻找同义词。
但事实上,当你开始检索相关资料,就能发现这个问题的困难之处,在我们数据量和数据信息都偏少的情况下,很难保证这个问题能够被很好解决,只能在精确率和召回率这样的指标之间尽量折中。
经过一番论文阅读,我总结出同义词挖掘的数据构造思路主要有以下几种:
- 给定若干中文同义词对,寻找新的中文同义词对。
- 给定外文(主要是英文)同义词词典,翻译为对齐的中文同义词词典。
- 给定若干句子,抽取出句子中特定词(比如实体)的同义关系。
其中,数据 1 和 2 的数据形式相似,都是利用给定的词对寻找新的词对。但这些数据可利用的上下文信息较少,效果会很受预训练词向量质量的影响。而数据 3 在句子中挖掘同义关系,可以利用到句子中的上下文信息,但同时也可能引入较多噪声。
数据 1 可以从常见的中文同义词词典中构建,如哈工大社会计算与信息检索研究中心整理的《同义词词林》。
数据 2 可以使用英文同义词词典,比如 WordNet、VerbNet 这样的词网。
预训练词向量可以使用 Word2vec 训练的 Wikipedia 数据。但是此处建议大家尝试腾讯 AI Lab 开源的 800W Word Embedding,用过都说好。
较为直观的思路是:
- 直接利用预训练的词向量计算词语间的相似度(如余弦相似度)。
- 将该问题转化为二分类问题,输入为两个词的词向量,输出为是否是同义词 {0, 1}。
上述思路效果一般,主要因为这样预训练的词向量不能准确捕捉同义关系,事实上诸如 Word2vec 这样类型的词向量捕捉到的是同位关系(包括同义、同类等)。这就导致利用词向量相似来判断的结果只能保证较高的召回率,很难保证精确率。
而用简单的分类思路去做,也会因为数据量的不足导致分类效果不够好。比如对于数据 2 ,中文是没有出现在英文词典上的。
在词表相对封闭集的情况下(训练集和测试集的词表接近),有一些工作能够较好地解决这个问题:
EMNLP 2017 《Cross-Lingual Induction and Transfer of Verb Classes Based on Word Vector Space Specialisation》
这篇工作主要用于跨语言动词词表对齐, 英文词表如下:
基本思路是微调预训练的词向量,进而拉近同义词对的距离,拉远临近非同义词对的距离,同时加上正则项保证调整的幅度。这个思路体现在损失函数的设计中:
其中 表示词向量的调整:
表示正则项:
具体参数的含义可以参见原论文。
ACL 2018《Using pseudo-senses for improving the extraction of synonyms from word embeddings》
这篇工作损失函数和上篇工作相同,但是直接提出这个损失函数的设计不仅能用于跨语言词表对齐,还能在不使用外部知识的前提下,引入词向量中的同义关系。
但是,当在开放域中抽取同义词时,如果仅有少量的同义词对数据,还是基本不可能达到较好的效果的。
类似于关系抽取中的距离监督思路,我们可以对句子中希望提取同义词的词语(此处可以认为是实体)进行同义关系标注。标注方式可以直接使用同义词词典进行标注,也可以利用实体链接和知识图谱的同义词进行标注。
我们直接利用关系抽取的模型去处理这样的数据,在该数据中,关系只有两种:同义和 NA 。而关系抽取任务中常见的 Baseline 是 PCNN,PCNN 及其上面的拓展都可以直接用于该数据集。
EMNLP 2015 《Neural Relation Extraction with Selective Attention over Instances》
此外,也可以利用常见的句法分析工具,抽取出每个句子的 Pattern,将 Pattern 分类后当做针对 Pattern 的二分类任务。
韩家炜老师组在 KDD 2017 上发表的《Automatic Synonym Discovery with Knowledge Bases Meng》是一篇对我启发很大的文章。我在检索解决思路之间首先读了这篇文章,因此才萌生了将抽取方式区分为词对数据和同义语句数据两种形式的想法。建议做同义词抽取工作的同学首先阅读。