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]] 标签: ['垃圾']