sklearn TfidfVectorizer:生成自定义的NGrams而不删除其中的停用词。

4
以下是我的代码:
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)

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

我希望它可以允许那些在中间有停用词的三元组(而不是在开头和结尾)。

需要编写处理器来实现这个功能吗?需要建议。

1个回答

7
是的,您需要提供自己的分析器函数,该函数将根据您的需求将文档转换为特征。
根据文档所述:

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生成:在去掉停用词后,剩余的标记将按所需的n_grams排列。
  6. 删除过于稀有或过于普遍的特征:删除频率大于max_df或小于min_df的单词。
如果要将自定义可调用函数传递给TfidfVectorizer中的analyzer参数,则需要处理所有这些内容。 或者 您可以扩展TfidfVectorizer类,并仅覆盖最后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)

我尝试在那一行中获取没有停用词的标记,但它返回时带有停用词。我认为有其他函数在它之前被调用了。我正在调用fit_transform。 - Shan Khan
@ShanKhan 请提供一个你认为出现这种情况的句子示例。我已经使用样本数据进行了检查,它按预期工作。请注意,上述代码将删除起始或结束词为停用词的三元组。 - Vivek Kumar
谢谢,它起作用了 - 实际上我在初始清理时删除了停用词,当我删除那一块时 - 它完美地工作了! - Shan Khan
我找不到关于定义自己的分析器的示例或参考资料。你能否添加一个示例? - miguelmorin
1
@miguelmorin 您可以在此处找到默认分析器的源代码。请尝试复制并修改该代码以满足您的需求,并告知我是否有任何问题。您还需要查看def _analyze() - Vivek Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接