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

时间:2018-04-10 06:13:28

标签: machine-learning scikit-learn statistics tf-idf

以下是我的代码:

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在中间(不在开始和结束时)有禁用词

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

1 个答案:

答案 0 :(得分:0)

是的,您需要提供自己的分析器功能,根据您的要求将文档转换为功能。

根据the documentation

  

analyzer:string,{'word','char','char_wb'}或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创建:在停止删除单词后,剩余的标记将被安排在所需的n_grams中
  6. 删除过于罕见或过于常见的功能:删除频率大于max_df或低于min_df的字词。
  7. 如果要将自定义callable传递给TfidfVectorizer中的analyzer param,则需要处理所有这些。

    您可以扩展TfidfVectorizer类并仅覆盖最后两个步骤。像这样:

    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)