2016-07-06 4 views
1

Я пытаюсь создать простой классификатор вопросов, используя Scikit-learn. В настоящее время я могу классифицировать вопрос в соответствующие классы, используя мешок словарного подхода, используя функцию countvectorizer Scikit. Теперь я хочу создать и добавить пользовательские функции с существующими функциями, созданными с помощью countvectorizer.Как создать нашу функцию экстрактора функций и использовать ее с countvectorizer в конвейере в Scikit-learn

Предположим, я хочу создать функцию, которая проверяет, присутствует ли номер телефона в вопросе или нет, и другая функция, которая выберет длину вопроса.

Итак, каков способ создания и объединения всех функций вместе.

С этой link я попробовал этот шаблон для извлечения пользовательской особенности

`от sklearn.base импорта BaseEstimator, TransformerMixin

класса SampleExtractor (BaseEstimator, TransformerMixin):

def __init__(self, vars): 
    self.vars = vars # e.g. pass in a column name to extract 

def transform(self, X, y=None): 
    return do_something_to(X, self.vars) # where the actual feature extraction happens 

def fit(self, X, y=None): 
    return self # generally does nothing` 

но когда при я поставил свою продукцию в трубопровод с помощью countvectorizer, например

ppl = Pipeline([ 
('feats', FeatureUnion([ 
    ('ngram', CountVectorizer()), # can pass in either a pipeline 
    ('ave', SampleExtractor()) # or a transformer 
])), 
('clf', LinearSVC()) # classifier 

])

я получаю ошибку

ValueError: blocks[0,:] has incompatible row dimensions

Я думаю, что эта ошибка может быть связана с матрицей как функции имеют не одного измерения, но я не понимаю, как решить ее.

+0

Ваш метод преобразования SampleExtractor() уменьшает количество строк? Если это так, это не приемлемое преобразование, чтобы вставить в конвейер, поскольку только X преобразуется, а не y (а оба X и y должны иметь одинаковое количество строк). – David

+0

Dhiraj, Вы могли заставить это работать? – Senthil

ответ

0

Метод transform из CountVectorizer возвращает матрицу документов, строки которой соответствуют документам и столбцам. (I, j) -й элемент матрицы показывает, сколько раз j-й член встречается в i-м документе. Все, что вам нужно сделать, это добавить еще несколько столбцов в эту матрицу, которые соответствуют новым функциям.

Пример: список doc_len Предположим, содержит длину ваших документов в словах и документ-термин матрица M. Затем код:

M_arr = M.toarray() 
assert len(doc_len) == M_arr.shape[0] 
np.append(M_arr,np.array(doc_len),axis=1) 

добавит новый столбец в конце вашей матрицы, содержащей новую функцию. Вы можете повторить этот процесс для дополнительных новых функций. Расширенная матрица может быть передана любому классификатору, который вы используете обычным способом.

+0

Спасибо за ваш ответ, но все же я не могу объединить две функции. –