我想制作一个二维二进制数组(n_samples,n_features),其中每个样本都是一个文本字符串,每个特征都是一个单词(unigram)。
问题是样本数为350000,功能数为40000,但我的RAM大小仅为4GB。
使用CountVectorizer后出现内存错误。那么,还有其他方法(比如小批量)吗?
如果我使用HashingVectorizer,那么如何获取feature_names?即哪个列对应哪个功能?,因为在HashingVectorizer中没有get_feature_names()方法。
答案 0 :(得分:3)
计数器中不支持迷你批次。但是,sklearn的哈希矢量化器可以使用partial_fit()
。
引用sklearn文档"无法计算逆变换(从特征索引到字符串特征名称),这在尝试内省哪些特征对模型最重要时可能是个问题。 #34;
答案 1 :(得分:2)
要获取HashingVectorizer的功能名称,您可以随机抽取文档,为它们计算哈希值,并通过这种方式了解哪个哈希对应于哪个标记。它并不完美,因为可能存在对应于给定列的其他令牌,并且可能存在冲突,但通常这足以检查矢量化结果(或者例如使用散列特征的线性分类器的系数)。
一个无耻的插件 - https://github.com/TeamHG-Memex/eli5包实现了这个:
from eli5.sklearn import InvertableHashingVectorizer
# vec should be a HashingVectorizer instance
ivec = InvertableHashingVectorizer(vec)
ivec.fit(docs_sample) # e.g. each 10-th or 100-th document
names = ivec.get_feature_names()
另请参阅:eli5文档中的Debugging Hashing Vectorizer部分。