是否可以从CountVectorizer中删除最频繁/不频繁出现的一定百分比的功能?
因此,基本上从最大到最小出现分布来组织特征,而只是从左侧或右侧删除一个百分比?
答案 0 :(得分:1)
据我所知,没有直接的方法可以做到这一点。 让我提出一种实现所需结果的方法。 我假设您只对会标(单字功能)感兴趣,从而使示例也更简单。
关于特征的前x%,可能的实现方式可以基于CountVectorizer的max_features参数(请参见user guide)。 首先,您需要使用带有默认值的CountVectorizer来查找功能总数,以便它在语料库中生成完整的术语表。
vect = CountVectorizer()
bow = vect.fit_transform(corpus)
total_features = len(vect.vocabulary_)
然后将CountVectorizer与max_features参数一起使用,将功能部件的数量限制为所需的最高百分比,例如20%。使用max_features时,会自动选择最常用的术语。
top_vect = CountVectorizer(max_features=int(total_features * 0.2))
top_bow = top_vect.fit_transform(corpus)
现在,关于功能的最低x%,即使我无法想到您为什么需要它的充分理由,这也是一种方法。词汇参数可用于限制模型以仅计算不频繁的词。为此,我们使用CountVectorizer的第一次运行的输出来创建不太常用术语的列表。
# Create a list of (term, frequency) tuples sorted by their frequency
sum_words = bow.sum(axis=0)
words_freq = [(word, sum_words[0, idx]) for word, idx in vect.vocabulary_.items()]
words_freq = sorted(words_freq, key = lambda x: x[1])
# Keep only the terms in a list
vocabulary, _ = zip(*words_freq[:int(total_features * 0.2)])
vocabulary = list(vocabulary)
最后,我们使用词汇表将模型限制为较不频繁的术语。
bottom_vect = CountVectorizer(vocabulary=vocabulary)
bottom_bow = bottom_vect.fit_transform(corpus)