这里就简单的举一个例子吧!第一次看的时候完全没有明白是怎么回事,后面睡了一下起来就明白了。主要是对于朴素贝叶斯分类模型不了解吧。
使用影评语料库获取所有的评论,训练模型后,模型能够根据文章,判断文章是正面的还是反面的。关键还是下面这张图。
有监督分类
首先是获取影评语料,这个库是按照积极(pos)和消极(neg)将文本以文件的形式分开。朴素贝叶斯分类模型,使用提取到的特征,以及正确的标签作为训练数据。
-
特征提取:获取语料库的前2000个单词,就使用文章是否拥有这些单词为特征。
#获取影评库中的单词构建频率分布 fd = nltk.FreqDist(movie_reviews.words()) #选取前2000个用于就够特征,特征集就是这些单词在不在文件中 word_feature = list(fd.keys())[:2000] #特征提取器: def document_features(document): document = set(document) features = {} for w in word_feature: features[w] = w in document return features
-
数据:首先要获取分类,再获取文件,最后获取文件所有单词传入特征提取函数,返回的特征集和文本的标签组成元组。这样就得到了训练数据。
#获取数据 documents = [ (document_features(movie_reviews.words(d)),c) for c in movie_reviews.categories() for d in movie_reviews.fileids(c) ] train_set,test_set = documents[100:],documents[:100]
-
训练数据:前面的字典就是特征 {单词:存在与否},单词选用的是语料库的前2000个。
{.... , 'manhunter': False, 'scottish': False, 'brian': False, 'cox': False}, 'neg')
-
朴素贝叶斯分类模型
直接在nltk模块下调用就可以了很方便的。#训练模型 classifier = nltk.NaiveBayesClassifier.train(train_set)
对于如何实现分类的需要取具体了解贝叶斯模型的原理。在本程序中一开始很不理解怎么就实现分类了? 仔细查看训练数据之后才明白过来。训练集提取文章的标签(neg/pos)然后是特征集(是否包含单词),就将这两项交给模型告诉他这个特征集是正面的或者是反面的。模型自己会学习,我感觉就是稍微复杂一点的匹配吧。
整个程序:
import nltk
#导入影评语料库
from nltk.corpus import movie_reviews
#构建语料库中所有单词的频率分布
fd = nltk.FreqDist(movie_reviews.words())
#获取前2000个单词,在提取特征值的时候会用到,
#此程序的特征集将这2000个单词组成字典,评论中包含这个词则值为True,不包含则为False
word_feature = list(fd.keys())[:2000]
#特征提取器:
def document_features(document):
#将影评转换为集合,判断一个单词是否在集合中比判断它是否在list链表中快
document = set(document)
features = {}
#遍历2000个单词构建当前文本的特征集,
# 如果此单词存在则值为True,反之False
for w in word_feature:
features[w] = w in document
return features
#获取数据
# 转换为了各个文本的 (特征集,标签)
documents = [
(document_features(movie_reviews.words(d)),c)
for c in movie_reviews.categories()
for d in movie_reviews.fileids(c)
]
#分为训练集和测试集
train_set,test_set = documents[100:],documents[:100]
#训练模型
classifier = nltk.NaiveBayesClassifier.train(train_set)
# 评估模型准确度
print(nltk.classify.accuracy(classifier,test_set))
输出结果:0.78
网友评论