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

Sha*_*han 4 statistics machine-learning tf-idf scikit-learn

以下是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

我希望它允许那些中间有停用词的 TRIGRAM(不在开始和结束处)

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

Viv*_*mar 7

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

\n\n

根据文档

\n\n
\n

分析器 : string, {\xe2\x80\x98word\xe2\x80\x99, \xe2\x80\x98char\xe2\x80\x99, \xe2\x80\x98char_wb\xe2\x80\x99} 或可调用

\n\n
....\n....\nIf a callable is passed it is used to extract the sequence of \nfeatures out of the raw, unprocessed input.\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

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

\n\n

默认实现按以下顺序作用于单个句子:

\n\n
    \n
  1. 解码:按照给定编码解码句子(默认\'utf-8\')
  2. \n
  3. 预处理:将句子转换为小写
  4. \n
  5. 标记化:从句子中获取单个单词标记(默认正则表达式选择 2 个或更多字母数字字符的标记)
  6. \n
  7. 停用词删除:从上述步骤中删除停用词中存在的单个单词标记
  8. \n
  9. N_gram 创建:删除停用词后,将剩余的标记排列在所需的 n_gram 中
  10. \n
  11. 删除太罕见或太常见的特征:删除频率大于max_df或低于 的单词min_df
  12. \n
\n\n

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

\n\n

或者

\n\n

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

\n\n
from sklearn.feature_extraction.text import TfidfVectorizer\nclass NewTfidfVectorizer(TfidfVectorizer):\n    def _word_ngrams(self, tokens, stop_words=None):\n\n        # First get tokens without stop words\n        tokens = super(TfidfVectorizer, self)._word_ngrams(tokens, None)\n        if stop_words is not None:\n            new_tokens=[]\n            for token in tokens:\n                split_words = token.split(\' \')\n\n                # Only check the first and last word for stop words\n                if split_words[0] not in stop_words and split_words[-1] not in stop_words:\n                    new_tokens.append(token)\n            return new_tokens\n\n        return tokens\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,像这样使用它:

\n\n
vectorizer = NewTfidfVectorizer(stop_words=\'english\', ngram_range=(3,3))\nvectorizer.fit(data)\n
Run Code Online (Sandbox Code Playgroud)\n