Объединение пользовательских функций с помощью 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 имеет много вспомогательных функций и классов, но он ожидает, что вы напишете код, если ваша установка нестандартная.