使用CountVectorizer连接自定义功能

问题描述:

我有一堆文件与文章。对于每篇文章应该有一些功能,如:文本长度,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参数)?

您误会了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有很多帮助函数和类,但是如果你的设置不标准,它确实希望你编写代码。