《垃圾邮件识别器》(五)Scikit-Learn

Scikit-Learn 是一个用于机器学习和数据分析的 Python 库,它提供了各种用于数据预处理、特征工程、模型选择、模型训练和模型评估的工具和算法。我们使用到的朴素贝叶斯算法实现,以及文本特征提取等操作都可以使用该机器学习库来完成。

pip install scikit-learn
pip install jieba

1. 文本数值化

首先,使用 jieba 进行文本分词;
其次,使用 CountVectorizer 进行词表训练;
最后,将输入文本转换为数值表示。

import jieba
from sklearn.feature_extraction.text import CountVectorizer
import pickle


# 文本数值化
def test():

    texts = ['您中奖了!点击链接领取您的百万大奖。',
             '免费试用我们的产品,不满意全额退款。',
             '您的银行账户需要紧急验证,请点击以下链接。',
             '会议通知:下周的会议安排。',
             '我在超市买了一些食物。',
             '明天我们将一起庆祝生日。']

    # 首先分词,然后使用空格隔开每一个词,组成新的文本
    words = [' '.join(jieba.lcut(text)) for text in texts]
    # 读取停用词
    stops = [word.strip() for word in open('stopwords.txt', encoding='utf-8')]

    # 初始化向量化器
    cv = CountVectorizer(stop_words=stops)
    # 生成特征词词表
    cv.fit(words)
    print('特征词:\n', cv.get_feature_names_out())

    # 文本转换为向量
    result = cv.transform(words)
    print('数值化:\n', result.toarray())

    # 存储特征提取器
    pickle.dump(cv, open('count_vectorizer.pkl', 'wb'))
    # 存储数值化文本
    pickle.dump(result, open('train.data', 'wb'))


if __name__ == '__main__':
    test()
特征词:
 ['一起' '下周' '中奖' '产品' '以下' '会议' '免费' '全额' '大奖' '安排' '庆祝' '明天' '满意' '点击'
 '生日' '百万' '紧急' '试用' '账户' '超市' '退款' '通知' '银行' '链接' '需要' '领取' '食物' '验证']
数值化:
 [[0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0]
 [0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1]
 [0 1 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0]
 [1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]]

2. 朴素贝叶斯训练

import pickle
from sklearn.naive_bayes import MultinomialNB
import numpy as np
from sklearn.metrics import accuracy_score



def test():

    # 加载训练数据
    inputs = pickle.load(open('train.data', 'rb')).toarray()
    labels = ['垃圾', '垃圾', '垃圾', '正常', '正常', '正常']

    # 初始化算法模型
    # alhpa 表示拉普拉斯平滑系数
    # fit_prior 表示训练先验概率
    # class_prior 提供的各个类别的先验概率
    estimator = MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

    # 训练算法模型
    estimator.fit(inputs, labels)

    # 算法模型评估
    y_preds = estimator.predict(inputs)
    score = accuracy_score(labels, y_preds)

    print('标签:', y_preds)
    print('准确率:', score)

    # 算法模型保存
    pickle.dump(estimator, open('bayes.pkl', 'wb'))


if __name__ == '__main__':
    test()
标签: ['垃圾' '垃圾' '垃圾' '正常' '正常' '正常']
准确率: 1.0

3. 朴素贝叶斯推理

import pickle
from sklearn.naive_bayes import MultinomialNB
import numpy as np
from sklearn.metrics import accuracy_score
import jieba


def test():

    # 待预测数据
    inputs = ['您的百万大奖正在等待您的领取。']

    # 1. 文本数值化
    words = [' '.join(jieba.lcut(text)) for text in inputs]
    extractor = pickle.load(open('count_vectorizer.pkl', 'rb'))
    inputs = extractor.transform(words).toarray()
    print(inputs)

    # 2. 算法模型推理
    estimator = pickle.load(open('bayes.pkl', 'rb'))
    y_preds = estimator.predict(inputs)

    # 输出预测标签
    print('标签:', y_preds)


if __name__ == '__main__':
    test()
[[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0]]
标签: ['垃圾']
未经允许不得转载:一亩三分地 » 《垃圾邮件识别器》(五)Scikit-Learn
评论 (0)

6 + 2 =