【问题标题】:Why isn't the token_pattern parameter in Tfidfvectorizer working with scikit learn?为什么 Tfidfvectorizer 中的 token_pattern 参数不能与 scikit learn 一起使用?
【发布时间】:2015-04-04 09:18:25
【问题描述】:

我有这段文字:

data = ['Hi, this is XYZ and XYZABC is $$running']

我正在使用以下 tfidfvectorizer:

vectorizer = TfidfVectorizer(
            stop_words='english',
            use_idf=False, 
            norm=None,
            min_df=1,
            tokenizer = tokenize,
            ngram_range=(1, 1),
            token_pattern=u'\w{4,}')

我将数据拟合如下:

tdm =vectorizer.fit_transform(data)

现在,当我打印时

vectorizer.get_feature_names()

我明白了:

[u'hi', u'run', u'thi', u'xyz', u'xyzabc']

我的问题是为什么我会得到“hi”和“xyz”,即使我提到我希望它只捕获至少有 4 个字符的单词? - token_pattern=u'\w{4,}'

【问题讨论】:

  • 我不确定是不是这样,但我怀疑由于您将自己的标记器传递给 tokenizer 参数,因此您传递给 ngram 和标记模式参数的任何内容都会被忽略。将None 传递给tokenizer 或在您自己的标记化函数中处理。

标签: python machine-learning nlp scikit-learn tf-idf


【解决方案1】:

如果您使用自己的分词器(来自code 此处),则分词模式将不起作用。

def build_tokenizer(self):
    """Return a function that splits a string into a sequence of tokens"""
    if self.tokenizer is not None:
        return self.tokenizer
    token_pattern = re.compile(self.token_pattern)
    return token_pattern.findall

【讨论】:

    【解决方案2】:

    我能够重新创建传递标记器函数覆盖token_pattern 模式的行为。

    这是一个排除少于 4 个字符的标记的标记器:

    from nltk import word_tokenize
    def tokenizer(x):
        return ( w for w in word_tokenize(x) if len(w) >3)
    

    好消息是传递您自己的标记器不会覆盖 ngram 参数。

    【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2018-01-23
    • 1970-01-01
    • 2017-05-26
    • 2015-08-17
    • 2014-10-16
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多