2014-12-30 3 views
2

Я играл с различными классификаторами и vectorizers, что scikit учиться обеспечивают так скажем, у меня есть следующие:Проблемы классификации помеченного текста, неправильного предсказания?

training = [["this was a good movie, 'POS'"], 
     ["this was a bad movie, 'NEG'"], 
     ["i went to the movies, 'NEU'"], 
     ["this movie was very exiting it was great, 'POS'"], 
     ["this is a boring film, 'NEG'"] 
     ,........................, 
      [" N-sentence, 'LABEL'"]] 

#Where each element of the list is another list that have documents, then. 

splitted = [#remove the tags from training] 

from sklearn.feature_extraction.text import HashingVectorizer 
X = HashingVectorizer(
    tokenizer=lambda doc: doc, lowercase=False).fit_transform(splitted) 

print X.toarray() 

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

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

Проблема с этим является то, что я не знаю, если я оцифрованный правый корпус, а затем:

#This is the test corpus: 
test = ["I don't like this movie it sucks it doesn't liked me"] 

#I vectorize the corpus with hashing vectorizer 
Y = HashingVectorizer(
    tokenizer=lambda doc: doc, lowercase=False).fit_transform(test) 

Тогда я распечатайте Y:

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

Тогда

y = [x[-1]for x in training] 

#import SVM and classify 
from sklearn.svm import SVC 
svm = SVC() 
svm.fit(X, y) 
result = svm.predict(X) 
print "\nThe opinion is:\n",result 

И вот проблема, я получил следующее Insted из [NEG], который на самом деле правильный прогноз:

["this was a good movie, 'POS'"] 

Я предполагаю, что я не векторизации право training или y Цель неверна, может кто-нибудь помочь мне понять, что происходит, и как я должен векторизовать training, чтобы иметь правильное предсказание?

ответ

2

Я оставлю вас, чтобы получить обучающие данные в ожидаемом формате:

training = ["this was a good movie", 
      "this was a bad movie", 
      "i went to the movies", 
      "this movie was very exiting it was great", 
      "this is a boring film"] 

labels = ['POS', 'NEG', 'NEU', 'POS', 'NEG'] 

экстракционной Характеристика

>>> from sklearn.feature_extraction.text import HashingVectorizer 
>>> vect = HashingVectorizer(n_features=5, stop_words='english', non_negative=True) 
>>> X_train = vect.fit_transform(training) 
>>> X_train.toarray() 
[[ 0.   0.70710678 0.   0.   0.70710678] 
[ 0.70710678 0.70710678 0.   0.   0.  ] 
[ 0.   0.   0.   0.   0.  ] 
[ 0.   0.89442719 0.   0.4472136 0.  ] 
[ 1.   0.   0.   0.   0.  ]] 

С большим корпус следует увеличить n_features, чтобы избежать столкновения, я использовали 5 так, чтобы полученную матрицу можно было визуализировать. Также обратите внимание, что я использовал stop_words='english', я думаю, что с таким количеством примеров важно избавиться от стоп-слов, иначе вы могли бы запутать классификатор.

обучение Модель

from sklearn.svm import SVC 

model = SVC() 
model.fit(X_train, labels) 

Прогноз

>>> test = ["I don't like this movie it sucks it doesn't liked me"] 
>>> X_pred = vect.transform(test) 
>>> model.predict(X_pred) 
['NEG'] 

>>> test = ["I think it was a good movie"] 
>>> X_pred = vect.transform(test) 
>>> model.predict(X_pred) 
['POS'] 

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

+0

Спасибо, что помогли мне понять. Проблема, которую я хотел бы прояснить, - это «labelin». Как насчет того, если я скажу так же, как пример: 1000000 предложений 'training', как я могу пометить предложения обучения и представить его классификатору, если я просто назову вручную этими 1000000 предложениями и поместим их в конце каждого из них предложение?. – tumbleweed

+0

Если вы имеете в виду в текстовом файле, то вы можете выбрать разделитель как '|', а потом их будет легко читать отдельно с помощью pandas или cvs-модуля. – elyase

+0

Я имею в виду что-то вроде этого: 'training = [[" первое предложение, 'LABEL' "], [" второе предложение, LABEL ']] ... ["N opinion,' LABEL ']]]. Потому что я хотел бы получить все документы в списке, один документ в списке и затем векторизовать их. – tumbleweed

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