CountVectorizer() не работает с однобуквенным словом

Учтите, что мне нужно применить CountVectorizer() к следующим данным:

words = [
     'A am is',
     'This the a',
     'the am is',
     'this a am',
]

Я сделал следующее:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())

Он возвращает следующее:

[[1 1 0 0]
 [0 0 1 1]
 [1 1 1 0]
 [1 0 0 1]]

Для справки print(vectorizer.get_feature_names()) печатает ['am', 'is', 'the', 'this']

Почему 'a' не читается??
Дело в том, что однобуквенные слова не считаются словами в CountVectorizer()?


person user41855    schedule 10.08.2020    source источник


Ответы (1)


См. документ.

token_pattern

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

Все односимвольные токены игнорируются токенизатором по умолчанию. Вот почему a отсутствует.

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

Образец кода

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(tokenizer=lambda txt: txt.split())
X = vectorizer.fit_transform(words)
print (vectorizer.get_feature_names())

Выход:

['a', 'am', 'is', 'the', 'this']
person mujjiga    schedule 10.08.2020
comment
как работает tokenizer=lambda txt: txt.split()? что здесь происходит? - person user41855; 10.08.2020
comment
lambda txt: txt.split() — это функция, которая берет текст и разбивает его по пробелам, каждый из которых теперь является токеном, используемым CountVectorizer. - person mujjiga; 10.08.2020