注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
自然语言处理系列四十九
朴素贝叶斯》算法原理
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法,在文本分类任务应用非常普遍,我们下面详细介绍一下。
1. 朴素贝叶斯算法介绍
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。简单来说,朴素贝叶斯分类器假设样本每个特征与其他特征都不相关。举个例子,如果一种水果具有红,圆,直径大概4英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够取得相当好的效果。朴素贝叶斯分类器的一个优势在于只需要根据少量的训练数据估计出必要的参数(离散型变量是先验概率和类条件概率,连续型变量是变量的均值和方差)。朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我们会选择条件概率最大的类别作为此待分类项应属的类别。
2. 朴素贝叶斯中文文本分类特征工程处理
文本分类是指将一篇文章归到事先定义好的某一类或者某几类,在数据平台的一个典型的应用场景是,通过爬取用户浏览过的页面内容,识别出用户的浏览偏好,从而丰富该用户的画像。我们现在使用Spark MLlib提供的朴素贝叶斯(Naive Bayes)算法,完成对中文文本的分类过程。主要包括中文分词、文本表示(TF-IDF)、模型训练、分类预测等。
中文分词
对于中文文本分类而言,需要先对文章进行分词,我使用中文分析工具IKAnalyzer,HanLP,ansj分词都可以。
中文词语特征值转换(TF-IDF)
分好词后,我们需要把文本转换成算法可理解的数字,一般我们用TF-IDF的值作为特征值,也可以用简单的词频TF作为特征值,每一个词都作为一个特征,但需要将中文词语转换成Double型来表示,通常使用该词语的TF-IDF值作为特征值,Spark提供了全面的特征抽取及转换的API,非常方便,详见http://spark.apache.org/docs/latest/ml-features.html,这里介绍下TF-IDF的API:
比如,训练语料/tmp/lxw1234/1.txt:
0,苹果官网苹果宣布
1,苹果梨香蕉
逗号分隔的第一列为分类编号,0为科技,1为水果,代码如下所示。
case class RawDataRecord(category: String, text: String)
val conf = new SparkConf().setMaster(“yarn-client”)
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
//将原始数据映射到DataFrame中,字段category为分类编号,字段text为分好的词,以空格分隔,代码如下所示。
var srcDF = sc.textFile(“/tmp/lxw1234/1.txt”).map {
x =>
var data = x.split(“,”)
RawDataRecord(data(0),data(1))
}.toDF()
srcDF.select(“category”, “text”).take(2).foreach(println)
[0,苹果官网苹果宣布]
[1,苹果梨香蕉]
//将分好的词转换为数组,代码如下所示。
var tokenizer = new Tokenizer().setInputCol(“text”).setOutputCol(“words”)
var wordsData = tokenizer.transform(srcDF)
wordsData.select(
"
c
a
t
e
g
o
r
y
"
,
"category",
"category",“text”,
"
w
o
r
d
s
"
)
.
t
a
k
e
(
2
)
.
f
o
r
e
a
c
h
(
p
r
i
n
t
l
n
)
[
0
,
苹果官网苹果宣布
,
W
r
a
p
p
e
d
A
r
r
a
y
(
苹果
,
官网
,
苹果
,
宣布
)
]
[
1
,
苹果梨香蕉
,
W
r
a
p
p
e
d
A
r
r
a
y
(
苹果
,
梨
,
香蕉
)
]
/
/
将每个词转换成
I
n
t
型,并计算其在文档中的词频(
T
F
),代码如下所示。
v
a
r
h
a
s
h
i
n
g
T
F
=
n
e
w
H
a
s
h
i
n
g
T
F
(
)
.
s
e
t
I
n
p
u
t
C
o
l
(
"
w
o
r
d
s
"
)
.
s
e
t
O
u
t
p
u
t
C
o
l
(
"
r
a
w
F
e
a
t
u
r
e
s
"
)
.
s
e
t
N
u
m
F
e
a
t
u
r
e
s
(
100
)
v
a
r
f
e
a
t
u
r
i
z
e
d
D
a
t
a
=
h
a
s
h
i
n
g
T
F
.
t
r
a
n
s
f
o
r
m
(
w
o
r
d
s
D
a
t
a
)
这里将中文词语转换成
I
N
T
型的
H
a
s
h
i
n
g
算法,类似于
B
l
o
o
m
f
i
l
t
e
r
,上面的
s
e
t
N
u
m
F
e
a
t
u
r
e
s
(
100
)
表示将
H
a
s
h
分桶的数量设置为
100
个,这个值默认为
2
的
20
次方,即
1048576
,可以根据你的词语数量来调整,一般来说,这个值越大,不同的词被计算为一个
H
a
s
h
值的概率就越小,数据也更准确,但需要消耗更大的内存,和
B
l
o
o
m
f
i
l
t
e
r
是一个道理。
f
e
a
t
u
r
i
z
e
d
D
a
t
a
.
s
e
l
e
c
t
(
"words").take(2).foreach(println) [0,苹果官网苹果宣布,WrappedArray(苹果, 官网, 苹果, 宣布)] [1,苹果梨香蕉,WrappedArray(苹果, 梨, 香蕉)] //将每个词转换成Int型,并计算其在文档中的词频(TF),代码如下所示。 var hashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(100) var featurizedData = hashingTF.transform(wordsData) 这里将中文词语转换成INT型的Hashing算法,类似于Bloomfilter,上面的setNumFeatures(100)表示将Hash分桶的数量设置为100个,这个值默认为2的20次方,即1048576,可以根据你的词语数量来调整,一般来说,这个值越大,不同的词被计算为一个Hash值的概率就越小,数据也更准确,但需要消耗更大的内存,和Bloomfilter是一个道理。 featurizedData.select(
"words").take(2).foreach(println)[0,苹果官网苹果宣布,WrappedArray(苹果,官网,苹果,宣布)][1,苹果梨香蕉,WrappedArray(苹果,梨,香蕉)]//将每个词转换成Int型,并计算其在文档中的词频(TF),代码如下所示。varhashingTF=newHashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(100)varfeaturizedData=hashingTF.transform(wordsData)这里将中文词语转换成INT型的Hashing算法,类似于Bloomfilter,上面的setNumFeatures(100)表示将Hash分桶的数量设置为100个,这个值默认为2的20次方,即1048576,可以根据你的词语数量来调整,一般来说,这个值越大,不同的词被计算为一个Hash值的概率就越小,数据也更准确,但需要消耗更大的内存,和Bloomfilter是一个道理。featurizedData.select(“category”, $“words”,
"
r
a
w
F
e
a
t
u
r
e
s
"
)
.
t
a
k
e
(
2
)
.
f
o
r
e
a
c
h
(
p
r
i
n
t
l
n
)
[
0
,
W
r
a
p
p
e
d
A
r
r
a
y
(
苹果
,
官网
,
苹果
,
宣布
)
,
(
100
,
[
23
,
81
,
96
]
,
[
2.0
,
1.0
,
1.0
]
)
]
[
1
,
W
r
a
p
p
e
d
A
r
r
a
y
(
苹果
,
梨
,
香蕉
)
,
(
100
,
[
23
,
72
,
92
]
,
[
1.0
,
1.0
,
1.0
]
)
]
结果中,“苹果”用
23
来表示,第一个文档中,词频为
2
,第二个文档中词频为
1.
/
/
计算
T
F
−
I
D
F
值
v
a
r
i
d
f
=
n
e
w
I
D
F
(
)
.
s
e
t
I
n
p
u
t
C
o
l
(
"
r
a
w
F
e
a
t
u
r
e
s
"
)
.
s
e
t
O
u
t
p
u
t
C
o
l
(
"
f
e
a
t
u
r
e
s
"
)
v
a
r
i
d
f
M
o
d
e
l
=
i
d
f
.
f
i
t
(
f
e
a
t
u
r
i
z
e
d
D
a
t
a
)
v
a
r
r
e
s
c
a
l
e
d
D
a
t
a
=
i
d
f
M
o
d
e
l
.
t
r
a
n
s
f
o
r
m
(
f
e
a
t
u
r
i
z
e
d
D
a
t
a
)
r
e
s
c
a
l
e
d
D
a
t
a
.
s
e
l
e
c
t
(
"rawFeatures").take(2).foreach(println) [0,WrappedArray(苹果, 官网, 苹果, 宣布),(100,[23,81,96],[2.0,1.0,1.0])] [1,WrappedArray(苹果, 梨, 香蕉),(100,[23,72,92],[1.0,1.0,1.0])] 结果中,“苹果”用23来表示,第一个文档中,词频为2,第二个文档中词频为1. //计算TF-IDF值 var idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") var idfModel = idf.fit(featurizedData) var rescaledData = idfModel.transform(featurizedData) rescaledData.select(
"rawFeatures").take(2).foreach(println)[0,WrappedArray(苹果,官网,苹果,宣布),(100,[23,81,96],[2.0,1.0,1.0])][1,WrappedArray(苹果,梨,香蕉),(100,[23,72,92],[1.0,1.0,1.0])]结果中,“苹果”用23来表示,第一个文档中,词频为2,第二个文档中词频为1.//计算TF−IDF值varidf=newIDF().setInputCol("rawFeatures").setOutputCol("features")varidfModel=idf.fit(featurizedData)varrescaledData=idfModel.transform(featurizedData)rescaledData.select(“category”, $“words”, $“features”).take(2).foreach(println)
[0,WrappedArray(苹果, 官网, 苹果, 宣布),(100,[23,81,96],[0.0,0.4054651081081644,0.4054651081081644])]
[1,WrappedArray(苹果, 梨, 香蕉),(100,[23,72,92],[0.0,0.4054651081081644,0.4054651081081644])]
因为一共只有两个文档,且都出现了“苹果”,因此该词的TF-IDF值为0。
最后一步,将上面的数据转换成Bayes算法需要的格式。然后就可以训练模型了。下面我看下训练的代码。
朴素贝叶斯算法》代码实战
朴素贝叶斯算法代码实战内容请参见
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】书籍。
更多的技术交流和探讨也欢迎加我个人微信chenjinglei66。
总结
此文章有对应的配套新书教材和视频:
【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。
全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。
本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。
《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目。
【配套视频】
推荐系统/智能问答/人脸识别实战 视频教程【陈敬雷】
视频特色:把目前互联网热门、前沿的项目实战汇聚一堂,通过真实的项目实战课程,让你快速成为算法总监、架构师、技术负责人!包含了推荐系统、智能问答、人脸识别等前沿的精品课程,下面分别介绍各个实战项目:
1、推荐算法系统实战
听完此课,可以实现一个完整的推荐系统!下面我们就从推荐系统的整体架构以及各个子系统的实现给大家深度解密来自一线大型互联网公司重量级的实战产品项目!
2、智能问答/对话机器人实战
由浅入深的给大家详细讲解对话机器人项目的原理以及代码实现、并在公司服务器上演示如何实际操作和部署的全过程!
3、人脸识别实战
从人脸识别原理、人脸识别应用场景、人脸检测与对齐、人脸识别比对、人脸年龄识别、人脸性别识别几个方向,从理论到源码实战、再到服务器操作给大家深度讲解!
自然语言处理NLP原理与实战 视频教程【陈敬雷】
视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!
人工智能《分布式机器学习实战》 视频教程【陈敬雷】
视频特色:视频核心内容有互联网公司大数据和人工智能、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)。
上一篇:自然语言处理系列四十八》Word2vec词向量模型》算法原理
下一篇:自然语言处理系列五十》文本分类算法》SVM支持向量机算法原理