sklearn TfidfVectorizer:通过不删除其中的停用词来生成自定义 NGram

sklearn TfidfVectorizer : Generate Custom NGrams by not removing stopword in them

以下是我的代码:

sklearn_tfidf = TfidfVectorizer(ngram_range= (3,3),stop_words=stopwordslist, norm='l2',min_df=0, use_idf=True, smooth_idf=False, sublinear_tf=True)
sklearn_representation = sklearn_tfidf.fit_transform(documents)

它通过删除所有停用词来生成三元组。

我想要它允许那些中间有停用词的 TRIGRAM(不是在开始和结束)

是否需要为此编写处理器。 需要建议。

是的,您需要提供自己的分析器函数,该函数会将文档转换为符合您要求的特征。

根据the documentation

analyzer : string, {‘word’, ‘char’, ‘char_wb’} or callable

....
....
If a callable is passed it is used to extract the sequence of 
features out of the raw, unprocessed input.

在自定义调用中,您需要首先将句子分成不同的部分,删除逗号、大括号、符号等特殊字符,将它们转换为小写,然后将它们转换为 n_grams

默认实现按以下顺序处理单个句子:

  1. 解码:句子根据给定的编码(默认'utf-8')
  2. 预处理:将句子转为小写
  3. 标记化:从句子中获取单个单词标记(默认正则表达式选择 2 个或更多字母数字字符的标记)
  4. 停用词删除:从上述步骤中删除出现在停用词中的单个词标记
  5. N_gram创建:去除停用词后,剩余的token再按要求排列n_grams
  6. 删除太罕见或太常见的特征:删除频率大于 max_df 或低于 min_df 的单词。

如果您想将自定义可调用对象传递给 TfidfVectorizer 中的 analyzer 参数,则需要处理所有这些。

您可以扩展 TfidfVectorizer class 并且只覆盖最后 2 个步骤。像这样:

from sklearn.feature_extraction.text import TfidfVectorizer
class NewTfidfVectorizer(TfidfVectorizer):
    def _word_ngrams(self, tokens, stop_words=None):

        # First get tokens without stop words
        tokens = super(TfidfVectorizer, self)._word_ngrams(tokens, None)
        if stop_words is not None:
            new_tokens=[]
            for token in tokens:
                split_words = token.split(' ')

                # Only check the first and last word for stop words
                if split_words[0] not in stop_words and split_words[-1] not in stop_words:
                    new_tokens.append(token)
            return new_tokens

        return tokens

然后,像这样使用它:

vectorizer = NewTfidfVectorizer(stop_words='english', ngram_range=(3,3))
vectorizer.fit(data)