如何处理 word2vec 中的否定词?

数据挖掘 机器学习 神经网络 nlp word2vec
2021-09-18 16:20:02

我正在使用 word2vec 训练一个大型语料库,并对单词向量进行平均以获得句子向量。解决否定词的最佳方法是什么,以使否定句和肯定句彼此远离?例如:“在修复代码工作之后”和“在修复代码不起作用之后”应该理想地给出彼此相距很远的句子向量。我听说一种方法是寻找像“not”这样的否定词并否定下一个词向量。有人可以澄清这是一个好方法还是可以提出更好的方法?

3个回答

当您查看 word2vec 生成的向量时 - 否定词可能具有独特的特征,但可以像肯定词一样对待。也就是说,就NN而言-这些只是相似的词。您可能必须在词向量之上构建“概念向量”来做您想做的事情。

您的词性标注应该自动将否定词标记为 ADV。然后,您可以将这些副词与您的动词一起作为正面或负面输出进行训练。这是一个使用 spacy 的示例:-

import spacy

nlp = spacy.load('en')        # this can take a while
sample_text = u'Do not go.'
parsed_text = nlp(sample_text)
token_text = [token.orth_ for token in parsed_text]
token_pos = [token.pos_ for token in parsed_text]

此时 token_text 将是您的单词列表,而 token_pos 将是 POS 标记:-

Do - VERB
not - ADV
go - VERB
. - PUNCT

如您所见,“not”在此处被标记为 ADV。您现在可以将此标记输出(或更好的解析树)输入第二个网络,以训练负输出或正输出。

希望这可以帮助。

有可能改进 word2vec 向量,正如研究表明的那样,它们可以同时捕获语义相关性和语义相似性,从而可以捕获单词之间的关系,例如反义词或否定词。您可以查看Counter-Fitting方法(或相关工作中的方法)。他们的实施应该可以在线获得。这可能会改善您的情绪分析方法的结果。