带有预处理器和小写字母的 sklearn CountVectorizer 中的错误?

Bug in sklearn CountVectorizer with preprocessor and lowercase?

我不知道我是否在 sklearn CountVectorizer 中遇到了一个可能的错误,或者我是否只是误会了什么。

我正在处理一个包含各种括号字符串的小型文本语料库,只有其中一些需要删除。经过一些实验,我决定简单地使用这些括号的列表,我在下面包括的一个子集:

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

然后我将其作为 preprocessor 参数传递给 CountVectorizer

vec2 = CountVectorizer(preprocessor = clean_parens )
X2 = vec2.fit_transform(texts)

在第一个 运行 中,我注意到我的功能集已从 53k 增加到 58k,约 1700 条文本。当我检查功能名称时,我发现我有大写和小写的术语:

print(vec2.get_feature_names())
---
... 'Waves' ... 'waves'

当我在 CountVectorizer 中包含 lowercase=True 时,结果没有任何变化。这是因为 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 的误解,那就太好了。感觉是柜锯,手持圆锯用惯了,在我这种人手里威力介于威力和魔力之间。

干得漂亮!

我不会将此视为实际错误,但它缺少文档。当 preprocessorcallablelowercase=True 时,可能必须引发 error/warning 消息。

仅供参考,小写出现在默认预处理器函数中 here。因此,当您使用可调用对象覆盖预处理器时,小写字母不会发生。

我已经提出这个问题here