一、实验目的:
(1)熟悉函数定义与调用语法。
(2)熟悉函数默认值参数的用法。
(3)了解垃圾邮件分类方法原理。
(4)熟练使用内置函数sum()、map()。
(5)熟练运用字符串方法。
(6)熟练使用lambda表达式。
(7)理解Python函数式编程模式。
(8)了解算法中rate参数对分类结果的影响。
二、实验内容:
朴素贝叶斯算法算法、支持向量机算法等主流的垃圾邮件分类算法都依赖于特征向量的提取和数据集对模型的训练,其中特征向量的提取又依赖于对邮件正文的分词结果。如果垃圾邮件发送者在邮件中插入一些干扰符号,很容易影响分词的结果。例如,在“发票”中间插入“【”变成“发【票”将会使得jieba或者snownlp之类的分词工具无法正常分词,从而干扰最终的邮件分类效果。
一般来说,在一封正常邮件中,是不会出现太多类似于【、】、*、-、/这样的字符的。如果一封邮件中包含的类似字符数量超过一定的比例,我们可以直接认为是垃圾邮件,而不需要朴素贝叶斯算法或者支持向量机等复杂的算法,可以大幅度提高分类速度。
编写程序,对给定的邮件内容进行分类,提示“垃圾邮件”或“正常邮件”。
三、实验环境:
Windows 10/11 + Jupyter Notebook \ PyCharm \ Spyder \ VScode + Python 3.9+
四、实验完成情况:
1)第一种代码:
def check(text, rate=0.2): characters = '【】*-/\\' num = sum(map( lambda ch:text.count(ch), characters)) if num/len(text) > rate: return '垃圾邮件' return '正常邮件' # 测试函数功能 text = '我公【司免】费开发【票,微*信*同-号' print(check(text)) print(check(text, 0.5))
2)第二种方法:
def is_spam(email_content, threshold=0.05): special_chars = set('【、】、*、-、/、\') special_count = sum(1 for char in email_content if char in special_chars) total_count = len(email_content) ratio = special_count / total_count if ratio > threshold: return "垃圾邮件" else: return "正常邮件" email1 = "这是一封正常的邮件,包含一些特殊字符:【、】、*、-、/" email2 = "这是一封垃圾邮件,包含很多特殊字符:【、】、*、-、/、【、】、*、-、\" print(is_spam(email1)) # 应该返回正常邮件 print(is_spam(email2)) # 应该返回垃圾邮件
五、总结思考:
这两个代码都可以实现题目要求,也存在着一些不同,如下:
1.字符集合的定义:
- 第一种方法使用字符串
'【】*-/\\'来定义特殊字符集合,这个字符串包含了中文字符和英文字符。 - 第二种方法使用集合
set('【、】、*、-、/')来定义特殊字符集合,这个集合只包含了中文字符和一些英文字符。注意,这里的字符集没有包含反斜杠\。
2.字符计数的方法:
- 第一种方法使用
text.count(ch)来计数每个特殊字符在文本中出现的次数,然后求和。 - 第二种方法使用列表推导式和
if char in special_chars来计数特殊字符。
3.阈值的应用:
- 第一种方法的阈值是直接在函数调用时指定的,例如
check(text, 0.5)。 - 第二种方法的阈值是作为函数参数定义的,默认为
0.05,但在调用时可以修改,例如is_spam(email2, 0.5)。
4.代码风格:
- 第一种方法使用了
map函数
和lambda表达式,这在Python中是一种常见的函数式编程风格。 - 第二种方法使用了更传统的循环和条件判断,这在Python中更为直观。
1242

被折叠的 条评论
为什么被折叠?



