• 沒有找到結果。

4 . 6 示例:使用朴素贝叶斯过滤垃圾邮件

在文檔中 关 于 封 面 (頁 68-72)

在前面那个简单的例 子 中,我们引人了字符串列表。使用朴素贝叶斯解决一些现实生活中 的 问 题 时 ,需要先从文本内容得到字符串列表,然后生成词向量。下 面 这 个 例 子 中,.我们将了 解朴素贝叶斯的一个最著名的应用:电子邮件垃圾过滤。首先看一下如何使用通用框架来解决 该 问 题 。

4 . 6

示 例 :使 用朴 素 贝叶 斯 过滤 垃圾 邮 件

65

示例:使用朴素贝叶斯对电子邮件进行分类 ' ;

(1)

收集数据:提供文本文件。

(2)

准备数据:将文本文件解析成词条向量。

(3)

分 析数据:检查词条确保解析的正确性。

(4)

训练算法 :使用我们之前建立的匕

31

80()

函数。

(5)

测试算法:使用

clasSifyN B ( >

,并且构建一个新的测试函数来计算文档集的错误率。

(6)

使 用 算 法 :构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。

下面首先给出将文本解析为词条的代码。然后将该代码和前面的分类代码集成为一个函数,

该函数在测试分类器的同时会给出错误率。

4 . 6 . 1 准 备 数 据 :切分文本

前一节介绍了如何创建词向量,并基于这些词向量进行朴素贝叶斯分类的过程。前一节中的 词向量是预先给定的,下面介绍如何从文本文档中构建自己的词列表。

对于一个文本字符串,可以使用

?

(^

3

11^.

1 ^ 0

方法将其切分。下面看看实际的 运行效果。在

(^

提示符下输人:

>>> m y S e n t = 1 This book is the best book on Python or M.L. I have ever laid W eyes u p o n .1

>>> m y S e n t .s p l i t ()

[ 'This1, 'b o o k ', _is_, 1 t h e ', 'b e s t 1, 'b o o k ', 1o n 1, 1 P y t h o n ', 1o r1, _M.L._,

*I', 'h a v e '; 'e v e r ', 'laid1, 'e y e s1, 1 u p o n . 1]

可以 看 到 ,切分的结果不错,但是标点符号也被当成了词的一部分。可以使用正则表示式来切分 句 子 ,其中分隔符是除单词、数字外的任意字符串。

>>> import re

>>> regEx = r e .c o m p i l e (1\ \ W * 1)

>>> listOfTokens = regEx.split(mySent)

>>> listOfTokens

[1 T h i s '7 1 b o o k ', 1 is 1, 't h e', ' be st 1, 'book', 1 o n 1, 'P y t h o n 1, o r,,'M', 1L1, 1 ', 'I_, 1 have 1, 1 e v e r1, _laid_, 1 e y e s ', 'upon 1, ■_]

现在得到了一系列词组成的词表,但是里面的空字符串需要去掉。可以计算每个字符串的长度,

只返回长度大于

0

的字符串。

>>> [tok for tok. in listOfTokens if len (tok) > 0]

最 后 ,我们发现句子中的第一个单词是大写的。如果目的是句子査找,那么这个特点会很有用。

但这里的文本只看成词袋,所以我们希望所有词的形式都是统一的,不论它们出现在句子中间、

结尾还是开头。

>^00

中有一些内嵌的方法,可以将字符串全部转换成小写

(

.

lower ())

或者大写

( .upper

( ) ),

借助这些方法可以达到目的。于 是 ,可以进行如下处理:

>>> [tok.l o w e r () for tok in listOfTokens if len(tok) > 0]

66

4

章 基 于 概 率 论 的 分 类 方 法 :朴 素贝叶斯

4 . 6

示 例 :使用朴素贝叶斯 过滤垃 圾邮 件

67

print 'the error rate is: 1,float(errorCount)/len(testSet)

第 一 个 函 数(:65^ 1^ ^ 3 ()接受一个大字符串并将其解析为字符串列表。该函数去掉少于两

68

4

章 基 于 概 率 论 的 分 类 方 法 :朴 素 贝叶 斯

在文檔中 关 于 封 面 (頁 68-72)