如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?

Posted

技术标签:

【中文标题】如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?【英文标题】:How to use vector representation of words (as obtained from Word2Vec,etc) as features for a classifier? 【发布时间】:2014-12-21 13:42:07 【问题描述】:

我熟悉使用 BOW 特征进行文本分类,其中我们首先找到语料库的词汇量大小,这成为我们特征向量的大小。对于每个句子/文档,以及它的所有组成词,我们然后根据该词在该句子/文档中的缺席/存在来放置 0/1。

但是,既然我正在尝试使用每个单词的向量表示,那么创建全局词汇表是否必不可少?

【问题讨论】:

什么是“全球词汇”? 我需要每个句子都有一个固定长度的特征向量,虽然每个句子的字数不同。所以我需要计算整个语料库的词汇量,并保持特征向量长度等于词汇量。这就是我所说的全球词汇。对困惑感到抱歉。我的话不够清楚。 【参考方案1】:

假设向量的大小为 N(通常在 50 或 500 之间)。推广传统泛化 BOW 的简单方法只是用 N 个零替换 0 位(在 BOW 中),并用实际向量(例如来自 Word2Vec)替换 1 位(在 BOW 中)。那么特征的大小将是 N * |V| (与 BOW 中的 |V| 特征向量相比,其中 |V| 是词汇的大小)。这种简单的概括应该适用于相当数量的训练实例。

为了使特征向量更小,人们使用各种技术,例如使用具有各种操作的向量的递归组合。 (参见递归/递归神经网络和类似技巧,例如:http://web.engr.illinois.edu/~khashab2/files/2013_RNN.pdf 或 http://papers.nips.cc/paper/4204-dynamic-pooling-and-unfolding-recursive-autoencoders-for-paraphrase-detection.pdf)

【讨论】:

我不明白为什么您第一段中的方案比简单的词袋更好。分类器可以从这种表示中学习到的任何东西(具有 N*|V| 特征),它应该能够从 BOW 表示中学习(具有 |V| 特征)。例如,考虑逻辑回归;此表示上的任何模型都等效于 BOW 表示上的相应模型。所以这似乎毫无意义。我错过了什么吗?【参考方案2】:

要为每个句子得到一个固定长度的特征向量,虽然每个句子的单词个数不同,但是如下:

    将每个句子标记为组成词 为每个词获取词向量(如果不存在则忽略该词) 平均你得到的所有词向量 这总是会给你一个 d-dim 向量(d 是词向量 dim)

下面是代码片段

def getWordVecs(words, w2v_dict):
    vecs = []
    for word in words:
        word = word.replace('\n', '')
        try:
            vecs.append(w2v_model[word].reshape((1,300)))
        except KeyError:
            continue
    vecs = np.concatenate(vecs)
    vecs = np.array(vecs, dtype='float')
    final_vec = np.sum(vecs, axis=0)
return final_vec

words 是对句子进行标记后获得的标记列表。

【讨论】:

以上是关于如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Word2Vec 获取单词列表的向量?

如何同时使用 word2vec 和 RNN?

如何使用 word2vec 找到最接近向量的单词

word2vec是如何得到词向量的?

Glove词向量

word2vec是如何得到词向量的