使用CountVectorizer连接自定义功能

时间:2014-03-27 12:16:25

标签: python machine-learning scikit-learn

我有一堆带文章的文件。对于每篇文章,应该有一些功能,例如:文本长度 text_spam (所有都是整数或浮点数,在大多数情况下,它们应该从csv加载)。我想要做的是 - 将这些功能与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参数)?

1 个答案:

答案 0 :(得分:13)

你误解了FeatureUnion。它应该采用两个变压器,而不是两批样品。

你可以强制它处理你拥有的矢量化器,但是将每个样本的所有特征都扔到一个大袋子里要容易得多,并使用一个DictVectorizer从这些袋子中制作矢量。“ p>

# 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)可能更明智。

  

第二个 - 如何为fit函数加载类别(y参数)?

取决于您的数据的组织方式。 scikit-learn有很多辅助函数和类,但如果你的设置是非标准的,它确实希望你编写代码。