溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中怎么使用樸素貝葉斯進行垃圾短信識別

發布時間:2021-11-29 09:35:18 來源:億速云 閱讀:933 作者:iii 欄目:大數據
# 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())

3. 數據清洗

  • 轉換為小寫
  • 移除標點符號和特殊字符
  • 分詞與停用詞過濾
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)

特征工程

1. 文本向量化

將文本轉換為數值特征,常用方法: - 詞袋模型(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})

2. 數據集劃分

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)

模型構建與訓練

1. 模型選擇

選擇MultinomialNB(更適合詞頻統計):

from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
model.fit(X_train, y_train)

2. 預測示例

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")

模型評估與優化

1. 基礎評估指標

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))

2. 優化方向

  • 調整TF-IDF參數(如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)))

總結與擴展

關鍵點總結

  1. 文本預處理對性能影響顯著
  2. TF-IDF通常優于純詞頻統計
  3. 樸素貝葉斯在小型數據集上表現優異

擴展方向

  • 結合深度學習(如LSTM)
  • 部署為API服務(使用Flask/FastAPI)
  • 支持多語言分類(需更換分詞器和停用詞)

通過本文的實踐,讀者可以快速構建一個基礎的垃圾短信過濾器,并在此基礎上進一步優化以適應實際場景需求。 “`

注:實際運行時需確保已安裝nltk庫并下載停用詞資源:

import nltk
nltk.download('stopwords')
nltk.download('punkt')
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女