2014-03-27 43 views
12

我有一堆文件與文章。對於每篇文章應該有一些功能,如:文本長度,text_spam(都是整數或浮點數,並且在大多數情況下它們應該從csv加載)。我想要做的是 - 將這些功能與CountVectorizer結合起來,然後對這些文本進行分類。使用CountVectorizer連接自定義功能

我看過一些教程,但我仍然不知道如何實現這個東西。發現了一些東西here,但實際上無法實現這個我的需要。

任何想法如何可以用scikit完成?

謝謝。

我碰上了現在的問題是:

from sklearn.feature_extraction import DictVectorizer 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.pipeline import FeatureUnion 

measurements = [ 
    {'text_length': 1000, 'text_spam': 4.3}, 
    {'text_length': 2000, 'text_spam': 4.1}, 
] 

corpus = [ 
    'some text', 
    'some text 2 hooray', 
] 

vectorizer = DictVectorizer() 
count_vectorizer = CountVectorizer(min_df=1) 

first_x = vectorizer.fit_transform(measurements) 
second_x = count_vectorizer.fit_transform(corpus) 

combined_features = FeatureUnion([('first', first_x), ('second', second_x)]) 

對於這串代碼,我不知道如何加載「真實」數據,因爲訓練集已加載。第二個 - 如何加載類別(適合函數的y參數)?

回答

12

您誤會了FeatureUnion。它應該採取兩個變壓器,而不是兩批樣品。

你可以強制它處理你有的向量化器,但是把每個樣本的所有特徵放入一個大袋子並用一個單獨的DictVectorizer來製作這些袋子中的載體要容易得多。

# make a CountVectorizer-style tokenizer 
tokenize = CountVectorizer().build_tokenizer() 

def features(document): 
    terms = tokenize(document) 
    d = {'text_length': len(terms), 'text_spam': whatever_this_means} 
    for t in terms: 
     d[t] = d.get(t, 0) + 1 
    return d 

vect = DictVectorizer() 
X_train = vect.fit_transform(features(d) for d in documents) 

不要忘了sklearn.preprocessing.Normalizer正常化這一點,並意識到,即使正常化後,這些text_length特徵必然會主宰在規模上的其他功能。用1./text_lengthnp.log(text_length)代替它可能更明智。

第二個 - 如何加載類別(適合函數的參數爲​​y)?

取決於您的數據是如何組織的。 scikit-learn有很多幫助函數和類,但是如果你的設置不標準,它確實希望你編寫代碼。