关键词:
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
from sklearn.model_selection import train_test_split
x_train,x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0, stratify=y_train)
4.文本特征提取
sklearn.feature_extraction.text.CountVectorizer
sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
观察邮件与向量的关系
向量还原为邮件
4.模型选择
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
说明为什么选择这个模型?
由于样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。
5.模型评价:混淆矩阵,分类报告
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_predict)
说明混淆矩阵的含义
from sklearn.metrics import classification_report
说明准确率、精确率、召回率、F值分别代表的意义
分类报告:
TP:正确的匹配数目
FP:误报,没有的匹配不正确
FN:漏报,没有找到正确匹配的数目
TN:正确的非匹配数目
准确率(正确率)=所有预测正确的样本/总的样本 (TP+TN)/总
精确率= 将正类预测为正类 / 所有预测为正类 TP/(TP+FP)
召回率 = 将正类预测为正类 / 所有正真的正类 TP/(TP+FN)
F值 = 精确率 * 召回率 * 2 / ( 精确率 + 召回率) (F 值即为精确率和召回率的调和平均值)
6.比较与总结
如果用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,效果如何?
CountVectorizer:只考虑词汇在文本中出现的频率
TfidfVectorizer:除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征
因此:相比之下,文本条目越多,Tfid的效果会越显著
源代码:
import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer import csv import numpy as np from sklearn.model_selection import cross_val_score from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report # 预处理 def preprocessing(text): # text=text.decode("utf-8") tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] stops = stopwords.words(‘english‘) tokens = [token for token in tokens if token not in stops] tokens = [token.lower() for token in tokens if len(token) >= 3] lmtzr = WordNetLemmatizer() tokens = [lmtzr.lemmatize(token) for token in tokens] preprocessed_text = ‘ ‘.join(tokens) return preprocessed_text # 读取数据集 file_path = ‘F:SMSSpamCollection‘ sms = open(file_path, ‘r‘, encoding=‘utf-8‘) sms_data = [] sms_label = [] csv_reader = csv.reader(sms, delimiter=‘ ‘) for line in csv_reader: sms_label.append(line[0]) sms_data.append(preprocessing(line[1])) sms.close() print(len(sms_data)) # 按0.7:0.3比例分为训练集和测试集,再将其向量化 dataset_size = len(sms_data) trainset_size = int(round(dataset_size * 0.7)) print(‘dataset_size:‘, dataset_size, ‘ trainset_size:‘, trainset_size) x_train = np.array([‘‘.join(el) for el in sms_data[0:trainset_size]]) y_train = np.array(sms_label[0:trainset_size]) x_test = np.array(sms_data[trainset_size + 1:dataset_size]) y_test = np.array(sms_label[trainset_size + 1:dataset_size]) vectorizer = TfidfVectorizer(min_df=2, ngram_range=(1, 2), stop_words=‘english‘, strip_accents=‘unicode‘, norm=‘l2‘) # 将已划分好的训练集和测试集向量化 X_train = vectorizer.fit_transform(x_train) X_test = vectorizer.transform(x_test) # 朴素贝叶斯分类器 MNB = MultinomialNB() clf = MNB.fit(X_train, y_train) y_pred = MNB.predict(X_test) print("预测正确邮件数:") print((y_pred == y_test).sum()) # 模型评价 print("=============================================") print(‘混淆矩阵:‘) cm = confusion_matrix(y_test, y_pred) print(cm) print("=============================================") print(‘分类报告:‘) cr = classification_report(y_test, y_pred) print(cr)
实验结果:
13-垃圾邮件分类2(代码片段)
1.读取2.数据预处理3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=0,stratify=y_train)4.文本特征提取skl 查看详情
13-垃圾邮件分类2(代码片段)
1.读取2.数据预处理importcsvimportnltkimportrefromnltk.corpusimportstopwordsfromnltk.stemimportWordNetLemmatizerimportpandasaspd#返回类别defgetLb(data):ifdata.startswith("J"):returnnltk.corpus.wordnet.ADJelifdata.startswith("V"):returnnltk.corpus.wordnet.VERBelifdata.startswith("N"):return... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取源代码:#读取文件file_path=r‘D:PycharmProjects201706120186罗奕涛dataSMSSpamCollection‘sms=open(file_path,‘r‘,encoding=‘utf-8‘)sms_data=[]sms_label=[]csv_reader=csv.reader(sms,delimiter=‘ ‘)forlineincsv_reader:sms_label.append(line[0])sms_data.append(preprocessing(l... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取2.数据预处理3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=0,stratify=y_train)4.文本特征提取sklearn.feature_extraction.text.CountVectorizer... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=0,stratify=y_train) 4.文本特征提取sklearn.fea... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=0,stratify=y_train)4.文本特... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取2.数据预处理#词性还原defget_wordnet_pos(treebank_tag):iftreebank_tag.startswith(‘J‘):returnnltk.corpus.wordnet.ADJeliftreebank_tag.startswith(‘V‘):returnnltk.corpus.wordnet.VERBeliftreebank_tag.startswith(‘N‘):returnnltk.corpus.wordnet.NOUNeliftreebank_tag.startswith(‘... 查看详情
13-垃圾邮件分类2(代码片段)
1.读取2.数据预处理#词性还原defget_wordnet_pos(treebank_tag):iftreebank_tag.startswith(‘J‘):returnnltk.corpus.wordnet.ADJeliftreebank_tag.startswith(‘V‘):returnnltk.corpus.wordnet.VERBeliftreebank_tag.startswith(‘N‘):returnnltk.corpus.wordnet.NOUNeliftreebank_tag.startswith(‘... 查看详情
13-垃圾邮件分类2(代码片段)
13-垃圾邮件分类2TF-IDF概念是一种统计方法,用以评估一个词对于一个语料库中一份文件的重要程度。词的重要性随着在文件中出现的次数正比增加,同时随着它在语料库其他文件中出现的频率反比下降。就是说一个词在某一个... 查看详情
垃圾邮件分类2(代码片段)
1.读取defread_dataset():file_path=r‘C:UsersD。SMSSpamCollection‘sms=open(file_path,encoding=‘utf-8‘)sms_data=[]sms_label=[]csv_reader=csv.reader(sms,delimiter=‘ ‘)forlineincsv_reader:sms_label.append 查看详情
13-垃圾邮件分类2
1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分 fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_ 查看详情
13-垃圾邮件分类2
1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state= 查看详情
12.朴素贝叶斯-垃圾邮件分类(代码片段)
1.读邮件数据集文件,提取邮件本身与标签。列表numpy数组2.邮件预处理邮件分句句子分词大小写,标点符号,去掉过短的单词词性还原:复数、时态、比较级连接成字符串2.1传统方法来实现2.2nltk库的安装与使用pipinstallnltkimportnlt... 查看详情
12.朴素贝叶斯-垃圾邮件分类(代码片段)
1.读邮件数据集文件,提取邮件本身与标签。列表numpy数组2.邮件预处理邮件分句句子分词大小写,标点符号,去掉过短的单词词性还原:复数、时态、比较级连接成字符串2.1传统方法来实现2.2nltk库的安装与使用pipinstallnltkimportnlt... 查看详情
机器学习:13-垃圾邮件分类2
1.读取2.数据预处理3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=0,stratify=y_train)4.文本特征提取skl 查看详情
13垃圾邮件分类
1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(dat 查看详情
12.朴素贝叶斯-垃圾邮件分类(代码片段)
1.读邮件数据集文件,提取邮件本身与标签。列表numpy数组2.邮件预处理邮件分句名子分词去掉过短的单词词性还原连接成字符串 传统方法来实现 nltk库的安装与使用pipinstallnltkimportnltknltk.download() #sever地... 查看详情
12.朴素贝叶斯-垃圾邮件分类(代码片段)
读邮件数据集文件,提取邮件本身与标签。2.邮件预处理2.1传统方法2.1nltk库分词nltk.sent_tokenize(text)#对文本按照句子进行分割nltk.word_tokenize(sent)#对句子进行分词2.2punkt停用词fromnltk.corpusimportstopwordsstops=stopwords.words(‘english‘)2.3NLTK... 查看详情