Sklearn TfIdfVectorizer 删除包含所有停用词的文档

Sklearn TfIdfVectorizer remove docs containing all stopwords

我正在使用 sklearnTfIdfVectorizer 来矢量化我的语料库。在我的分析中,有一些文档由于包含所有停用词而将所有术语都过滤掉了。为了减少稀疏性问题,并且因为将它们包含在分析中毫无意义,我想将其删除。

查看 TfIdfVectorizer 文档,没有可以设置的参数来执行此操作。因此,我正在考虑在将语料库传递到矢量化器之前手动删除它。但是,这有一个潜在的问题,即我得到的停用词与向量化器使用的列表不同,因为我还使用 min_dfmax_df 选项来过滤掉术语。

有没有更好的方法来实现我正在寻找的东西(即 removing/ignoring 包含所有停用词的文档)?

如有任何帮助,我们将不胜感激。

您可以:

  1. 指定你的密码,然后在 TfidfVecorizer
  2. 之后
  3. 过滤掉空行

以下代码片段显示了一个简化的示例,应该可以让您朝着正确的方向前进:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["aa ab","aa ab ac"]
stop_words = ["aa","ab"]

tfidf = TfidfVectorizer(stop_words=stop_words)
corpus_tfidf = tfidf.fit_transform(corpus)
idx = np.array(corpus_tfidf.sum(axis=1)==0).ravel()
corpus_filtered = corpus_tfidf[~idx]

如果您还有问题,欢迎随时提问!

所以,你可以使用这个:

import nltk
from sklearn.feature_extraction.text import TfidfVectorizer

def tokenize(text):
    # first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
    tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
    filtered_tokens = []
    # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
    punctuations="?:!.,;'�۪"
    for token in tokens:
        if token in punctuations:
            tokens.remove(token)
        if re.search('[a-zA-Z0-9]', token):
            filtered_tokens.append(token)

    st = ' '.join(filtered_tokens)
    return st
tokenize(data)

tfidf_vectorizer = TfidfVectorizer(max_df=0.8,min_df=0.01,stop_words='english',
    use_idf=True,tokenizer=tokenize)

tfidf_matrix = tfidf_vectorizer.fit_transform(df['text'])
ids = np.array(tfidf_matrix.sum(axis=1)==0).ravel()
tfidf_filtered = tfidf_matrix[~ids]

这样您就可以删除 stopwordsempty rows 并使用 min_dfmax_df