2

У меня есть задача NLP (разделение текста). Я извлек некоторые биграмм, как это:Как использовать ярлыки для классификации текста с помощью scikit-learn?

training_data = [[('this', 'is'), ('is', 'a'), ('a', 'text')], 
     [('and', 'one'), ('one', 'more')]] 

Тогда я мог бы использовать некоторые векторизатор как это:

from sklearn.feature_extraction import FeatureHasher 

fh = FeatureHasher(input_type='string') 

X = fh.transform(((' '.join(x) for x in sample) 
        for sample in training_data)) 
print X.toarray() 

[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

Это, как алгоритм SVM может быть использован для классификации:

from sklearn import svm 
s = svm.SVC() 
lables = [HAM, SPAM]  
s.fit(training_data, labels) 

Как может i использовать метки в вышеуказанной бригаме (т.е. training_data) для классификации ?, например:

data = [[('this', 'is'), ('is', 'a'), ('a', 'text'), 'SPAM'], 
[('and', 'one'), ('one', 'more'), 'HAM']] 

ответ

3

В приведенном выше коде, если предположить, что мы имеем вектор функции с именем doc, если вы пишете:

result = s.predict (doc) 

result должен быть «0» или «1». Таким образом, результат прогнозирования является числовым. Таким образом, лучше назначить метки соответствующим образом. Однако, если вы все еще хотите назначить строчную метку, вы можете предположить, что, например, метка 'a' эквивалентна '1' и 'b' - '0'. Я знаю, что в отличие от scikit в nltk ярлыки являются строками по умолчанию, но есть ли разница?

Редактировать 1: Я вижу из вашего первого редактирования, что у вас может быть неправильное представление об векторах объектов и их меток. Прежде всего, тип метки, который вы назначаете, не влияет на результат, а это означает, что если вы назначаете метку класса как спам, а один - как не-спам, классификатор не обнаруживает автоматическое обнаружение спама и неспамов; классификация зависит от вашего вектор-функции, а затем для сравнения в ярлыке класса. Поэтому, если вы скажете, я бы предположил, что в моем коде 0 представляет собой СПАМ, а 1 представляет собой HAM, и вы соответствующим образом помечаете свои данные, это работает и его достаточно. Второй вопрос заключается в том, что я не уверен, если вы знаете, как функция вектор биграмм должен выглядеть из-за того, как вы представляли свои данные, написав сильфон кода:

data = [[('this', 'is'), ('is', 'a'), ('a', 'text'), 'SPAM'], 
[('and', 'one'), ('one', 'more'), 'HAM']] 

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

Features: 'this is' 'is a' 'a text' 'and one' 'one more'  Label 
doc 1:   1   1   1   0   0   SPAM (or as I explained 0) 
doc 2:   0   0   0   1   1   HAM (or as I explained 1) 

Теперь мы можем записать векторы признаков вышеуказанных documens в следующем виде:

data = [([1,1,1,0,0),(0)],[(0,0,0,1,1),(1)]] 

Обратите внимание, что метка для первого документа - 0 (или СПАМ), а для второго документа - 1 (или HAM). Я попытался сделать очень ясный пример. При использовании scikit вы можете использовать массивы numpy вместо списка. Но мой пример ясен. Чтение этого вопроса here о битрамах вместе с моим ответом может помочь вам. Дайте мне знать, если у вас возникли дополнительные вопросы, но попробуйте подумать об этом примере.

Edit 2: Только в случае, если вы хотите знать, как писать метки в переменной labels в коде: для каждого документа (который преобразуется в векторное представление признака), вы должны иметь соответствующую этикетку.В вашем массиве кода X содержит векторы признаков, поэтому в labels вы должны иметь метки с одинаковой позицией в массиве, такие как X, соответствующие каждому вектор-функции. Таким образом, при условии, что у вас есть 100 документов (50 СПАМА или 0 и 50 HAM или 1) ваши метки должны выглядеть следующим образом:

labels = [0,0,0,0,0,0,0,0,...,1,1,1,1,1,1,1,...] 

, но это зависит от того, как вы заказали свои данные. Некоторые классификаторы бы ярлыки, как и выше, и некоторые будут принимать и 0s 1s interlayed, такие как:

labels = [0,1,0,1,0,1, ...] 

В svm.SVC() вы можете использовать позже, однако, убедитесь, что ваши характеристические векторы также interlayed и соответствуют соответствующим ярлыкам.

+0

Я отредактировал вопрос, как насчет использования строковых меток вместо числовых или булевых меток? – tumbleweed

+1

@ml_guy проверить мое первое редактирование! – user823743

+1

@ml_guy Я сделал второе изменение о том, как должны выглядеть этикетки. Решено ли это сейчас? – user823743

Смежные вопросы