我正在使用word2vec模型在训练数据集上构建分类器,我想知道如何处理测试数据中未见过的术语(词语)。
删除新术语似乎不是最好的方法。我目前的想法是重新计算合并数据集(训练+测试)的word2vec,并用训练数据集中最接近的词替换新术语(或者可能是2-3个最接近词的线性组合)。听起来有点棘手,但应该可以实现。
你是否遇到过类似的问题?关于如何处理未见过的术语,你有什么想法或建议吗?
回答:
首先,你确定删除未知术语真的很糟糕吗?(你试过吗?)如果你的训练数据中没有这些术语的例子,它们可能并不常见或重要——至少在你有更多包含多种使用例子的训练数据之前是这样的。即使它们是相关的,在你有许多前期例子之前,你也无法了解它们的重要性。
正如你所指出的,你可以重新训练一个包括新例子的Word2Vec模型,从而大致了解未知词语的位置。你可以设想然后使用所有新词向量重新训练任何下游分类器,或者将新词投影回原始空间。(这可以使用类似于利用语言间的相似性进行机器翻译论文第4节中描述的方法,除了现在你的两个‘语言’是在添加新词(词)之前和之后的模型。)但如果你只是从少数这样的词出现或可能在一个新的文本中工作,你将学到的一切关于那个词的知识已经是分类器可用的周围词的函数,所以收益可能非常小。(也就是说,只有从其他地方的许多不同例子中得到的更丰富的意义才有可能增加对新文本的理解,超越其现有语境。)
word2vec的一些变体,如Facebook的fastText,也学习词的片段的向量。这些片段被组合起来形成完整的词向量。然后当后来遇到不在原始词汇表中的新词时,它们可以从共享的片段合成词向量。当新词在形态上与已知词相关时,这种策略可以做得不错。所以你可能想看看FastText。(它还有一个模式,其中分类标签混合到词向量训练中,这可以使词向量在以后的相同标签分类中表现更好。)