NLTK文档聚类:修剪后没有任何条款?

时间:2015-11-10 23:54:07

标签: python dictionary nlp

我有900个不同的文本文件加载到我的控制台,总共约350万字。我正在运行看到here的文档聚类算法,并且遇到了TfidfVectorizer函数的问题。这就是我所看到的:

from sklearn.feature_extraction.text import TfidfVectorizer

#define vectorizer parameters
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                                 min_df=0.4, stop_words='english',
                                 use_idf=True, tokenizer=tokenize_and_stem, ngram_range=(1,3))

store_matrix = {}
for key,value in speech_dict.items():
    tfidf_matrix = tfidf_vectorizer.fit_transform(value) #fit the vectorizer to synopses
    store_matrix[key] = tfidf_matrix

此代码将一直运行,直到ValueError: After pruning, no terms remain. Try a lower min_df or a higher max_df.弹出。但是,除非我将max_df更改为0.99并将min_df降低为0.01,否则代码将不会退出错误。然后,它似乎永远运行,因为它基本上包括所有350万个术语。

我怎样才能解决这个问题?

我的文本文件存储在speech_dict中,其中的键是文件名,其值是文本。

1 个答案:

答案 0 :(得分:1)

从文档中, scikit-learn, TF-IDF vectorizer

max_df :浮动范围[0.0,1.0]或int,默认= 1.0

在构建词汇表时,忽略文档频率严格高于给定阈值的术语(语料库特定的停用词)。如果是float,则参数表示文档的比例,整数绝对计数。如果词汇表不是None,则忽略此参数。

min_df :浮在范围[0.0,1.0]或int,默认= 1

构建词汇表时,忽略文档频率严格低于给定阈值的术语。该值在文献中也称为截止值。如果是float,则参数表示文档的比例,整数绝对计数。如果词汇表不是None,则忽略此参数。

请检查变量totalvocab_stemmed_body的数据类型。如果是列表,则列表中的每个元素都被视为文档。

案例1:没有文件= 20,00,000,min_df=0.5

如果您有大量文件(比如2百万),并且每个文件只有几个单词,并且来自非常不同的域,则存在最小值10,00,000的条件的可能性非常小( 20,00,000 * 0.5)文件。

案例2:没有文件= 200,max_df=0.95

如果您有一组重复的文件(例如200),您将看到大多数文档中都存在这些术语。使用max_df=0.95,您告诉那些存在于190多个文件中的术语不会考虑它们。在这种情况下,所有术语都或多或少地重复,并且您的矢量化器将无法找到矩阵的任何术语。

这是我对这个主题的看法。