>>> from env_helper import info; info()
页面更新时间: 2022-12-22 21:26:50
运行环境:
    Linux发行版本: Debian GNU/Linux 11 (bullseye)
    操作系统内核: Linux-5.10.0-20-amd64-x86_64-with-glibc2.31
    Python版本: 3.9.2

2.5. NLTK 朴素贝叶斯分类器

现在是时候选择一个算法,将我们的数据分成训练和测试集,然后启动!我们首先要使用的算法是朴素贝叶斯分类器。这是一个非常受欢迎的文本分类算法,所以我们只能先试一试。然而,在我们可以训练和测试我们的算法之前,我们需要先把数据分解成训练集和测试集。

你可以训练和测试同一个数据集,但是这会给你带来一些严重的偏差问题,所以你不应该训练和测试完全相同的数据。为此,由于我们已经打乱了数据集,因此我们将首先将包含正面和负面评论的 1900 个乱序评论作为训练集。然后,我们可以在最后的 100 个上测试,看看我们有多准确。

这被称为监督机器学习,因为我们正在向机器展示数据,并告诉它“这个数据是正面的”,或者“这个数据是负面的”。然后,在完成训练之后,我们向机器展示一些新的数据,并根据我们之前教过计算机的内容询问计算机,计算机认为新数据的类别是什么。

我们可以用以下方式分割数据:

>>> import nltk
>>> from nltk.corpus import movie_reviews
>>> import random
>>> from nltk import data
>>>
>>> data.path.append("/home/bk/nltk_data/packages")
>>>
>>>
>>> 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)]
>>>
>>> all_words = []
>>>
>>> for w in movie_reviews.words():
>>>     all_words.append(w.lower())
>>>
>>> all_words = nltk.FreqDist(all_words)
>>> word_features = list(all_words.keys())[:3000]
>>>
>>> def find_features(document):
>>>     words = set(document)
>>>     features = {}
>>>     for w in word_features:
>>>         features[w] = (w in words)
>>>
>>>     return features
>>>
>>> # documents =
>>> random.shuffle(documents)
>>>
>>> documents = [(list(movie_reviews.words(fileid)), category)
>>>              for category in movie_reviews.categories()
>>>              for fileid in movie_reviews.fileids(category)]
>>>
>>> featuresets = [(find_features(rev), category) for (rev, category) in documents]
>>> # set that we'll train our classifier with
>>> training_set = featuresets[:1900]
>>>
>>> # set that we'll test against.
>>> testing_set = featuresets[1900:]

下面,我们可以定义并训练我们的分类器:

>>> classifier = nltk.NaiveBayesClassifier.train(training_set)

首先,我们只是简单调用朴素贝叶斯分类器,然后在一行中使用.train()进行训练。

足够简单,现在它得到了训练。 接下来,我们可以测试它:

>>> print("Classifier accuracy percent:",(nltk.classify.accuracy(classifier, testing_set))*100)
Classifier accuracy percent: 77.0

砰,你得到了你的答案。 如果你错过了,我们可以“测试”数据的原因是,我们仍然有正确的答案。 因此,在测试中,我们向计算机展示数据,而不提供正确的答案。 如果它正确猜测我们所知的答案,那么计算机是正确的。 考虑到我们所做的打乱,你和我可能准确度不同,但你应该看到准确度平均为 60-75%。

接下来,我们可以进一步了解正面或负面评论中最有价值的词汇:

>>> classifier.show_most_informative_features(15)
Most Informative Features
                 idiotic = True              neg : pos    =     12.1 : 1.0
                  annual = True              pos : neg    =     10.7 : 1.0
               atrocious = True              neg : pos    =     10.5 : 1.0
                   sucks = True              neg : pos    =      9.5 : 1.0
                 frances = True              pos : neg    =      9.3 : 1.0
           unimaginative = True              neg : pos    =      7.5 : 1.0
                 cunning = True              pos : neg    =      7.0 : 1.0
                  sexist = True              neg : pos    =      6.9 : 1.0
             silverstone = True              neg : pos    =      6.9 : 1.0
                  regard = True              pos : neg    =      6.9 : 1.0
              schumacher = True              neg : pos    =      6.7 : 1.0
                    mena = True              neg : pos    =      6.3 : 1.0
                  shoddy = True              neg : pos    =      6.3 : 1.0
                  suvari = True              neg : pos    =      6.3 : 1.0
                 singers = True              pos : neg    =      6.3 : 1.0

这个告诉你的是,每一个词的负面到正面的出现几率,或相反。 因此,在这里,我们可以看到,负面评论中的insulting一词比正面评论多出现 10.6 倍。Ludicrous是 10.1。

现在,让我们假设,你完全满意你的结果,你想要继续,也许使用这个分类器来预测现在的事情。 训练分类器,并且每当你需要使用分类器时,都要重新训练,是非常不切实际的。 因此,您可以使用pickle模块保存分类器。 我们接下来做。