Объединение пользовательских функций с помощью CountVectorizer

У меня есть куча файлов со статьями. Для каждой статьи должны быть некоторые функции, такие как: длина текста, text_spam (все это int или float, и в большинстве случаев они должны быть загружены из csv). И я хочу, чтобы объединить эти функции с CountVectorizer, а затем классифицировать эти тексты.

Я смотрел несколько уроков, но все же я понятия не имею, как реализовать этот материал. Нашел что-то здесь, но на самом деле не может реализовать это для моих нужд.

Любые идеи, как это можно сделать с помощью 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 для функции fit)?

Ответы

Ответ 1

Вы недопонимаете 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_length или np.log(text_length).

А второй - как загружать категории (y параметр для функции fit)?

Зависит от того, как организованы ваши данные. scikit-learn имеет много вспомогательных функций и классов, но он ожидает, что вы напишете код, если ваша установка нестандартная.