请用Python给我写一个基于神经网络的垃圾短信分类的代码
时间: 2024-06-08 13:12:07 浏览: 157
使用Python做垃圾分类的原理及实例代码附
好的,这里是一个基于神经网络的垃圾短信分类的 Python 代码,使用了 Keras 框架和 TensorFlow 后端:
```python
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
# 加载数据集
data = pd.read_csv('spam.csv', encoding='latin-1')
data = data[['v1', 'v2']]
data = data.rename(columns={'v1': 'label', 'v2': 'text'})
data['label'] = np.where(data['label'] == 'spam', 1, 0)
# 划分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# 预处理文本
max_words = 10000
max_len = 150
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(train_data['text'])
train_seqs = tokenizer.texts_to_sequences(train_data['text'])
test_seqs = tokenizer.texts_to_sequences(test_data['text'])
train_seqs = pad_sequences(train_seqs, maxlen=max_len)
test_seqs = pad_sequences(test_seqs, maxlen=max_len)
# 构建模型
model = Sequential()
model.add(Embedding(max_words, 128))
model.add(Bidirectional(LSTM(64, return_sequences=True)))
model.add(Dropout(0.2))
model.add(Bidirectional(LSTM(64)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(train_seqs, train_data['label'], epochs=5, batch_size=32)
# 评估模型
y_pred = model.predict_classes(test_seqs)
acc = accuracy_score(test_data['label'], y_pred)
f1 = f1_score(test_data['label'], y_pred)
print('Accuracy:', acc)
print('F1-score:', f1)
```
其中,数据集文件 `spam.csv` 可以从 Kaggle 上下载,链接为:https://www.kaggle.com/uciml/sms-spam-collection-dataset。这个数据集包含 5572 条短信,其中 747 条是垃圾短信。
在这个代码中,我们首先加载数据集,将标签转换为 0/1 类型。然后,我们使用 `Tokenizer` 类将文本转换为数字序列,并使用 `pad_sequences` 函数将所有数字序列填充到相同的长度。接着,我们使用 `Sequential` 类构建模型,其中包含一个嵌入层(用于将数字序列转换为密集向量)、两个双向 LSTM 层(用于处理序列数据)和一个全连接层(用于输出分类结果)。模型使用二元交叉熵作为损失函数,用 Adam 优化器进行训练,并使用准确率作为评估指标。最后,我们训练模型并在测试集上评估模型性能。
这个代码只是一个简单的示例,可以通过调整模型结构、超参数等进一步提高分类性能。
阅读全文