2015-05-27 3 views
0

Я занимаюсь классикой текста. У меня около 32K (спам & ветчины).Scikit: Удалите строку функций, если она есть во всех документах

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] представляет собой счетчик слова j в документе i

Теперь я хочу, чтобы удалить все функции, где countermatrix[i][j] > 1 (означает слово слишком часто) присутствует в более чем 80% документов ,

Как это сделать?

Благодаря

ответ

1

Попробуйте это:

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

Это первое вычисляет логическую матрицу, которая является истинной, если countmatrix > 1 и вычисляет столбцы среднего его. Если среднее значение меньше 0,8 (80%), соответствующий индекс столбца возвращается nonzero().

Таким образом, goodwords будет содержать все индексы слов, которые не слишком часты. Теперь вы можете просто уменьшить матрицу

countmatrix = countmatrix[:, goodwords] 
+0

Превосходно .. дайте мне попробовать .. Я приму ваш ответ. спасибо – voila

+0

Не могли бы вы рассказать мне, что такое countmatrix> 1? – voila

+0

@voila: Создает булеву матрицу той же формы, что и 'countermatrix', которая является' True', где соответствующая запись 'countermatrix' больше 1. – cfh

0

Я думаю, что вы можете ПОИСКОВАЯ матрицу по столбцам:

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) 
2

Вы можете сделать это, установив max_df на что-то меньше, чем на 1 см docs.

+0

Я думаю, что не хочу этого. Я хочу игнорировать термин, который возникает в 80% всех документов. Я правильно понял вас? – voila

+0

Так max_df = .8 делает именно это. Почему вы думаете, что не хотите этого? –

Смежные вопросы