请选择 进入手机版 | 继续访问电脑版

垃圾邮件分类(trec06c数据集)特征分词、特征向量化、模型训练

[复制链接]
时间苍白了等待 发表于 2021-1-2 17:41:12 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
目次
得到全量数据集
得到采样数据集
模子训练
全部代码:
效果
已完结
接上: 垃圾邮件分类(trec06c数据集)数据处置惩罚-特征提取 https://blog.csdn.net/qq_39321513/article/details/111997173
我是将分词前的文本数据存文件了,这样就得取数据,分词,向量化,输入模子;固然也可以将分词之后的存成文件,一封邮件样本存成一行,然后取数据,向量化,输入模子举行训练。
接下来就对 mailcorous.txt 文件举行利用就可以啦
得到全量数据集

(这个一般不消,内存容易爆满,但我也贴上来了)
  1. def get_train_data(train_path):    """获取数据集----全量数据集"""    train_file = open(train_path, encoding='utf8')    # 加载训练数据    corpus = train_file.readlines() # 列表中的每个元素为一行文本 也就是一封邮件(包罗4个特征)    split_corpus = []    #分词    for c in corpus:        split_corpus.append(" ".join(jieba.lcut(c)))    train_file.close()    cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')# 保存两个及以上的特征词    X = cv.fit_transform(split_corpus).toarray() # 特征向量    # 垃圾邮件是1 正常邮件是0    # 垃圾邮件42854封  正常邮件21766封    y = [0] * 21766 + [1] * 42854 #构造分类标签    return X, y
复制代码
得到采样数据集

  1. def Sample(train_path, k=3000, random_state=10):    # 从原始数据会合各抽取3000个样本  # 垃圾邮件42854封  正常邮件21766封    # 设置随机种子    random.seed(random_state)    # 正常邮件的    ham_range = range(0, 21766)    ham_rdnum = random.sample(ham_range, k)    # 垃圾邮件的    spam_range = range(21766, 42854)    spam_rdnum = random.sample(spam_range, k)    train_file = open(train_path, encoding='utf8')    # 加载训练数据    corpus = train_file.readlines()  # 列表中的每个元素为一行文本 也就是一封邮件(包罗4个特征)    split_corpus = []    # 分词    for i, c in enumerate(corpus):        if i in ham_rdnum:            split_corpus.append(" ".join(jieba.lcut(c))) # 前k个--正常邮件    for i, c in enumerate(corpus):        if i in spam_rdnum:            split_corpus.append(" ".join(jieba.lcut(c))) # 后k个--垃圾邮件    train_file.close()    cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')    X = cv.fit_transform(split_corpus).toarray()  # 特征向量    # 垃圾邮件是1 正常邮件是0    y = [0] * k + [1] * k # [0 0  0 0 1 1 1 1 ]    return X, y
复制代码
模子训练

这里我使用SVM训练分类模子
  1. def Model_train_test(X, y):    """模子的训练及验证"""    # 切分训练集和测试集    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)    # 使用SVM训练分类模子    SVM_model = svm.SVC(C=1.0,kernel='sigmoid',gamma='auto',verbose=True)    SVM_model.fit(x_train, y_train)    # 测试分类性能    y_test_predict = SVM_model.predict(x_test)    print("准确率: ", SVM_model.score(x_test, y_test))    print("分类陈诉: ", metrics.classification_report(y_test,y_test_predict))    print("肴杂矩阵: ", metrics.confusion_matrix( y_test, y_test_predict))
复制代码
主函数
  1. if __name__ == '__main__':    train_path = 'trec06c/data/mailcorous.txt'    X, y = Sample(train_path, k=3000, random_state=10)    Model_train_test(X, y)
复制代码
全部代码:

  1. import pandas as pdimport jiebafrom sklearn.feature_extraction.text import CountVectorizerimport randomimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn import svmfrom sklearn import metricsdef get_train_data(train_path):    """获取数据集----全量数据集"""    train_file = open(train_path, encoding='utf8')    # 加载训练数据    corpus = train_file.readlines() # 列表中的每个元素为一行文本 也就是一封邮件(包罗4个特征)    split_corpus = []    #分词    for c in corpus:        split_corpus.append(" ".join(jieba.lcut(c)))    train_file.close()    cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')    X = cv.fit_transform(split_corpus).toarray() # 特征向量    # 垃圾邮件是1 正常邮件是0    # 垃圾邮件42854封  正常邮件21766封    y = [0] * 21766 + [1] * 42854    return X, ydef Sample(train_path, k=3000, random_state=10):    # 从原始数据会合各抽取3000个样本  # 垃圾邮件42854封  正常邮件21766封    # 设置随机种子    random.seed(random_state)    # 正常邮件的    ham_range = range(0, 21766)    ham_rdnum = random.sample(ham_range, k)    # 垃圾邮件的    spam_range = range(21766, 42854)    spam_rdnum = random.sample(spam_range, k)    train_file = open(train_path, encoding='utf8')    # 加载训练数据    corpus = train_file.readlines()  # 列表中的每个元素为一行文本 也就是一封邮件(包罗4个特征)    split_corpus = []    # 分词    for i, c in enumerate(corpus):        if i in ham_rdnum:            split_corpus.append(" ".join(jieba.lcut(c))) # 前k个--正常邮件    for i, c in enumerate(corpus):        if i in spam_rdnum:            split_corpus.append(" ".join(jieba.lcut(c))) # 后k个--垃圾邮件    train_file.close()    cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')    X = cv.fit_transform(split_corpus).toarray()  # 特征向量    # 垃圾邮件是1 正常邮件是0    y = [0] * k + [1] * k # [0 0  0 0 1 1 1 1 ]    return X, ydef Model_train_test(X, y):    """模子的训练及验证"""    # 切分训练集和测试集    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)    # 使用SVM训练分类模子    SVM_model = svm.SVC(C=1.0,kernel='sigmoid',gamma='auto',verbose=True)    SVM_model.fit(x_train, y_train)    # 测试分类性能    y_test_predict = SVM_model.predict(x_test)    print("准确率: ", SVM_model.score(x_test, y_test))    print("分类陈诉: ", metrics.classification_report(y_test,y_test_predict))    print("肴杂矩阵: ", metrics.confusion_matrix( y_test, y_test_predict))if __name__ == '__main__':    train_path = 'trec06c/data/mailcorous.txt'    X, y = Sample(train_path, k=3000, random_state=10)    Model_train_test(X, y)
复制代码
效果

咦 ~~~ 准确率太低了,哈哈效果欠好~  只邮件正文的特征准确率都能到达90%以上,我费了劲儿还让准确率低沉了 呵呵o(* ̄︶ ̄*)o

这是我的一个课程小作业,就这样吧,啊哈哈哈~ 不看效果,反正整个流程走下来照旧学习到许多东西的,感觉挺充实的~
整个过程可调解可优化的地方实在另有许多,但不想再弄了 哈哈~ 
已完结

 
 
接待转发~ 批评讨论~ 点赞~
转载请注明出处~
谢谢各人的支持!~ O(∩_∩)O~

来源:https://blog.csdn.net/qq_39321513/article/details/112021355
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )