Я не знаю, столкнулся ли я с возможной ошибкой в sklearn CountVectorizer
или я просто что-то не понимаю.
Я работаю с небольшим корпусом текстов, которые содержат множество строк в скобках, только некоторые из которых необходимо удалить. После некоторых экспериментов я решил просто go со списком этих скобок, подмножество, которое я включаю ниже:
parentheticals = [ "\(laughter\)", "\(applause\)", "\(music\)", "\(video\)" ]
, потому что я не нашел способа обойти требование CountVectorizer
, чтобы оно получить строку или список строк, я использовал эту небольшую функцию регулярного выражения:
def clean_parens(text):
new_text = text
for rgx_match in parentheticals:
new_text = re.sub(rgx_match, ' ', new_text, flags=re.IGNORECASE)
return new_text
Затем я передал это CountVectorizer
как аргумент preprocessor
:
vec2 = CountVectorizer(preprocessor = clean_parens )
X2 = vec2.fit_transform(texts)
При первом запуске я заметил, что мой набор функций вырос с 53 КБ до 58 КБ для ~ 1700 текстов. Когда я проверил названия функций, я увидел, что у меня были термины в верхнем и нижнем регистре:
print(vec2.get_feature_names())
---
... 'Waves' ... 'waves'
Когда я включил lowercase=True
в CountVectorizer
, мои результаты не изменились. Это потому, что preprocessor
имеет приоритет? (Это не то, как я понял документацию.)
Простое изменение небольшой функции регулярного выражения, приведенной выше, устанавливает все правильно:
def clean_parens(text):
new_text = text
for rgx_match in parentheticals:
new_text = re.sub(rgx_match, ' ', new_text.lower(), flags=re.IGNORECASE)
return new_text
Я доволен этим, но если бы кто-то мог объясните, что я неправильно понял по поводу CountVectorizer
, это было бы здорово. Я чувствую, что это кабина inet пила, и я привык пользоваться ручной циркулярной пилой: ее сила где-то между мощью и магией c в руках кого-то вроде меня.