12.朴素贝叶斯-垃圾邮件分类
1.1 读邮件数据集文件,提取邮件本身与标签。
以numpy数组形式存储:
1 import csv 2 # import nltk 3 from nltk.corpus import stopwords # 停用词 4 from nltk.stem import WordNetLemmatizer # 词性还原 5 6 # 读取数据集 7 file_path = r'E:\SMSSpamCollection' 8 sms = open(file_path, 'r', encoding='UTF-8') 9 sms_data = [] 10 sms_label = [] 11 csv_reader = csv.reader(sms, delimiter='\t') 12 for line in csv_reader: 13 sms_label.append(line[0]) 14 sms_data.append(preprocessing(line[1])) # 对每封邮件做预处理 15 sms.close() 16 sms_data
运行结果:
1.2 邮件预处理
- 邮件分句
- 句子分词
- 大小写,标点符号,去掉过短的单词
- 词性还原:复数、时态、比较级
- 连接成字符串
运行结果:
2.1 传统方法来实现
2.2 nltk库的安装与使用
pip install nltk # 安装nltk
import nltk # 导入nltk包
#利用nltk下载软件
----------------------------------
方案(1):直接安装 -- 可能由于网速问题下载很慢
nltk.download() # sever地址改成 http://www.nltk.org/nltk_data/
方案(2):手动安装
https://github.com/nltk/nltk_data 下载gh-pages分支,里面的Packages就是我们要的资源。
将Packages文件夹改名为nltk_data。
方案(3):手动安装
网盘链接:https://pan.baidu.com/s/1iJGCrz4fW3uYpuquB5jbew 提取码:o5ea
手动安装成功后将nltk_data放在用户目录(C:\Users\刘晓敏\AppData\Roaming)。
----------------------------------
安装完成,通过下述命令可查看nltk版本:
import nltk
print nltk.__doc__
2.1 nltk库 分词
nltk.sent_tokenize(text) #对文本按照句子进行分割
nltk.word_tokenize(sent) #对句子进行分词
运行结果:
2.2 punkt 停用词
from nltk.corpus import stopwords
stops=stopwords.words('english')
运行结果:
如果提示punkt not found
nltk.download(‘punkt’)
或 下载punkt.zip
https://pan.baidu.com/s/1OwLB0O8fBWkdLx8VJ-9uNQ (密码:mema)
复制并解压到对应的目录(C:\Users\刘晓敏\AppData\Roaming\nltk_data\tokenizers),要把原来的删掉
2.3 NLTK 词性标注
nltk.pos_tag(tokens)
# tokens是句子分词后的结果,同样是句子级的标注
# 查看说明 nltk.help.upenn_tagset('JJ')
2.4 Lemmatisation(词性还原)
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize('leaves') #缺省名词
lemmatizer.lemmatize('best',pos='a')
lemmatizer.lemmatize('made',pos='v')
一般先要分词、词性标注,再按词性做词性还原。
2.5 编写预处理函数
def preprocessing(text):
sms_data.append(preprocessing(line[1])) #对每封邮件做预处理
1 # 预处理 2 3 4 def preprocessing(text): 5 # text=text.decode("utf-8") 6 tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] 7 stops = stopwords.words('english') 8 tokens = [token for token in tokens if token not in stops] 9 10 tokens = [token.lower() for token in tokens if len(token) >= 3] 11 lmtzr = WordNetLemmatizer() 12 tokens = [lmtzr.lemmatize(token) for token in tokens] 13 preprocessed_text = ' '.join(tokens) 14 return preprocessed_text
3. 训练集与测试集
4. 词向量
5. 模型