朴素贝叶斯的详解和文本分类python样例实现

朴素贝叶斯的详解和文本分类python样例实现

算法详解

在了解朴素贝叶斯算法之前,不妨来看看贝叶斯公式:

在这里插入图片描述

推导如下:

已知条件概率公式如下:

 />

而p(a,b)=p(b,a) (此处为联合概率,即a,b同时发生的概率)

该公式转化如下:
在这里插入图片描述

可以简单的理解为 b发生时a的概率(先验概率) 可以通过a发生时b的概率(后验概率)进行计算

那么在进行特征分类的过程中,我们大部分时候是输入各个特征的值 得到一个分类 。

编号色泽根蒂敲声纹理脐部触感密度含糖率好瓜?
1
2
3

可以看到的是 对于每一个特征值 可能存在不同的 数量不定的具体特征,例如色泽可以包括 青绿 暗绿 各种绿 。 那么不同的特征值会对我们最后的结果(是不是好瓜)有所影响,而我们可以反过来通过好瓜发生时各个特征出现的概率,从而得到好瓜大部分时候具有什么特征(例如纹理明显,色泽暗绿),从而反过来计算当各个特征出现时,是不是好瓜的概率,即:

xi表示一个特征值,X表示这个样例的所有特征,y表示最后的结果的取值。

其中 朴素贝叶斯将各个特征看作是,互不干扰,独立的个体,因此我们单独计算概率。即:

文本分类的python代码实现

前面提到了朴素贝叶斯是基于特征进行分类的,那么对于文本,我们应该怎么将其转化为特征值是分类的正确率的关键,本次分类我采用是是布袋模型,具体如下:

布袋模型中有一种单独考虑某个单词是否在文本中出现的情况 ,若该单词出现,则对应位置的特征值应该是True,反之则为False。

#加载数据
from nltk import word_tokenize
from sklearn.naive_bayes import BernoulliNB
def getDataest(FILE_PATH):
    data = open(FILE_PATH, 'r')
    dataclasses = []
    datatext = []
    while 1:
        dataline = data.readline()
        if not dataline:
            break
        dataline = word_tokenize(dataline)
        dataclasses.append(dataline[0])
        datatext.append(dataline[1:-1])
    return dataclasses, datatext

本文采用word_torkenize()进行分词,读者可以自行下载导入nlkt库文件

dataclasses, datatext = getDataest("SMSSpamCollection.txt")
div = {}
for i in datatext:
    for word in i:
        if word in div.keys():
            div[word] += 1
        else:
            div[word] = 1
for name in list(div.keys()):
    if div[name] < 100:
        div.pop(name)
datafirgue = [[1 for col in range(len(div))] for row in range(len(datatext))]
for i in range(len(datatext)):
    position = int(0)
    for word in div.keys():
        if word in datatext[i]:
            datafirgue[i][position] = 2
        position += 1

分词之后,应当创建一个总的单词表,考虑到计算量太大的问题,本文只选择了在数据集中出现了100次以上的单词,多余的进行清除。

随后,应当通过单词表进行特征值的创建。考虑到防止出现某个特征值概率为0的出现,设置了初始量为1,存在则为2。

最后就是切割数据集,创建模型并训练

#切割数据集
train_feature=datafirgue[:int(0.8*len(datafirgue))]
train_lables=dataclasses[:int(0.8*len(datafirgue))]
test_feature=datafirgue[int(0.8*len(datafirgue)):]
test_labels=dataclasses[int(0.8*len(datafirgue)):]


#训练
clf = MultinomialNB(alpha=0.001).fit(train_feature, train_lables)

predicted_labels=clf.predict(test_feature)

print('准确率为:', metrics.accuracy_score(test_labels, predicted_labels))

以上就是本文全部内容。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用朴素贝叶斯算法进行垃圾邮件分类的完整代码,供您参考。 ```python import os import random import math from collections import defaultdict # 定义停用词列表 stopwords = ['a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from', 'has', 'he', 'in', 'is', 'it', 'its', 'of', 'on', 'that', 'the', 'to', 'was', 'were', 'will', 'with'] # 定义数据集路径 data_path = 'data' # 定义分类类别 categories = ['ham', 'spam'] # 定义训练数据和测试数据的比例 train_ratio = 0.8 # 定义词袋模型 bag_of_words = defaultdict(int) # 定义类别计数 category_count = defaultdict(int) # 定义条件计数 condition_count = defaultdict(lambda: defaultdict(int)) # 定义训练集和测试集 train_data = [] test_data = [] def load_data(): """ 加载数据集 """ for category in categories: folder_path = os.path.join(data_path, category) files = os.listdir(folder_path) for file_name in files: file_path = os.path.join(folder_path, file_name) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: content = f.read() data = {'category': category, 'content': content} if random.random() < train_ratio: train_data.append(data) else: test_data.append(data) def preprocess_data(data): """ 预处理数据 """ words = [] content = data['content'] for word in content.split(): word = word.strip().lower() if word.isalpha() and word not in stopwords: words.append(word) return {'category': data['category'], 'words': words} def train(): """ 训练模型 """ for data in train_data: preprocessed_data = preprocess_data(data) category = preprocessed_data['category'] words = preprocessed_data['words'] category_count[category] += 1 for word in words: bag_of_words[word] += 1 condition_count[category][word] += 1 def predict(data): """ 预测分类 """ words = preprocess_data(data)['words'] scores = {category: math.log(category_count[category] / len(train_data)) for category in categories} for word in words: if word in bag_of_words: for category in categories: score = math.log(condition_count[category][word] + 1) - math.log(bag_of_words[word] + len(bag_of_words)) scores[category] += score return max(scores, key=scores.get) def evaluate(): """ 评估模型 """ correct = 0 for data in test_data: predicted_category = predict(data) if predicted_category == data['category']: correct += 1 accuracy = correct / len(test_data) print(f"Accuracy: {accuracy:.2f}") if __name__ == '__main__': load_data() train() evaluate() ``` 以上就是使用朴素贝叶斯算法进行垃圾邮件分类的完整代码,代码中包括数据加载、数据预处理、模型训练、预测分类和模型评估等步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值