我熟悉使用 BOW 特征进行文本分类,其中我们首先找到语料库的词汇量大小,它成为我们特征向量的大小。对于每个句子/文档,以及它的所有组成词,我们然后根据该词在该句子/文档中的缺席/存在来放置 0/1。
但是,既然我正在尝试使用每个单词的向量表示,那么创建全局词汇表是否必不可少?
我熟悉使用 BOW 特征进行文本分类,其中我们首先找到语料库的词汇量大小,它成为我们特征向量的大小。对于每个句子/文档,以及它的所有组成词,我们然后根据该词在该句子/文档中的缺席/存在来放置 0/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)
要得到每个句子的固定长度的特征向量,虽然每个句子的单词个数不同,但请执行以下操作:
下面是代码片段
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 是对句子进行标记后获得的标记列表。