【问题标题】:Bug in sklearn CountVectorizer with preprocessor and lowercase?带有预处理器和小写字母的 sklearn CountVectorizer 中的错误?
【发布时间】:2020-09-12 08:43:55
【问题描述】:

我不知道我是否在 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'

当我将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 的误解,那就太好了。我觉得它是一把橱柜锯,而且我习惯使用手持圆锯:它的力量在像我这样的人手中介于力量和魔法之间。

【问题讨论】:

    标签: python scikit-learn countvectorizer


    【解决方案1】:

    很棒的收获!

    我不会将此视为实际错误,但它缺少文档。当preprocessorcallablelowercase=True 时,可能会出现错误/警告消息。

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

    我已经提出了这个问题here

    【讨论】:

    • 感谢您的回答(以及指向问题的指针)。我现在感觉不那么疯狂了,甚至不再像个菜鸟了。
    猜你喜欢
    • 2020-09-08
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-10-12
    • 2019-11-08
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多