如何对文档进行分类

朴素贝叶斯分类意识和的场景就是文本分类情感分析和垃圾邮件识别。其中情感分析和垃圾文件识别都是通过文本进行判断。所以朴素贝叶斯常用于自然语言处理NLP的工具.

sklearn机器学习包

sklearn(Scikit-learn),它给我们提供了3个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GassianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)
**高斯朴素贝叶斯:**特征变量是连续的,符合高斯分布,例如人的升高,物体的长度。
**多项式朴素贝叶斯:**特征变量是离散的变量,符合多项式,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等。
**伯努利朴素贝叶斯:**特征变量是布尔变量,符合0/1分布,在文档分类中特征单词是否出现。

TF-IDF

TF:词频,计算一个单词在文档中出现的次数,他认为一个单词的重要性和他在文档中出现的呈正比。
IDF:你想文档频率IDF,是指一个单词在文档中的区分度,他认为一个单词出现在文档越少,越能通过这个单词把该文档和其他文档区分开。

应用

documents = [
    'this is the bayes document',
    'this is the second second document',
    'and the third one',
    'is this the document'
]
tfidf_matrix = tfidf_vec.fit_transform(documents)

输出代码中不重复的词


print('不重复的词:', tfidf_vec.get_feature_names())

输出每个单词对应的id


print('每个单词的ID:', tfidf_vec.vocabulary_)

输出每个单词在每个文档中的TF-IDF值


print('每个单词的tfidf值:', tfidf_matrix.toarray())

向量里的顺序是按照词语的id顺序来的

对文档进行分词

英文分词常用包:nltk,包含常用的英文停用词,stop words 分词和标注方法
中文分词常用包:jieba,包含常用的中文停用词和stop words和分词方法。

加载停用词表

需要在网上下载常用的中文停用词表,存在stop-words.txt,然后利用python文件读取,保存在列表中。

stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]

计算单词的权重

使用sklearn里的TfidVectorizer类,直接使用他的fit_transform方法进行合成,得到TF-IDF空间特性features,你可以理解为选出来的分词就是特征,并且得到特征空间features.

tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
features = tf.fit_transform(train_contents)

这里Max_df=0.5,代表一个单词在文章中出现了百分之50,那么他只携带了非常少量小的信息,因此不作为分词统计。
并且一般很少设置min_df,因为min_df通常会显示很小

生成朴素贝叶斯分类器

将特征空间train_features,以及训练及对应的分类train-labels传递给贝叶斯分类器clf,他会自动生成一个符合特征空间和对饮分类器。


# 多项式贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB  
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

使用分类器做预测

首先我们需要得到测试集的特征矩阵。
具体的方法是用训练集合的分词创建一个tfidVectorizer类,使用同样的stop_words和max_df,然后用这个类对测试机进行拟合。

test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary)
test_features=test_tf.fit_transform(test_contents)

然后我们用训练好的分类器对新数据做预测。

predicted_labels=clf.predict(test_features)

计算准确率

调用sklearn中的metrics包进行准确率计算

from sklearn import metrics
print metrics.accuracy_score(test_labels, predicted_labels)

猜你喜欢

转载自blog.csdn.net/weixin_36662706/article/details/128887552