Scikit-learn朴素贝叶斯方法简单文本处理(垃圾邮件分类和情感分类)

参考链接:

  • http://blog.lisp4fun.com/2018/03/09/bayes
  • https://www.kaggle.com/nnitiwe/spam-detection-with-sklearn
    数据集:
  • spam.csv 在kaggle网站下载
  • ChnSentiCorp情感分析酒店:https://pan.baidu.com/s/1hsF1Zbm

垃圾邮件分类

'''
垃圾邮件识别
'''
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 【1】 读取数据
spam_file = r"E:\机器学习数据集\sms-spam-collection-dataset\spam.csv"
to_drop=['Unnamed: 2','Unnamed: 3','Unnamed: 4']
df = pd.read_csv(spam_file, engine='python')
df.drop(columns=to_drop,inplace=True)

df['encoded_label']=df.v1.map({'spam':0,'ham':1})
print(df.head())

# 【2】 数据处理
# split into train and test
train_data, test_data, train_label, test_label = train_test_split(
    df.v2,
    df.encoded_label,
    test_size=0.7,
    random_state=0)  # df.v2是邮件内容,df.v1是邮件标签(ham和spam)


# 使用CountVectorizer将句子转化为向量
c_v = CountVectorizer(decode_error='ignore')
train_data = c_v.fit_transform(train_data)
test_data = c_v.transform(test_data)

# plt.matshow(train_data.toarray())
# plt.show()

# 朴素贝叶斯算法训练预测
from sklearn import naive_bayes as nb
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix


clf=nb.MultinomialNB()
model=clf.fit(train_data, train_label)
predicted_label=model.predict(test_data)
print("train score:", clf.score(train_data, train_label))
print("test score:", clf.score(test_data, test_label))
print("Classifier Accuracy:",accuracy_score(test_label, predicted_label))
print("Classifier Report:\n",classification_report(test_label, predicted_label))
print("Confusion Matrix:\n",confusion_matrix(test_label, predicted_label))

结果如下:
在这里插入图片描述

ChnSentiCorp酒店评价数据文本分析

'''
读取文本数据集ChnSentiCorp情感分析酒店评论,将其转化为词向量
'''
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os
import pathlib
# 【1】 读取数据
data_dir = r"D:\Datasets\ChnSentiCorp情感分析酒店评论"

def read_files_from_dir(dir):
    '''
    从文件夹中读取ChnSentiCorp情感分析酒店评论数据,返回文件路径和标签
    '''
    file_names = []
    labels = []
    for roots, dirs, files in os.walk(dir):
        for directory in dirs: # 子目录
            new_dir = os.path.join(dir,directory)
            for _,_, files in os.walk(new_dir):
                for file in files:
                    file_names.append(os.path.join(new_dir,file))
                    labels.append(directory)


    return [file_names, labels]

files_path,labels = read_files_from_dir(data_dir)
print(files_path[0])

# 将文本标签转换至数值标签
from sklearn.preprocessing import LabelEncoder
# 构建编码器
le = LabelEncoder()
# 编码
labels = le.fit_transform(labels)


def read_data(files_path):
    '''
    从含文本路径的列表数据中读取文本内容
    '''
    data = []
    for file in files_path:
        p = pathlib.Path(file)
        data.append(p.read_text(encoding='utf-8'))

    return data

data = read_data(files_path)
# 判断数据和标签数量是否一致
assert(len(labels)==len(data))

# 【2】 数据处理

# 打乱数据
data, labels = shuffle(data,labels)
# split into train and test
train_data, test_data, train_label, test_label = train_test_split(
    data,
    labels,
    test_size=0.2,
    random_state=0)


# 【3】 使用CountVectorizer将句子转化为向量
c_v = CountVectorizer(decode_error='ignore')
train_data = c_v.fit_transform(train_data)
test_data = c_v.transform(test_data)

# plt.matshow(train_data.toarray())
# plt.show()

# 【4】 朴素贝叶斯算法训练预测
from sklearn import naive_bayes as nb
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix


clf=nb.MultinomialNB()
model=clf.fit(train_data, train_label)
predicted_label=model.predict(test_data)
print("train score:", clf.score(train_data, train_label))
print("test score:", clf.score(test_data, test_label))
print("Classifier Accuracy:",accuracy_score(test_label, predicted_label))
print("Classifier Report:\n",classification_report(test_label, predicted_label))
print("Confusion Matrix:\n",confusion_matrix(test_label, predicted_label))

结果如下:
在这里插入图片描述
从结果可以看出在这项任务中朴素贝叶斯方法的表现一般,分类器只获得了80%左右的准确率。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scikit-learn库提供了多种贝叶斯分类器的实现,包括高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。这里以高斯朴素贝叶斯分类器为例,介绍如何使用Scikit-learn库实现贝叶斯分类。 1. 数据准备 首先,我们需要准备一些分类数据。这里使用Scikit-learn库自带的鸢尾花数据集。代码如下: ```python from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` 2. 数据预处理 在使用贝叶斯分类器之前,需要对数据进行预处理。这里我们使用Scikit-learn库的数据预处理工具preprocessing中的StandardScaler类进行标准化处理。代码如下: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X) ``` 3. 构建模型 接下来,我们可以使用Scikit-learn库的GaussianNB类构建高斯朴素贝叶斯分类器。代码如下: ```python from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() ``` 4. 模型训练 模型构建完成后,我们需要使用训练数据对模型进行训练。代码如下: ```python gnb.fit(X, y) ``` 5. 模型预测 训练完成后,我们可以使用模型对新的数据进行分类预测。代码如下: ```python y_pred = gnb.predict(X) ``` 6. 模型评估 最后,我们可以使用Scikit-learn库的metrics中的accuracy_score函数计算模型的准确率。代码如下: ```python from sklearn.metrics import accuracy_score accuracy = accuracy_score(y, y_pred) print('Accuracy:', accuracy) ``` 完整代码如下: ```python from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 数据准备 iris = load_iris() X = iris.data y = iris.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 构建模型 gnb = GaussianNB() # 模型训练 gnb.fit(X, y) # 模型预测 y_pred = gnb.predict(X) # 模型评估 accuracy = accuracy_score(y, y_pred) print('Accuracy:', accuracy) ``` 注意,这里为了简化代码,使用训练数据进行了模型评估。在实际应用中,应该使用测试数据进行模型评估,以避免过拟合问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值