CountVectorizer fit-transform() 不适用于自定义 token_pattern

Posted

技术标签:

【中文标题】CountVectorizer fit-transform() 不适用于自定义 token_pattern【英文标题】:CountVectorizer fit-transform() not working for custom token_pattern 【发布时间】:2017-09-11 08:59:42 【问题描述】:

我需要对包含诸如“R”、“C”等编程语言名称的文本使用 CountVectorizer。但是 CountVectorizer 会丢弃只包含一个字符的“单词”。

    cv1 = CountVectorizer(min_df=2, stop_words='english')
    tokenize = cv1.build_tokenizer()
    tokenize("Python, Time Series, Cloud, Data Modeling, R")

输出:

输出[172]: ['Python', '时间', '系列', '云', '数据', '建模']

然后我调整“token_pattern”,使其也将“R”视为一个标记。

    cv1 = CountVectorizer(min_df=1, stop_words='english', token_pattern=r'(?u)\b\w\w+\b|R|C' ,tokenizer=None)
    tokenize = cv1.build_tokenizer()
    tokenize("Python, Time Series, Cloud, R ,Data Modeling") 

输出: 出[187]: ['Python', 'Time', 'Series', 'Cloud', 'R', 'Data', 'Modeling']

但是,

    cvmatrix1 = cv1.fit_transform(["Python, Time Series, Cloud, R ,Data Modeling"])
    cv1.vocabulary_ 

给出输出:

输出[189]: 'cloud': 0, 'data': 1, 'modeling': 2, 'python': 3, 'series': 4, 'time': 5

为什么会这样?`

【问题讨论】:

【参考方案1】:

R 被删除的原因是正则表达式捕获了大写字母 R,其中分词器的实际输入将是小写的。其背后的原因是pre-processor 在对原始字符串进行标记之前调用了.lower() 函数:

tokenize = cv1.build_tokenizer()
preprocess = cv1.build_preprocessor()
tokenize(preprocess("Python, Time Series, Cloud, R ,Data Modeling"))

产量:

['python', 'time', 'series', 'cloud', 'data', 'modeling']

【讨论】:

以上是关于CountVectorizer fit-transform() 不适用于自定义 token_pattern的主要内容,如果未能解决你的问题,请参考以下文章

Spark CountVectorizer

sklearn CountVectorizer

Spark 机器学习 ---CountVectorizer

sklearn中CountVectorizer与TfidfVectorizer区别

CountVectorizer 删除只出现一次的特征

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