以下是我的代码:

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 :



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

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

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

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



    您可以扩展 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)
    

    关于machine-learning - sklearn TfidfVectorizer : Generate Custom NGrams by not removing stopword in them,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49746555/

    10-12 20:02