NLP作业02:课程设计报告

这个作业属于那个课程自然语言处理
这个作业要求在哪里NLP作业02:课程设计报告-CSDN社区
我在这个课程的目标是为继续该方面的学习打下基础
这个作业在那个具体方面帮助我实现目标中文分词
参考文献

项目二实验指导书

报告内容分为设计目的、设计要求、设计内容、设计过程、设计体会5个部分,具体说下:

1.设计目的

通过课程设计的练习,加深学生对所学自然语言处理的理论知识与操作技能的理解和掌握,使得学生能综合运用所学理论知识和操作技能进行实际工程项目的设计开发,让学生真正体会到自然语言处理算法在实际工程项目中的具体应用方法,为今后能够独立或协助工程师进行人工智能产品的开发设计工作奠定基础。通过综合应用项目的实施,培养学生团队协作沟通能力,培养学生运用现代工具分析和解决复杂工程问题的能力;引导学生深刻理解并自觉实践职业精神和职业规范;培养学生遵纪守法、爱岗敬业、诚实守信、开拓创新的职业品格和行为习惯。

2.设计要求

2.1 实验仪器及设备

  1. 使用64位Windows操作系统的电脑。
  2. 使用3.8.5版本的Python。
  3. 使用jupyterlab编辑器。
  4. 使用 jieba, matplotlib,pandas……

2.2 设计要求

课程设计的主要环节包括课程设计作品和课程设计报告的撰写。课程设计作品的完成主要包含方案设计、计算机编程实现、作品测试几个方面。课程设计报告主要是将课程设计的理论设计内容、实现的过程及测试结果进行全面的总结,把实践内容上升到理论高度。

3.设计内容

  随着通讯时代的到来,手机成为人们日常通讯必不可少的工具之一。手机短信也以其操作简单、 方便快捷等诸多优点,逐渐成为用户间沟通的重要桥梁,但在为人们带来极大便利的同时,随之而来 的诸多垃圾短信问题日益严峻,广告信息、欺诈短信、谣言散布等短信内容,严重危害了社会公共安全。垃圾短信泛滥,已经严重影响到人们正常生活、运营商形象乃至社会稳定,也是亟待解决的问题。因此如何准确迅速识别垃圾短信成了我此次课程设计的课题。

本设计项目为基于文本内容的垃圾短信的识别。利用自然语言处理、机器学习、数据挖掘等方面的知识解决垃圾短信识别。大概流程如下:

(1)数据预处理:对短信数据进行清洗、分词、去除停用词等预处理操作,使得数据能够被模型所使用。

(2)特征提取:从短信文本中提取特征,如词频、TF-IDF、n-gram等特征,为后续的分类模型训练做准备。

(3)分类模型训练:使用机器学习算法,如朴素贝叶斯训练分类模型,并对模型进行评估和优化。

(4)系统实现:将以上三个环节结合起来,实现一个基于文本内容的垃圾短信识别系统。

4.设计过程

4.1 任务描述 

面对激烈的市场竞争,各大运营商及相关部门都在寻求一种快速、有效的垃圾短信识别方法。通过垃圾短信的精准识别,以完善用户的通讯环境,为有关部门提供有效依据,维护运营商利益。试通过建立合理的短信识别模型,对垃圾短信进行识别,解决运营商和手机用户等困扰。

4.2 任务分析 

基于短信文本内容的垃圾短信识别的方法和步骤主要包括以下 3 个步骤。

(1)分析垃圾短信识别的背景,明确分析目标。

(2)垃圾短信识别的分析过程和方法。

(3)对垃圾短信识别的文本梳理流程和分类模型构建步骤进行梳理。

4.3 任务设计

垃圾短信识别 的总体流程如 图 4-1 所示,主要包括以下步骤。

(1)数据抽取,抽取所需数据集;

(2)数据预处理,对数据进行文本去重、中文分词、停用词过滤处理;

(3)建模准备,将分词结果分别转换成文档- 词条矩阵,并划分测试集与训练集;

(4)模型构建与评价,构建支持向量机模型,并建立评价指标精确率、召回率、F1 值对模型分类效果进行评价;

(5)模型优化与分析结果,总结和建议。

4.4 任务实现

4.4.1 短信文本数据存在的问题

