本章主要以SMS Spam Collection数据集 为例介绍骚扰短信的识别技术。介绍识别骚扰短信使用的征提取方法,包括词袋和TF-IDF模型、词汇表模型以及Word2Vec和Doc2Vec模型,介绍使用的模型以及对应的验证结果,包括朴素贝叶斯、支持向量机、XGBoost和MLP算法。这一节与第六章的垃圾邮件、第七章的负面评论类似、只是识别的内容变为了骚扰短信,均为2分类问题。
测试数据来自SMS Spam Collection数据集,SMS Spam Collection是用于骚扰短信识别的经典数据集,完全来自真实短信内容,包括4831条正常短信和747条骚扰短信。从官网下载数据集压缩包并解压,正常短信和骚扰短信保存在一个文本文件中。 如下所示,下图中的SMSSpamCollection.txt文件即为测试数据集。
逐行读取数据文件SMSSpamCollection.txt,由于每行数据都由标记和短信内容组成,两者之间使用制表符分割,所以可以通过split函数进行切分,直接获取标记和短信内容:
def load_all_files():
x=[]
y=[]
datafile="../data/sms/smsspamcollection/SMSSpamCollection.txt"
with open(datafile, encoding='utf-8') as f:
for line in f:
line=line.strip('\n')
label,text=line.split('\t')
x.append(text)
if label == 'ham':
y.append(0)
else:
y.append(1)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4)
return x_train, x_test, y_train, y_test
调用源码如下所示:
x_train, x_test, y_train, y_test=load_all_files()
(一)词集(词汇表)模型
向量化模型分为词集(词汇表)和词袋模型。后者统计了词汇出现的频率,而词汇表模型则使用生成的词汇表对原有句子按照单词逐个进行编码,具体处理如下:
def get_features_by_tf():
global max_document_length
x_train, x_test, y_train, y_test=load_all_files()
vp=tflearn.data_utils.VocabularyProcessor(max_document_length=max_document_length,
min_frequency=0,
vocabulary=None,
tokenizer_fn=None)
x_train=vp.fit_transform(x_train, unused_y=None)
x_train=np.array(list(x_train))
x_test=vp.transform(x_test)
x_test=np.array(list(x_test))
return x_train, x_test, y_train, y_test
1.train[0]举例
这里对train[0]进行示例,演示词汇表模型的处理过程,首先是第一步
And stop being an old man. You get to build snowman snow angels and snowball fights.
经过词汇表处理后
vp=tflearn.data_utils.VocabularyProcessor(max_document_length=max_document_length,
min_frequency=0,
vocabulary=None,
tokenizer_fn=None)
x_train=vp.fit_transform(x_train, unused_y=None)
此时的train[0]结果为
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
2.train[1]举例
这里选择train[1]再次举例,处理前如下所示
What's ur pin?
在词汇表处理后,其结果如下
[17 18 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
(二)词袋模型
def get_features_by_wordbag():
global max_features
x_train, x_test, y_train, y_test=load_all_files()
vectorizer = CountVectorizer(
decode_error='ignore',
strip_accents='ascii',
max_features=max_features,
stop_words='english',
max_df=1.0,
min_df=1 )
print (vectorizer)
x_train=vectorizer.fit_transform(x_train)
x_train=x_train.toarray()
vocabulary=vectorizer.vocabulary_
vectorizer = CountVectorizer(
decode_error='ignore',
strip_accents='ascii',
vocabulary=vocabulary,
stop_words='english',
max_df=1.0,
min_df=1 )
print (vectorizer)
x_test=vectorizer.fit_transform(x_test)
x_test=x_test.toarray()
return x_train, x_test, y_train, y_test
这部分的举例参考 《Web安全之深度学习实战》笔记:第八章 骚扰短信识别(2)中TF-IDF处理逻辑。
note:本章节内容较多,笔记分为一个系列,后续参考专栏中相应内容。