我最近阅读了一些关于情感分类(分析)的现代文章,例如这篇。
以IMDB数据集为例,我发现使用Doc2Vec获得的准确率百分比相似(88%),然而使用简单的tfidf向量化器和三元语法进行特征提取时结果要好得多(91%)。我认为这与Mikolov 2015年的论文中的表2相似。
我原本以为使用更大的数据集会改变这种情况。因此,我重新运行了实验,使用来自这里的100万训练样本和100万测试样本。不幸的是,在这种情况下,我的tfidf向量化器特征提取方法提高到了93%,而doc2vec下降到了85%。
我想知道这是不是可以预期的现象,其他人是否也发现即使对于大型语料库,tfidf也比doc2vec更优越?
我的数据清理方法很简单:
def clean_review(review): temp = BeautifulSoup(review, "lxml").get_text() punctuation = """.,?!:;(){}[]""" for char in punctuation temp = temp.replace(char, ' ' + char + ' ') words = " ".join(temp.lower().split()) + "\n" return words
我尝试使用了400和1200个特征来构建Doc2Vec模型:
model = Doc2Vec(min_count=2, window=10, size=model_feat_size, sample=1e-4, negative=5, workers=cores)
而我的tfidf向量化器的最大特征数为40,000:
vectorizer = TfidfVectorizer(max_features = 40000, ngram_range = (1, 3), sublinear_tf = True)
在分类方面,我尝试了几种线性方法,但发现简单的逻辑回归效果还不错…
回答:
Mikolov曾经发布的示例代码(https://groups.google.com/d/msg/word2vec-toolkit/Q49FIrNOQRo/J6KG8mUj45sJ)使用了选项-cbow 0 -size 100 -window 10 -negative 5 -hs 0 -sample 1e-4 -threads 40 -binary 0 -iter 20 -min-count 1 -sentence-vectors 1
——在gensim中,这相当于dm=0, dbow_words=1, size=100, window=10, hs=0, negative=5, sample=1e-4, iter=20, min_count=1, workers=cores
。
我的直觉是,最佳值可能涉及较小的window
和较高的min_count
,以及介于100到400之间的size
,但我已经有一段时间没有进行这些实验了。
有时,在最终模型上重新推断向量,使用大于默认值的passes
参数,而不是重复使用批量训练的向量,也可能略有帮助。尽管如此,这些可能只是收敛到与Tfidf类似的性能——它们都依赖于相同的词特征,并且数据量不是很大。
转向半监督方法,其中一些文档标签代表已知的情感,有时也可能有所帮助。