通过对原始数据表格的排查发现,数据中存在空格、Tab 键、以及很多脱敏导致的 x 序列,这些数据对于结果分析都是无意义的,故在后续的数据处理过程需要架将它们处理干净。 

4.4.2 正负样本分布情况

数据通过判定列分辨是否为垃圾短信,而建模分析的方法为分类方法,此法要保证正负样本的数量偏差不宜相差太大,故先对正负样本的样本量分布做简单的分布分析。正负样本量分布极不均衡,垃圾短信占比只有10%,相对于正常短信数量较少,后续建模分析应进行随机抽样保证正负样本的均衡。

4.4.3 文本数据清洗

由于数据采集、保存或是短信大范围重复发送等问题,在大多数情况下,不同用户之间的短信都不会出现完全重复,如果出现了不同用户之间的短信完全重复,这些短信一般都是毫无意义的。这种短信显然只有一条短信文本有意义(即只保留一条)。部分短信相似程度极高,可是在某些词语的运用上存在差异。此类短信可归为重复,但若是删除文字相近评论,则会出现误删的情况。由于相近的短信也存在不少有用的信息,去除这类短信显然不合适。因此,为了存留更多的有用语料,本节针对完全重复的语料下手,仅删除完全重复部分,以确保尽可能保留有用的短信文本信息。因此我们可以对数据进行去重复以降低数据处理和建模过程的复杂度,此处由于数据量过大先抽取部分数据做代码演示。

通过人工发现,数据中存在空格、Tab 键、回车键、以及很多脱敏导致的 x 序列,这些数据对于结果分析都是无意义的,故在后的数据处理过程需要架将它们处理干净。

可以看出,剔除了特殊字符之后数据只保留了干净的文字,清洗工作初见成效。特殊字符的处理过程。

4.4.4 Jieba 中文分词

分词是文本信息处理的基础环节,是将一个单词序列切分成一个一个单词的过程。准确的分词可以极大的提高计算机对文本信息的是被和理解能力。相反,不准确的分词将会产生大量的噪声,严重干扰计算机的识别理解能力,并对这些信息的后续处理工作产生较大的影响。使用 Jieba 库进行中文文本的分词。

4.4.5 去除停用词

停用词(Stop Words ),词典译为“电脑检索中的虚字、非检索用字”。在 SEO 搜索引擎中,为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这 些字或词即被称为停用词。停用词一定程度上相当于过滤词(Filter Words ),区别是过滤词的范围更大一些,包含情色、政治等敏感信息的关键词都会被视做过滤词加以处理,停用词本身则没有这个限制。使用停用词表进行去停用词。

4.4.6 绘制正常短信和垃圾短信的词云图

词云图是文本结果展示的有利工具,通过词云图的展示可以对短信文本数据分词后的高频词予以视觉上的强调突出效果,从而达到过滤绝大部分的低频词汇文本信息的效果,使得阅读者一眼就可获取到文本的主旨信息。

4.4.7 使用朴素贝叶斯模型识别垃圾短信

4.4.7.1构建词条文档矩阵

在Python中sklearn模块包含进行文本数据统计的方法,CountVectorizer() 函数可以统计分词后的词频TfidfTransformer()函数可以将每个词赋予不同的权重,一次来找到权重比较大的词,也就是重要的特征属性,这一步称为转化成 TF-IDF 权重向量,TF-IDF 是一种统计方法,用以评估一 字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

4.4.7.2 贝叶斯分类模型构建

经过上述处理之后,数据已经变成符合我们建模需要的词条- 文档矩阵类型的数值矩阵,在 Python 里使用倍思夜模型即可搭建一个贝叶斯分类模型。

5.设计总结

       文本挖掘的处理属于自然语言处理范畴,它涉及的数据处理比数值型数据更复杂多变,本案例运用短信文本数据,对垃圾短信进行识别。重点介绍了文本数据的特殊字符处理、分词、去停用词、绘 制词云、构建词条文档矩阵、以及构建贝叶斯分类算法六部分内容。 基于文本的垃圾短信识别是一种重要的技术,在现代社会中有着广泛的应用,主要实现了垃圾短信的精确识别,通过对文本进行特征提取和机器学习的方法,我们可以实现高效准确的垃圾短信识别。在实际应用中,我们需要将这个技术集成

