CountVectorizer token_pattern 不捕捉下划线

Posted

技术标签:

【中文标题】CountVectorizer token_pattern 不捕捉下划线【英文标题】:CountVectorizer token_pattern to not catch underscore 【发布时间】:2021-08-23 16:03:38 【问题描述】:

CountVectorizer 默认标记模式将下划线定义为字母

corpus = ['The rain in spain_stays' ]
vectorizer = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())

给予:

['in', 'rain', 'spain_stays', 'the']

这是有道理的,因为 AFAIK '/w' 等同于 [a-zA-z0-9_],我需要的是:

['in', 'rain', 'spain', 'stays', 'the']

所以我尝试用 [a-zA-Z0-9] 替换“/w”

vectorizer = CountVectorizer(token_pattern=r'(?u)\b[a-zA-Z0-9][a-zA-Z0-9]+\b')
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())

但我明白了

['in', 'rain', 'the']

我怎样才能得到我需要的东西? 欢迎任何想法

【问题讨论】:

\w 也匹配 _ 所以这两个字符之间没有单词边界n_ 那么我可以使用什么来代替 '/w' 来获得所需的结果? 没有单词边界,您可以使用例如[^\W_]+ regex101.com/r/zN3Oax/1 或者使用lookarounds形式的边界(?:(?<=[\s_])|(?<=^))[^\W_]+(?=[\s_]|$)regex101.com/r/QaREpI/1 谢谢,工作。两者有区别吗? 【参考方案1】:

n_ 之间没有单词边界,因为\w 也匹配下划线。

匹配 2 个或多个不带下划线的单词字符,并且只允许左右两边有空格或下划线:

(?<![^\s_])[^\W_]2,(?![^\s_])

模式匹配:

(?&lt;![^\s_]) 否定后视,断言左边的空白边界或下划线 [^\W_]2, 匹配单词字符 2 次或多次,不包括下划线 (?![^\s_]) 负前瞻,在右侧断言空白边界或下划线

查看regex demo。


一个非常广泛的匹配可能是[^\W_]2,,但请注意,这没有考虑边界。它只匹配不带下划线的单词字符。

在此regex demo 中查看不同数量的匹配项。

【讨论】:

以上是关于CountVectorizer token_pattern 不捕捉下划线的主要内容,如果未能解决你的问题,请参考以下文章

Spark CountVectorizer

sklearn CountVectorizer

Spark 机器学习 ---CountVectorizer

sklearn中CountVectorizer与TfidfVectorizer区别

CountVectorizer 删除只出现一次的特征

来自 CountVectorizer 的术语相对频率矩阵