介绍
本文解释了如何使用python制作用于文本分类的朴素贝叶斯分类器。朴素贝叶斯算法是机器学习中最常用的文本分类算法之一。使用python实现朴素贝叶斯分类器相对容易,本文将使用scikit-learn(python机器学习库)。我将解释如何使用示例代码一步一步地编写代码。
1.什么是朴素贝叶斯分类器
朴素贝叶斯分类器是一种用于分类的机器学习算法,尤其适用于自然语言处理。它通常用于将新闻文章分类为特定类别,过滤垃圾邮件,情感分析等。
[样本用例]
- 分类新闻文章
- 过滤垃圾邮件
- 分析积极/消极情绪
朴素贝叶斯的特点
朴素贝叶斯分类器被分类为监督机器学习,基于贝叶斯定理。这两个因素都很重要,构成了朴素贝叶斯分类。
作为监督机器学习,朴素贝叶斯分类器需要训练数据进行分类。训练数据的质量会影响分类的准确性,因此您需要记住,收集合格的机器学习训练数据集非常重要。否则,朴素贝叶斯分类器会错误地对数据进行分类。
贝叶斯定理是基于条件概率的数学理论来计算偶数概率。它根据事件的先验概率计算事件的概率。换句话说,它显示事件的先验概率对最终概率的影响程度。
[朴素贝叶斯分类器的特点]
- 监督学习
- 基于贝叶斯定理
- 基于条件概率的统计方法
2.什么是TF-IDF
TF-IDF(term frequency- reverse document frequency,简称TF-IDF)是文本数据特征提取的主要方法之一。首先,文本本身无法计算,因此将其转换为向量空间(数值数据)。
TF-IDF计算每个文档中单词的重要性并减少诸如“is”,“the”,“a”等的停止词。TF-IDF提取文档中的特征词(如:技术文档中的“Python”)。TF-IDF利用这些特征词将文本转换为向量空间。
3.用Scikit-learn编写Python中的朴素贝叶斯分类器
在这一章中,我们使用scikit-learn库在python中编写了naive bayes分类器,它提供了很多机器学习算法。在本例中,我们将新闻文章分为每个类别。工作步骤如下。
- 机器学习数据收集:从sklearn.dataset准备训练数据集
- 将文本数据转换为向量空间:创建字典并将文本数据转换为向量空间。
- 建模和训练:创建朴素的贝叶斯分类器机器学习模型和训练
- 执行并检查输出:分类测试数据并显示结果。
3-1数据收集:来自sklearn.dataset的数据集
第一步是从sklearn.dataset获取样本训练数据集。Scikit-learn为实验提供了样本和实际数据集。下面的Python代码显示了包含哪些数据集以及如何访问它们。
# Import dataset module.from sklearn.datasets import fetch_20newsgroups# Fetch 20 news groups training dataset.# subset : Select "test" or "train" dataset.# We extract "train" dataset. news_groups_train = fetch_20newsgroups(subset="train")# Show keys. # data : Article data# target_names: Category names. # target : Labeled(categorized) data. Labeled in replaced numbers. news_groups_train.keys()
dict_keys(['data', 'filenames', 'target_names', 'target', 'DESCR', 'description'])
# Get article content.news_groups_train.data[0]
# Get numerically labeled number of category.news_groups_train.target
array([7, 4, 4, ..., 3, 1, 8])
# Get target(category) names.news_groups_train.target_names
['alt.atheism',
'comp.graphics',
'comp.os.ms-windows.misc',
'comp.sys.ibm.pc.hardware',
'comp.sys.mac.hardware',
'comp.windows.x',
'misc.forsale',
'rec.autos',
'rec.motorcycles',
'rec.sport.baseball',
'rec.sport.hockey',
'sci.crypt',
'sci.electronics',
'sci.med',
'sci.space',
'soc.religion.christian',
'talk.politics.guns',
'talk.politics.mideast',
'talk.politics.misc',
'talk.religion.misc']
3-2从文本到向量的转换:TF-IDF向量化
下一步是从文本数据创建向量化数据。此步骤还分为两个步骤:创建计数矩阵并从计数矩阵转换为向量表示。Scikit-learn为转换提供了CountVectorizer和TfidfTransformer类。
# Import CountVectorizer class. # CountVectorizer converts text data to matrix of token counts.from sklearn.feature_extraction.text import CountVectorizercount_vector = CountVectorizer()# fit_transform() creates dictionary and return term-document matrix.X_train_counts = count_vector.fit_transform(news_groups_train.data)# Import TfidfTransformer class.# TfidfTransformer transoforms count matrix to tf-idf representation.from sklearn.feature_extraction.text import TfidfTransformertfidf_transformer = TfidfTransformer()# fit_transform transforms count matrix to tf-idf representation(vector).X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
3-3建模与训练:创建朴素贝叶斯分类器模型
第三步是制作朴素的贝叶斯分类器模型和训练数据。Scikit-learn为文本分类提供了sklearn.naive_bayes.MultinomialNB类。下面的Python代码显示了如何制作模型和训练数据集。
在文本分类中,使用多项式朴素贝叶斯(MultinominalNB)。该算法适合离散类型的数据。
# Create model(naive bayes) and training. from sklearn.naive_bayes import MultinomialNBclf = MultinomialNB().fit(X_train_tfidf, news_groups_train.target)
3-4执行分类和检查结果
最后一步是执行分类和检查结果。您可以制作自己的简单文档并进行测试。测试数据也应该转换为向量空间。
# Create test documents.docs_new = [ 'God is love', 'OpenGL on the GPU is fast', "United states goes to Iraq