Пустой словарь для одной буквы от CountVectorizer

55
5

Пытаясь преобразовать строку в числовой вектор,

### Clean the string
def names_to_words(names):
print('a')
words = re.sub("[^a-zA-Z]"," ",names).lower().split()
print('b')

return words

### Vectorization
def Vectorizer():
Vectorizer= CountVectorizer(
analyzer = "word",
tokenizer = None,
preprocessor = None,
stop_words = None,
max_features = 5000)
return Vectorizer

### Test a string
s = 'abc...'
r = names_to_words(s)
feature = Vectorizer().fit_transform(r).toarray()

Но когда я присоединился:

 ['g', 'o', 'm', 'd']

Там ошибка:

ValueError: empty vocabulary; perhaps the documents only contain stop words

Кажется, проблема с такой однобуквенной строкой. что мне делать? спасибо

спросил(а) 2017-04-25T07:02:00+03:00 3 года, 3 месяца назад
1
Решение
57

По умолчанию forken_pattern regexp в CountVectorizer выбирает слова, которые имеют как минимум 2 символа, как указано в документации:

token_pattern: строка

Регулярное выражение, обозначающее то, что составляет "токен", используется только в случае анализатора == 'word'. По умолчанию regexp выбирает маркеры из 2 или более буквенно-цифровых символов (пунктуация полностью игнорируется и всегда рассматривается как разделитель токенов).

Из исходного кода CountVectorizer r"(?u)\b\w\w+\b

Измените его на r"(?u)\b\w+\b чтобы включить 1 буквенные слова.

Измените свой код на следующий (token_pattern параметр token_pattern с приведенным выше предложением):

Vectorizer= CountVectorizer(
analyzer = "word",
tokenizer = None,
preprocessor = None,
stop_words = None,
max_features = 5000,
token_pattern = r"(?u)\b\w+\b")

ответил(а) 2017-04-25T11:23:00+03:00 3 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема