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

15

我熟悉使用BOW特征进行文本分类,首先找到语料库的词汇量,并将其作为我们的特征向量大小。然后对于每个句子/文档,以及其中所有单词,我们根据该单词在该句子/文档中的出现情况,分别标记0/1。

但是,现在我正在尝试使用每个单词的向量表示,是否必须创建全局词汇表?


什么是“全局词汇”? - Daniel
1
我需要为每个句子创建一个固定长度的特征向量,尽管每个句子的单词数是不同的。因此,我需要计算整个语料库的词汇量,并将特征向量长度保持与词汇量相等。这就是我所说的全局词汇表。对于我的措辞不够清晰,我感到抱歉。 - Satarupa Guha
2个回答

7
假设向量的大小为N(通常在50或500之间)。广义上推广传统的BOW的方法是将0位(在BOW中)替换为N个零,将1位(在BOW中)替换为实际向量(例如来自Word2Vec)。然后特征的大小将是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|个特征)中可以学到的任何东西,它都应该能够从词袋模型(具有|V|个特征)中学到。例如,考虑逻辑回归;在这种表示法上的任何模型都等同于在词袋模型上的相应模型。所以这似乎是毫无意义的。我错过了什么吗? - D.W.

0
为了获得每个句子的固定长度特征向量,即使每个句子中的单词数不同,也可以按照以下步骤进行:
  1. 将每个句子标记成组成单词
  2. 对于每个单词获取单词向量(如果不存在则忽略该单词)
  3. 平均所有您获得的单词向量
  4. 这将始终给您一个d维向量(d是单词向量维度)
下面是代码片段
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是在对句子进行分词后获得的标记列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接