附录1 完整代码
#导入库
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
message= pd.read_csv('ljfl\message80W1.csv', header=None, index_col=0)
message.columns = ['label', 'message']
message.head(10)
fracs = message['label'].value_counts(normalize=True).values.tolist()
fracs
#设置中文字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False
#数据:labels是一个包含两个字符串元素的列表,用于表示饼图中每个扇形的标签;
#explode是一个包含两个浮点数的列表,用于表示饼图中每个扇形与中心的距离,从而使某个扇形“凸出”来。
labels = ['非垃圾短信', '垃圾短信'] 
explode = [0, 0.1]
#绘制饼图
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%1.1f%%', 
        shadow=True, startangle=70, pctdistance=0.7, radius=0.7)
#标题
plt.title('垃圾短信与非垃圾短信数量分布情况')
#显示图像
plt.show()
# 关闭图形
plt.close()
import pandas as pd
import re
# 1. 欠抽样
pos=message[message['label']==0].sample(1000,random_state=123) # 抽取部分反例
neg=message[message['label']==1].sample(1000,random_state=123) # 抽取部分正例
new_data = pd.concat([pos, neg], axis=0) # 将样本集拼接
# 删除重复数据
data_drop = new_data.drop_duplicates()
print('删除重复数据后的样本量:',data_drop.shape) # 删除重复数据后的样本量
print('未删除重复数据的样本:',new_data.shape) # 未删除重复数据的样本
data_clean = data_drop['message'].astype('str').apply(lambda x: 
re.sub('x|[^\u4E00-\u9FD5]|[0-9]|\\s|\\t', '', x)) # 删除 x 、不常见中文、空格等
data_clean.tail()
import jieba
# 加载自定义词典
jieba.load_userdict('ljfl/newdic1.txt') 
# 使用 jieba_cut() 函数进行词的切分
data_cut = data_clean.astype('str').apply(lambda x : list(jieba.cut(x)))
data_cut.tail()
stopword_file = 'ljfl\stopword.txt'# 定义了一个停用词文件的路径
stopword = pd.read_csv(stopword_file, sep='bingrong', encoding='gbk', header=None) # 读取停用词
#在停用词列表中添加一些常见的停用词,并将从文件中读取的停用词添加到列表中。
stopword = [' ',',', ' 会', ' 的', ' 】', ' 【', ' 月', ' 日'] + list(stopword[0]) 
# 使用 apply 函数遍历文本数据中的每一个词语,并将不在停用词列表中的词语保留下来,
data_delstop = data_cut.apply(lambda x: [i for i in x if i not in stopword]) 
data_delstop.head()
import pandas as pd
import re
import jieba
#数据预处理
def data_process(file='ljfl\message80W1.csv'):
    message= pd.read_csv('ljfl\message80W1.csv', header=None, index_col=0)
    message.columns = ['label', 'message']#列名赋值->标签 内容
    
 
    pos= message[message['label']==0].sample(1000,random_state=123) # 抽取部分反例
    neg= message[message['label']==1].sample(1000,random_state=123) # 抽取部分正例
    new_data = pd.concat([pos, neg], axis=0) # 将样本集拼接
    
    data_clean = data_drop['message'].astype('str').apply(lambda x: 
    re.sub('x|[^\u4E00-\u9FD5]|[0-9]|\\s|\\t', '', x))
 
    jieba.load_userdict('ljfl/newdic1.txt')     #将自定义的词典加入
    data_cut = data_clean.astype('str').apply(lambda x : list(jieba.cut(x)))  #data去敏的句子进行分词操作,返回列表
 
    #去除停用词
    stopword_file = 'ljfl\stopword.txt' 
    stopword = pd.read_csv(stopword_file, sep='bingrong', encoding='gbk', header=None) # 读取停用词
    # 添加自定义的停用词
    stopword = [' ',',', ' 会', ' 的', ' 】', ' 【', ' 月', ' 日'] +list(stopword[0]) # 去除停用词
    data_delstop = data_cut.apply(lambda x: [i for i in x if i not in stopword]) 
 
    #数据预处理函数封装
    labels = new_data.loc[data_delstop.index, 'label']   #标签
    adata = data_delstop.apply(lambda x: ' '.join(x))   #将列表进行拼接
