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

目录

得到全量数据集

得到采样数据集

模型训练

全部代码:

结果

已完结


接上: 垃圾邮件分类(trec06c数据集)数据处理-特征提取 https://blog.csdn.net/qq_39321513/article/details/111997173

我是将分词前的文本数据存文件了,这样就得取数据,分词,向量化,输入模型;当然也可以将分词之后的存成文件,一封邮件样本存成一行,然后取数据,向量化,输入模型进行训练。

接下来就对 mailcorous.txt 文件进行操作就可以啦

得到全量数据集

(这个一般不用,内存容易爆满,但我也贴上来了)

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

得到采样数据集

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, 64620)
    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训练分类模型

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))

主函数

if __name__ == '__main__':

    train_path = 'trec06c/data/mailcorous.txt'
    X, y = Sample(train_path, k=3000, random_state=10)
    Model_train_test(X, y)

全部代码:

import pandas as pd
import jieba
from sklearn.feature_extraction.text import CountVectorizer
import random
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics


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

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, 64620)
    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


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))

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~

  • 21
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 为了下载TREC06C数据集,您可以按照以下步骤进行操作: 1. 首先,您需要打开网页浏览器并访问TREC官方网站。您可以在搜索引擎中输入"TREC官方网站"来找到该网站。 2. 在TREC官方网站上,您可以找到与TREC06C数据集相关的信息和资源。您可以使用网站上的搜索功能,搜索TREC06C数据集。 3. 在搜索结果中,您可能会看到有关TREC06C数据集的页面或链接。请点击相关链接以获取进一步的信息。 4. 在相关页面上,您可能会找到关于TREC06C数据集的描述、下载链接或访问权限的说明。请根据页面上的引导,选择适合您的下载选项。 5. 请注意,有些数据集可能需要您注册或登录才能进行下载。如果需要注册,请按照页面上的要求进行注册。 6. 一旦您找到适合的下载选项并完成相关步骤,您可以点击下载链接或按照页面上的说明进行下载。 7. 下载时间可能会根据您的网络连接速度和数据集的大小而有所不同。请耐心等待下载完成。 8. 下载完成后,您可以查看下载的文件,并根据需要进行相应的数据分析或研究。 希望以上信息对您有所帮助,祝您成功下载TREC06C数据集! ### 回答2: TREC06C是一个公开的数据集,用于信息检索和文本分类的研究和评估。它是2006年美国国家标准技术研究所(NIST)举办的TREC竞赛中使用的数据集。 要下载TREC06C数据集,首先需要在NIST的TREC网站上注册一个账号。注册完成后,根据网站上的指引,选择TREC06C数据集并查找下载链接。 在下载链接中,可能会有不同格式的数据集可供选择,如原始文本、索引文件或预处理的数据等。根据自己的需要选择合适的数据格式并下载。 一旦下载完成,就可以开始使用TREC06C数据集进行研究和评估了。可以根据数据集的文档来了解数据的结构和标记方式,这有助于更好地理解和处理数据集。 在进行研究和评估过程中,可以使用TREC06C数据集来构建文本分类模型、评估信息检索算法的性能,或者进行其他相关的任务。可以根据自己的具体需求和研究目标来利用数据集,并按照科研的规范进行实验和分析。 总之,下载TREC06C数据集需要在NIST的TREC网站上注册账号,找到对应的下载链接,并选择合适的数据格式进行下载。通过合理利用数据集进行研究和评估,可以提高信息检索和文本分类等领域的研究成果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值