Python Can';t在NLTK手册《文件分类》(第6章,第1.3节)中复制结果

Python Can';t在NLTK手册《文件分类》(第6章,第1.3节)中复制结果,python,nltk,document-classification,Python,Nltk,Document Classification,从这里开始:(第1.3节) 作者引用了0.81的准确度 当然,由于random.shuffle的存在,会涉及到一些随机性,但是无论我运行多少次,我都无法超过 (另一个奇怪之处是,作者声称下面的单词功能包含了2000个最常见的单词,但事实并非如此(与列表(all_words.most_common(2000))相比) 与所有单词中的实际单词相比,列表(所有单词)[:2000]绝对不是前2000个最常见的单词。[逐字逐句,最常见(2000)] 不,准确度更差,因为2000个最常见的词(“the”,

从这里开始:(第1.3节)

作者引用了0.81的准确度

当然,由于random.shuffle的存在,会涉及到一些随机性,但是无论我运行多少次,我都无法超过

(另一个奇怪之处是,作者声称下面的单词功能包含了2000个最常见的单词,但事实并非如此(与列表(all_words.most_common(2000))相比)

  • 与所有单词中的实际单词相比,
    列表(所有单词)[:2000]
    绝对不是前2000个最常见的单词。
    [逐字逐句,最常见(2000)]

  • 不,准确度更差,因为2000个最常见的词(“the”,“a”,“he…”)中的大多数都很少包含关于类别的信息

  • 当然,这些stopwords不是很有用(它们的信息量较小),但考虑到这样一个事实,即其中有几个(~30个)和其余(~1900个)仍然是很好的相关功能

    在这种情况下,我建议做什么:

  • 不要使用
    random.shuffle(文档)
    来保证它们的顺序
  • 使用实际的2000个最常见的单词作为您的特征(如上面提供的示例所示)
  • 发布您的结果,包括Python版本和NLTK版本。您可以使用
  • python——版本


    python-c“import-nltk;print(nltk.\uuuu version\uuuuu)”

    如果使用2000个最频繁的单词,你会获得更好的准确度吗?@lenz,不会,更差的准确度,因为2000个最频繁的单词(“the”、“a”、“he”…)中的大多数都很少包含关于类别的信息。
    import nltk
    import random
    from nltk.corpus import movie_reviews
    
    documents = [(list(movie_reviews.words(fileid)), category)\
                     for category in movie_reviews.categories()\
                     for fileid in movie_reviews.fileids(category)]
    
    random.shuffle(documents)
    
    all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
    word_features = list(all_words)[:2000]
    
    def document_features(document, words_to_use = word_features):
        document_words = set(document)
        features = {}
        for word in words_to_use:
            features['contains({})'.format(word)] = (word in document_words)
        return features
    
    
    featuresets = [(document_features(d), c) for (d,c) in documents]
    
    train_set, test_set = featuresets[100:], featuresets[:100]
    
    classifier = nltk.NaiveBayesClassifier.train(train_set)
    
    print(nltk.classify.accuracy(classifier, test_set))