return adata, data_delstop, labelsl
#numpy 库用于支持数组和矩阵运算,PIL 库用于图像处理,wordcloud 库用于生成词云
import numpy as np
from PIL import Image
from wordcloud import WordCloud,STOPWORDS
adata, data_delstop, labels= data_process() 
# 词频统计,自编函数,参数为 0,1
def words_count(label=0):
    word_dict = {}
    for item in list(data_delstop[labels==label]):
        for i in item:
            if i not in word_dict: # 统计数量
                word_dict[i] = 1
            else:
                word_dict[i] += 1
    return word_dict
print(words_count())
def WordCloud_plot(mask_picture='ljfl\kunge.jpg'):
    p1 = plt.figure(figsize=(16,8),dpi=80) # 确定画布大小
    image= Image.open(mask_picture) # 轮廓图片
    graph = np.array(image) # 读成像素矩阵
    wc =WordCloud(background_color='white', # 设置背景颜色
        mask=graph, # 设置背景图片
        max_words = 2000, # 设置最大现实的字数
        stopwords = STOPWORDS, # 设置停用词
        font_path = 'simhei.ttf',# 设置字体格式 
        max_font_size = 100, # 设置字体最大值
        random_state = 40) # 设置随机生成状态,即有多少种配色方案)#绘制 0,1 样本的词云图
    for i in [0,1]:
            p1.add_subplot(1,2,i+1)
            wc.generate_from_frequencies(words_count(i)) # 读进词频数据
            plt.imshow(wc) # 绘图
            plt.axis("off") # 去除坐标轴
plt.show() # 将图打印
WordCloud_plot()
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.metrics import confusion_matrix, classification_report#用于评估模型的性能
from sklearn.model_selection import train_test_split#将数据集分为训练集和测试集
from sklearn.svm import LinearSVC#训练支持向量机模型
dataAlready, labels, _ = data_process() #获取数据和标签
train_data, test_data, train_y, test_y = train_test_split(dataAlready, labels, test_size=0.2) 
transformer = TfidfTransformer() # 转化 tf-idf 权重向量函数
vectorizer = CountVectorizer() # 转化词频向量函数
# 训练集的处理
train_cv = vectorizer.fit_transform(train_data) # 对训练集执行词频转换
tfidf_train = transformer.fit_transform(train_cv.toarray()) # 进一步转成 tfidf 权重向量
print(' 词频结果:\n',train_cv) # 查看词频结果
print('TF-IDF 结果:\n',tfidf_train) # 查看词的权
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
from sklearn.preprocessing import MultiLabelBinarizer
import warnings
 
warnings.filterwarnings("ignore")
 
# 数据准备,调用自编 data_process() 函数,获取文本数据和对应的标签。
dataAlready, labels, _ = data_process() 
#将数据集划分为训练集和测试集。
train_data, test_data, train_labels, test_labels = 
train_test_split(dataAlready, labels, test_size=0.2) # 数据拆分
 
# 构建词频向量和权重向量转化函数,并对训练集和测试集分别进行转换
vectorizer = CountVectorizer()
transformer = TfidfTransformer()
 
train_cv = vectorizer.fit_transform(train_data)
test_cv = vectorizer.transform(test_data)
 
tfidf_train = transformer.fit_transform(train_cv)
tfidf_test = transformer.transform(test_cv)
 
# 将标签转换为二进制数组
mlb = MultiLabelBinarizer()
train_y = mlb.fit_transform(train_labels)
test_y = mlb.transform(test_labels)
 
# 将标签转换为一维数组
train_y = train_y.argmax(axis=1)
test_y = test_y.argmax(axis=1)
 
# 构建分类器并进行训练和预测
clf = OneVsRestClassifier(LinearSVC())
clf.fit(tfidf_train, train_y)
predictions = clf.predict(tfidf_test)
 
# 输出模型训练正确率、分类性能报告和混淆矩阵
print('模型训练正确率:', clf.score(tfidf_train, train_y))
print('分类性能报告:', classification_report(test_y, predictions))
print('混淆矩阵:', confusion_matrix(test_y, predictions)

到一个完整的系统中,以实现自动化的垃圾短信过滤。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值