您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python中怎么使用朴素贝叶斯进行垃圾短信识别
## 目录
1. [引言](#引言)
2. [朴素贝叶斯算法原理](#朴素贝叶斯算法原理)
3. [数据准备与预处理](#数据准备与预处理)
4. [特征工程](#特征工程)
5. [模型构建与训练](#模型构建与训练)
6. [模型评估与优化](#模型评估与优化)
7. [完整代码示例](#完整代码示例)
8. [总结与扩展](#总结与扩展)
---
## 引言
在数字化时代,垃圾短信(Spam SMS)已成为困扰用户的主要问题之一。通过机器学习技术自动识别垃圾短信是当前主流的解决方案,其中**朴素贝叶斯(Naive Bayes)**因其简单高效、适合文本分类任务的特点,成为广泛应用的算法之一。本文将详细介绍如何使用Python实现基于朴素贝叶斯的垃圾短信分类器。
---
## 朴素贝叶斯算法原理
朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法。其核心公式为:
$$
P(y|x_1, x_2, ..., x_n) = \frac{P(y) \prod_{i=1}^n P(x_i|y)}{P(x_1, x_2, ..., x_n)}
$$
- **优点**:计算效率高,适合高维数据(如文本)。
- **缺点**:假设特征独立(实际中可能不成立)。
### 文本分类中的两种变体
1. **多项式朴素贝叶斯(MultinomialNB)**:适用于词频统计。
2. **伯努利朴素贝叶斯(BernoulliNB)**:适用于二值化特征。
---
## 数据准备与预处理
### 1. 数据集介绍
使用公开数据集[SMS Spam Collection](https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection),包含5574条标注为"ham"(正常)或"spam"(垃圾)的短信。
### 2. 数据加载
```python
import pandas as pd
df = pd.read_csv('SMSSpamCollection', sep='\t', names=['label', 'text'])
print(df.head())
import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
def clean_text(text):
text = text.lower()
text = re.sub(r'[^\w\s]', '', text)
tokens = word_tokenize(text)
tokens = [word for word in tokens if word not in stopwords.words('english')]
return ' '.join(tokens)
df['cleaned_text'] = df['text'].apply(clean_text)
将文本转换为数值特征,常用方法: - 词袋模型(Bag of Words) - TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=5000)
X = tfidf.fit_transform(df['cleaned_text']).toarray()
y = df['label'].map({'ham': 0, 'spam': 1})
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
选择MultinomialNB
(更适合词频统计):
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train, y_train)
sample_text = "WIN FREE PRIZE! CLICK NOW"
cleaned_sample = clean_text(sample_text)
vectorized_sample = tfidf.transform([cleaned_sample])
prediction = model.predict(vectorized_sample)
print("SPAM" if prediction[0] == 1 else "HAM")
from sklearn.metrics import classification_report, confusion_matrix
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
max_features
, ngram_range
)BernoulliNB
)class_prior
)# 使用二元语法(bigram)
tfidf_bi = TfidfVectorizer(ngram_range=(1,2), max_features=8000)
X_bi = tfidf_bi.fit_transform(df['cleaned_text'])
# 环境准备
!pip install nltk pandas scikit-learn
import pandas as pd
import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
# 数据加载与清洗
df = pd.read_csv('SMSSpamCollection', sep='\t', names=['label', 'text'])
stop_words = set(stopwords.words('english'))
def clean_text(text):
text = text.lower()
text = re.sub(r'[^\w\s]', '', text)
tokens = word_tokenize(text)
tokens = [word for word in tokens if word not in stop_words]
return ' '.join(tokens)
df['cleaned_text'] = df['text'].apply(clean_text)
# 特征工程
tfidf = TfidfVectorizer(max_features=5000)
X = tfidf.fit_transform(df['cleaned_text'])
y = df['label'].map({'ham':0, 'spam':1})
# 模型训练
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = MultinomialNB()
model.fit(X_train, y_train)
# 评估
print(classification_report(y_test, model.predict(X_test)))
通过本文的实践,读者可以快速构建一个基础的垃圾短信过滤器,并在此基础上进一步优化以适应实际场景需求。 “`
注:实际运行时需确保已安装
nltk
库并下载停用词资源:import nltk nltk.download('stopwords') nltk.download('punkt')
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。