Как я могу ограничить длину токена при использовании CountVectorizer? - PullRequest
0 голосов
/ 03 мая 2018

Я не хочу, чтобы члены длины были меньше 3 или больше, чем, скажем, 7. Существует простой способ сделать это в R, но в Python я не уверен. Я пробовал это, но все еще не работает

from sklearn.feature_extraction.text import CountVectorizer
regex1 = '/^[a-zA-Z]{3,7}$/'
vectorizer = CountVectorizer( analyzer='word',tokenizer= tokenize,stop_words = stopwords,token_pattern  = regex1,min_df= 2, max_df = 0.9,max_features = 2000)
vectorizer1 = vectorizer.fit_transform(token_dict.values())

Пробовал и другое регулярное выражение -

  "^[a-zA-Z]{3,7}$"
r'^[a-zA-Z]{3,7}$'

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

В документации CountVectorizer предусмотрено, что по умолчанию token_pattern принимает токены из 2 или более буквенно-цифровых символов. Если вы хотите изменить это, передайте свое собственное регулярное выражение

В вашем случае добавьте token_pattern = "^[a-zA-Z]{3,7}$" к опциям CountVectorizer

Редактировать

Регулярное выражение, которое следует использовать: [a-zA-Z]{3,7}. Смотрите пример ниже -

doc1 = ["Elon Musk is genius", "Are you mad", "Constitutional Ammendments in Indian Parliament",\
        "Constitutional Ammendments in Indian Assembly", "House of Cards", "Indian House"]

from sklearn.feature_extraction.text import CountVectorizer

regex1 = '[a-zA-Z]{3,7}'
vectorizer = CountVectorizer(analyzer='word', stop_words = 'english', token_pattern  = regex1)
vectorizer1 = vectorizer.fit_transform(doc1)

vectorizer.vocabulary_

Результаты -

{u'ammendm': 0,
 u'assembl': 1,
 u'cards': 2,
 u'constit': 3,
 u'elon': 4,
 u'ent': 5,
 u'ents': 6,
 u'genius': 7,
 u'house': 8,
 u'indian': 9,
 u'mad': 10,
 u'musk': 11,
 u'parliam': 12,
 u'utional': 13} 
0 голосов
/ 03 мая 2018

Я думаю, что ваша модель регулярных выражений здесь неверна. Это Javscript. Это должно быть похоже на

regex1 = r'^[a-zA-Z]{3,7}$'

Также я предполагаю, что регулярное выражение должно соответствовать всей строке НЕ некоторой подстроке. Поэтому, если строка похожа на aaaaabbb cc, ее следует отбросить.

Если это не так, вы должны использовать границу слова \b вместо начальных ^ и конечных $ якорей. Так и должно быть

regex1 = r'\b[a-zA-Z]{3,7}\b'

Вот рабочий пример

from sklearn.feature_extraction.text import CountVectorizer
regex1 = r'\b[a-zA-Z]{3,7}\b'
token_dict = {123: 'horses', 345: 'ab'}
vectorizer = CountVectorizer(token_pattern  = regex1)
vectorizer1 = vectorizer.fit_transform(token_dict.values())

print(vectorizer.get_feature_names())

выход

['horses']
...