现在是时候选择一个算法,将我们的数据分成训练和测试集,然后启动!我们首先要使用的算法是朴素贝叶斯分类器。这是一个非常受欢迎的文本分类算法,所以我们只能先试一试。然而,在我们可以训练和测试我们的算法之前,我们需要先把数据分解成训练集和测试集。
你可以训练和测试同一个数据集,但是这会给你带来一些严重的偏差问题,所以你不应该训练和测试完全相同的数据。为此,由于我们已经打乱了数据集,因此我们将首先将包含正面和负面评论的 1900 个乱序评论作为训练集。然后,我们可以在最后的 100 个上测试,看看我们有多准确。
这被称为监督机器学习,因为我们正在向机器展示数据,并告诉它“这个数据是正面的”,或者“这个数据是负面的”。然后,在完成训练之后,我们向机器展示一些新的数据,并根据我们之前教过计算机的内容询问计算机,计算机认为新数据的类别是什么。
我们可以用以下方式分割数据:
import nltk
from nltk.corpus import movie_reviews
import random
from nltk import data
data.path.append("/data/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
模块保存分类器。 我们接下来做。