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

Posted

技术标签:

【中文标题】sklearn TfidfVectorizer:通过不删除停用词来生成自定义 NGram【英文标题】:sklearn TfidfVectorizer : Generate Custom NGrams by not removing stopword in them 【发布时间】:2018-09-19 15:43:58 【问题描述】:

以下是我的代码:

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】:

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

根据the documentation:

分析器:字符串、'word'、'char'、'char_wb' 或可调用

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

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

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

    解码:根据给定编码的句子(默认'utf-8') 预处理:将句子转换为小写 标记化:从句子中获取单个单词标记(默认正则表达式选择 2 个或更多字母数字字符的标记) 停用词删除:从上述步骤中删除停用词中存在的单个单词标记 创建N_gram:去除停用词后,将剩余的标记排列在所需的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)

【讨论】:

我试图在该行中获取没有停用词的标记,但它返回时没有停用词。我认为还有其他一些函数在它之前调用。我正在调用 fit_transform @ShanKhan 请提供您认为发生这种情况的句子示例。我已经用示例数据对其进行了检查,并按预期工作。请注意,上面的代码将删除开始或结束词是停用词的三元组。 谢谢,它起作用了——实际上我在初始清理时删除了停用词,当我删除那个块时——它起作用了!

以上是关于sklearn TfidfVectorizer:通过不删除停用词来生成自定义 NGram的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中CountVectorizer与TfidfVectorizer区别

sklearn: TfidfVectorizer 中文处理及一些使用参数

Python SKlearn TfidfVectorizer 参数错误

在sklearn TfidfVectorizer中执行停用词删除过程时?

如何在无监督聚类期间在 sklearn 的 TfidfVectorizer 中选择参数

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