Scikit:如果所有文档中都存在,则删除特征行

Scikit: Remove feature row if present in all documents

我在做文本分类。我有大约 32K(垃圾邮件和火腿)文件。

import numpy as np
import pandas as pd
import sklearn.datasets as dataset
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import BernoulliNB
from sklearn.preprocessing import LabelEncoder
import re
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.linear_model import SGDClassifier
from BeautifulSoup import BeautifulSoup
from sklearn.feature_extraction import text 
from sklearn import cross_validation
from sklearn import svm
from sklearn.grid_search import GridSearchCV
from sklearn.feature_selection import VarianceThreshold

# Now load files from spam and ham
data = dataset.load_files("/home/voila/Downloads/enron1/")
xData = data.data
yData = data.target
print data.target_names


countVector  = CountVectorizer(decode_error='ignore' , stop_words = 'english')
countmatrix = countVector.fit_transform(xData)

countermatrix 将是矩阵,其中 countermatrix[i][j] 表示文档 i

中单词 j 的计数

现在我想删除在 80% 以上的文档中出现 countermatrix[i][j] > 1(表示单词太常见)的所有特征。

我该怎么做?

谢谢

试试这个:

goodwords = ((countmatrix > 1).mean(axis=0) <= 0.8).nonzero()[0]

它首先计算一个布尔矩阵,如果 countmatrix > 1 为真,然后计算它的列均值。如果均值小于0.8(80%),则返回相应的列索引 nonzero().

因此,goodwords 将包含不太频繁的单词的所有索引。现在你可以简单地减少你的矩阵

countmatrix = countmatrix[:, goodwords]

我认为你可以按列检索矩阵:

def remove_feature(): 
    remove_index = []
    for index in range(0, len(countermatrix.T)):
        if countermatrix[:, index].max() > 1:
            remove_index.append(index)

    return numpy.delete(countermatrix, remove_index, 1)

您可以通过将 max_df 设置为小于 1 的值来实现,请参阅 docs