2013-12-21 4 views
9

Я новичок в scikit-learn и в настоящее время изучаю Naive Bayes (Multinomial). Прямо сейчас, я работаю над векторизации текста из sklearn.feature_extraction.text, и по какой-то причине, когда я вектурирую текст, слово «I» не появляется в выведенном массиве.CountVectorizer: «Я» не отображается в векторизованном тексте

Код:

x_train = ['I am a Nigerian hacker', 'I like puppies'] 

# convert x_train to vectorized text 
vectorizer_train = CountVectorizer(min_df=0) 
vectorizer_train.fit(x_train) 
x_train_array = vectorizer_train.transform(x_train).toarray() 

# print vectorized text, feature names 
print x_train_array 
print vectorizer_train.get_feature_names() 

Выход:

1 1 0 1 0 
0 0 1 0 1 
[u'am', u'hacker', u'like', u'nigerian', u'puppies'] 

Почему не "я", кажется, появляются в названиях художественных? Когда я меняю его на «Ia» или что-то еще подобное, он появляется.

ответ

21

Это вызвано по умолчанию token_pattern для CountVectorizer, который удаляет знаки одного символа:

>>> vectorizer_train 
CountVectorizer(analyzer=u'word', binary=False, charset=None, 
     charset_error=None, decode_error=u'strict', 
     dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content', 
     lowercase=True, max_df=1.0, max_features=None, min_df=0, 
     ngram_range=(1, 1), preprocessor=None, stop_words=None, 
     strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b', 
     tokenizer=None, vocabulary=None) 
>>> pattern = re.compile(vectorizer_train.token_pattern, re.UNICODE) 
>>> print(pattern.match("I")) 
None 

Для того, чтобы сохранить «Я», использовать другой шаблон, например,

>>> vectorizer_train = CountVectorizer(min_df=0, token_pattern=r"\b\w+\b") 
>>> vectorizer_train.fit(x_train) 
CountVectorizer(analyzer=u'word', binary=False, charset=None, 
     charset_error=None, decode_error=u'strict', 
     dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content', 
     lowercase=True, max_df=1.0, max_features=None, min_df=0, 
     ngram_range=(1, 1), preprocessor=None, stop_words=None, 
     strip_accents=None, token_pattern='\\b\\w+\\b', tokenizer=None, 
     vocabulary=None) 
>>> vectorizer_train.get_feature_names() 
[u'a', u'am', u'hacker', u'i', u'like', u'nigerian', u'puppies'] 

Обратите внимание, что не содержательное слово «а» также сохраняется.

+6

Pattern '(? И) \\ Ь \\ ш + \\ Ь' лучше, потому что он не вставляет слова с помощью юникодовых букв. – usamec

1

Это потому, что обнаружение прописной буквы по умолчанию выключен lowercase=True в CountVectorizer

Используйте

vectorizer_train = CountVectorizer(min_df=0, lowercase=False) 
+0

, даже если нижний регистр = True, он должен был захватить счетчик для «i». принятый ответ имеет правильное решение. –

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

  • Нет связанных вопросов^_^