垃圾邮件分类

实验代码:

import numpy as np
import jieba
import re
import string
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

def get_data():
    with open("ham_data.txt", encoding="utf8") as ham_f, open("spam_data.txt", encoding="utf8") as spam_f:
        ham_data = ham_f.readlines()
        spam_data = spam_f.readlines()
        ham_label = np.ones(len(ham_data)).tolist()
        spam_label = np.zeros(len(spam_data)).tolist()
        corpus = ham_data + spam_data
        labels = ham_label + spam_label
    return corpus, labels


def remove_empty_docs(corpus, labels):
    filtered_corpus =[]
    filtered_labels =[]
    for doc, label in zip(corpus, labels):
        if doc.strip():
            filtered_corpus.append(doc)
            filtered_labels.append(label)

    return filtered_corpus, filtered_labels


# 分词
def tokenize_text(text):
    tokens = jieba.cut(text)
    tokens = [token.strip() for token in tokens]
    return tokens


def remove_special_characters(text):
    tokens = tokenize_text(text)
    pattern = re.compile('[{}]'.format(re.escape(string.punctuation)))
    filtered_tokens = filter(None, [pattern.sub('', token) for token in tokens])
    filtered_text = ' '.join(filtered_tokens)
    return filtered_text


# 加载停用词
with open("stop_words.utf8", encoding="utf8") as f:
    stopword_list = f.readlines()


# 去除停用词
def remove_stopwords(text):
    tokens = tokenize_text(text)
    filtered_tokens = [token for token in tokens if token not in stopword_list]
    filtered_text = ''.join(filtered_tokens)
    return filtered_text


# 数据预处理
def normalize_corpus(corpus, tokenize=False):
    normalized_corpus = []
    for text in corpus:
        text = remove_special_characters(text)
        text = remove_stopwords(text)
        normalized_corpus.append(text)
        if tokenize:
            text = tokenize_text(text)
            normalized_corpus.append(text)

    return normalized_corpus


def bow_extractor(corpus, ngram_range=(1, 1)):
    vectorizer = CountVectorizer(min_df=1, ngram_range=ngram_range)
    features = vectorizer.fit_transform(corpus)
    return vectorizer, features

    
def tfidf_transformer(bow_matrix):
    transformer = TfidfTransformer(norm='l2',
                                   smooth_idf=True,
                                   use_idf=True)
    tfidf_matrix = transformer.fit_transform(bow_matrix)
    return transformer, tfidf_matrix


def tfidf_extractor(corpus, ngram_range=(1, 1)):
    vectorizer = TfidfVectorizer(min_df=1,
                                 norm='l2',
                                 smooth_idf=True,
                                 use_idf=True,
                                 ngram_range=ngram_range)
    features = vectorizer.fit_transform(corpus)
    return vectorizer, features

    corpus,labels=get_data()  # 获取数据集
print("总的数据量:", len(labels))
corpus, labels = remove_empty_docs(corpus, labels)
# 对数据进行划分
train_corpus, test_corpus, train_labels, test_labels = train_test_split(corpus, labels, test_size=0.3, random_state=42)

norm_train_corpus = normalize_corpus(train_corpus)
norm_test_corpus = normalize_corpus(test_corpus)

bow_vectorizer, bow_train_features = bow_extractor(norm_train_corpus)
bow_test_features = bow_vectorizer.transform(norm_test_corpus)
# tfidf 特征
tfidf_vectorizer, tfidf_train_features = tfidf_extractor(norm_train_corpus)
tfidf_test_features = tfidf_vectorizer.transform(norm_test_corpus)
mnb = MultinomialNB()
lr = LogisticRegression()

mnb.fit(bow_train_features,train_labels)
print("基于词袋模型的多项式朴素贝叶斯模型")
print("训练集得分:",mnb.score(bow_train_features,train_labels))
print("测试集得分:",mnb.score(bow_test_features,test_labels))


mnb.fit(bow_train_features, train_labels)
print("基于词袋模型的逻辑回归模型")
print("训练集得分:", mnb.score(bow_train_features, train_labels))
print("测试集得分:", mnb.score(bow_test_features, test_labels))

mnb.fit(tfidf_train_features, train_labels)
print("基于tfidf的多项式朴素贝叶斯模型")
print("训练集得分:", mnb.score(tfidf_train_features, train_labels))
print("测试集得分:", mnb.score(tfidf_test_features, test_labels))

lr.fit(tfidf_train_features, train_labels)
print("基于tfidf的逻辑回归模型")
print("训练集得分:", lr.score(tfidf_train_features, train_labels))
print("测试集得分:", lr.score(tfidf_test_features, test_labels))

实验结果:

 

【资源介绍】 基于HAM10000数据集实现皮肤癌分类python源码+使用说明.zip 这是一个用于训练图像分类模型的代码。在运行代码之前,用户需要安装以下依赖库:argparse, os, pandas, numpy, PIL, datasets, torchvision, tqdm和transformers。用户还需要从Hugging Face上下载所需的预训练模型。 参数说明 - `--metadata_path`:metadata文件的路径。默认为"./archive/HAM10000_metadata.csv"。 - `--images_dir`:图像文件夹的路径。默认为"./archive/HAM10000_images/"。 - `--model_dir`:预训练模型的路径。默认为"../model/vit-large-patch16-224-in21k"。 - `--checkpoints_dir`:保存检查点文件的文件夹路径。默认为"./checkpoints"。 - `--learning_rate`:学习率。默认为1e-5。 - `--batch_size`:批大小。默认为64。 - `--epochs`:训练轮数。默认为5。 - `--warmup_ratio`:预热步骤的比例。默认为0.1。 - `--split`:训练-验证数据集的分割比例。默认为0.8。 - `--gpu`:指定使用哪张GPU。默认为"0"。 - `--logging_steps`:每隔多少步记录一次训练日志。默认为50。 用户可以在命令行中传递这些参数,例如: ```shell python train-hf.py --metadata_path ./archive/HAM4000_metadata.csv \ --images_dir ./archive/HAM10000_images/ \ --checkpoints_dir ./checkpoints \ --learning_rate 1e-4 \ --batch_size 64 \ --epochs 20 \ --warmup_ratio 0.1 \ --model_dir ../model/vit-large-patch16-224-in21k \ --gpu 5,6,7 \ --logging_steps 1 ``` 在代码运行过程中,会执行以下步骤: 1. 读取metadata文件,获取图像文件名和标签。 2. 将图像读入内存,并随机打乱。 3. 将数据集划分为训练集和验证集。 4. 对图像进行预处理,包括随机裁剪、归一化和转换为tensor。 5. 加载预训练模型,构建分类器。 6. 训练模型,并在验证集上评估模型性能。 7. 在训练过程中,每隔logging_steps步记录一次训练日志,包括损失值、准确率等指标。 8. 在训练结束后,保存模型的权重文件到checkpoints_dir文件夹中。 【备注】 该项目是个人毕设/课设/大作业项目,代码都经过本地调试测试,功能ok才上传,高分作品,可快速上手运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载使用,也欢迎交流学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值