Выявление и классификация спам-сообщений
Введение
Спамовые текстовые сообщения рассылаются базовыми станциями или программами, а вы часто хотите получать нормальные и нужные текстовые сообщения (проснитесь, ни одна девушка вам не признается (буси)). Когда телефон завибрировал, и мне не терпелось открыть его, мое внимание привлекло текстовое сообщение типа «Купите ли вы лотерейный билет?». раздражающий
Поэтому после анализа: должно быть, потому что после получения большого количества спам-смс моя богиня не может отправлять смс за меня, а я до сих пор одинок. Отвратительные текстовые спам-сообщения, сегодня я собираюсь написать код, чтобы наказать вас.
Источник данных: Кубок Тедди.quota.tip DM.org/course/4255…
Общая идея такова:
1, текст удален x
2. Jieba выполняет сегментацию китайских слов
3. Убрать стоп-слово из текста
4. Преобразование списка в строку после удаления (для последующего анализа данных)
5. Текстовые данные и метки разделены
(Вы можете нарисовать облако слов, чтобы сделать анализ текста более понятным) 6. Строка векторизуется TF-IDF для получения каждого слова и частоты каждого слова. (one-hot может знать только есть ли, coutVectorizer знает частоту каждого слова, TF-IDF использует алгоритмы для вычисления слов) TF: количество слов/общее количество слов IDF: log((N+1)/(N(x)+1))+1 N = общее количество текстов в обучающем наборе (количество строк), N(x) = количество текстов, содержащих слово x (количество строк, содержащих x) Алгоритм TF-IDF — это TF*IDF.
7. После того, как данные структурированы, делайте прогнозы с помощью машинного обучения
базовая обработка данных
import pandas as pd
import re
import jieba
def data_process(file='message80W1.csv'):
data = pd.read_csv(file, header=None, index_col=0)
data.columns = ['label', 'message']
n = 5000
a = data[data['label'] == 0].sample(n) #获取5000个非垃圾短信样本
b = data[data['label'] == 1].sample(n) #获取5000个垃圾短信样本
data_new = pd.concat([a, b], axis=0) #合并行合并 一个在上一个在下
data_dup = data_new['message'].drop_duplicates()#去除重复列
data_qumin = data_dup.apply(lambda x: re.sub('x', '', x))#去除data_dup中每一个样本的的x字符 换成' '
jieba.load_userdict('newdic1.txt')#加载自定义文库 给结巴添加特有词语
data_cut = data_qumin.apply(lambda x: jieba.lcut(x))#切分中文词语 lcut参数cut_all默认为False 如果写为True那么就变为全模式 会有重复的词
stopWords = pd.read_csv('stopword.txt', encoding='GB18030', sep='hahaha', header=None) #读取文本 sep指定分隔符为'hahaha' 默认为,
stopWords = ['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–'] + list(stopWords.iloc[:, 0]) #添加停用词
data_after_stop = data_cut.apply(lambda x: [i for i in x if i not in stopWords]) #如果在停用词里面 那么就删除
labels = data_new.loc[data_after_stop.index, 'label']#index是行名 形成一个只有标签的dataframe
adata = data_after_stop.apply(lambda x: ' '.join(x))#将列表转化为字符串 分隔为' '
return adata, data_after_stop, labels #data_after_stop是列表 adata是字符串 labels是标签
предсказание исхода
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
adata, data_after_stop, lables = data_process()#获得结构化之后的数据
data_tr, data_te, labels_tr, labels_te = train_test_split(adata, lables, test_size=0.2)#进行测试集和训练集的划分
countVectorizer = CountVectorizer()
data_tr = countVectorizer.fit_transform(data_tr)#仅仅考虑词频 每个词出现一次 数值加一
X_tr = TfidfTransformer().fit_transform(data_tr.toarray()).toarray()#使用TF-IDF进行计算
data_te = CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_te)#vocabulary=countVectorizer.vocabulary_为了保持上面相同的向量列数
X_te = TfidfTransformer().fit_transform(data_te.toarray()).toarray()#不toarray()的话 出现的是告诉你哪个位置是什么数值
model = MLPClassifier()#神经网络模型的构建
model.fit(X_tr, labels_tr)#放入训练集数据
model.score(X_te, labels_te)#测试集数据进行跑分
Нейронная сеть здесь вызывает параметры по умолчанию.Если вам нужны лучшие результаты, вы можете настроить параметры или использовать другие модели.
Сравнительные результаты
рисунок облака слов
#绘制词云
from data_process import data_process
from wordcloud import WordCloud
import matplotlib.pyplot as plt
adata, data_after_stop, labels = data_process()
word_fre = {}
for i in data_after_stop[labels == 1]:#遍历data标签为1的(列表)
for j in i:
if j not in word_fre.keys():#keys为键名 不含这个键名就建立一个
word_fre[j] = 1
else:
word_fre[j] += 1
mask = plt.imread('duihuakuan.jpg')#添加图标
wc = WordCloud(mask=mask, background_color='white', font_path=r'C:\Windows\Fonts\simhei.ttf')#绘制词云 图片和背景颜色以及文字的格式设置
wc.fit_words(word_fre)#添加字典
plt.imshow(wc)#画图
Если цикл for равен 1, это означает облако слов из спам-текстовых сообщений, а если он равен 0, это означает облако слов из обычных текстовых сообщений. Сложность здесь заключается в настройке параметра font_path Требуется отображаемый шрифт
Суммировать
Используя идентификацию спам-текстовых сообщений, богиня немедленно свяжется со мной~~