Ошибка в sklearn CountVectorizer с препроцессором и строчными буквами? - PullRequest
3 голосов
/ 25 мая 2020

Я не знаю, столкнулся ли я с возможной ошибкой в ​​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 в руках кого-то вроде меня.

1 Ответ

3 голосов
/ 26 мая 2020

Отличный улов!

Я бы не стал рассматривать это как настоящую ошибку, но это недостаток документации. Возможно, должно появиться сообщение об ошибке / предупреждении, когда preprocessor равно callable и lowercase=True.

FYI, нижний регистр встречается в функции препроцессора по умолчанию здесь . Следовательно, если вы переопределите препроцессор вызываемым объектом, нижний регистр не произойдет.

Я поднял эту проблему здесь .

...