主要内容:

1.设计一个由敏感词所组成的词库,以字符串结构存储。
2.设计一个邮件过滤系统,对邮件内容与词库中的敏感词进行模式匹配,最终返回是否垃圾邮件的标记。
3.编写一个主函数,输入一段文字模拟邮件内容,测试系统功能。

实现方法:

程序主要使用了KMP算法进行字符串模式匹配:

#Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。KMP算法的时间复杂度为O(m+n)。

​ # main函数:设置存储关键词的字符数组pattern,多个关键词组成敏感词词库。设置存储邮件的字符数组string,当用户输入关键词和邮件内容后,调用KMP函数,KMP函数会返回pattern在string中的位置,如果没有找到会返回notfound,根据返回值打印是否垃圾邮件。

​ # KMP函数:求string长度为n,pattern长度为m,申请空间分配给match数组,调用BuildMatch函数,然后从头开始向后比较,匹上就继续向后一位,匹配失败则pattern的指针回退,回退的位置和match值有关,然后重新比较。当pattern中字符全部匹配上,表示找到,返回它在string中对应的下标,否则返回notfound。

​ # BuildMatch函数:分析关键词pattern,对pattern的每一个字符得出它对应的match值存放在数组中。

程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>typedef int Position;
#define NotFound -1void BuildMatch(char *pattern, int *match)//关键词预分析函数
{   //分析pattern,对pattern的每一个字符得出它对应的match值Position i, j;int m = strlen(pattern); match[0] = -1; //pattern的第一个字符match值为-1for (j = 1; j < m; j++) {i = match[j - 1];  //用i替代 match[j - 1],方便后面表示while ((i >= 0) && (pattern[i + 1] != pattern[j]))i = match[i];  //回退再比较if (pattern[i + 1] == pattern[j])match[j] = i + 1;else match[j] = -1; }
}Position KMP(char *string, char *pattern) //字符串模式匹配函数
{int n = strlen(string);   //求字符串string长度int m = strlen(pattern);  //求字符串pattern长度Position s, p, *match;if (n < m) return NotFound;  //n < m 时一定不匹配match = (Position *)malloc(sizeof(Position) * m);  //申请m个整型数据的空间,首地址强制转换为int型指针BuildMatch(pattern, match); //调用BuildMatch函数分析pattern,对pattern的每一个字符得出它对应的match值s = p = 0; //两个标志设为0使两个字符串从头开始匹配(两个字符串数组的下标)while (s < n && p < m) {if (string[s] == pattern[p]) {s++; p++; //如果前面的字符匹配上了则继续向后比较}else if (p > 0) p = match[p - 1] + 1; //指针P回退,再开始比较(相当于pattern向后挪动)else s++; //既p=0的情况既第一个字母就匹配不上,此时指针s向后挪一位再比}return (p == m) ? (s - m) : NotFound; //pattern中字符全部匹配完表示匹配上,返回string中对应的下标,否则返回NotFound
}int main()
{char pattern1[100]; //存储关键词的字符串数组char pattern2[100]; char pattern3[100]; int a = 0;printf("请设置3个垃圾邮件过滤关键词:\n");printf("(空格分开回车结束)\n");scanf_s("%s", pattern1, 100); scanf_s("%s", pattern2, 100);scanf_s("%s", pattern3, 100);/*//vc++6.0支持的输入方式scanf("%s", pattern1); scanf("%s", pattern2);scanf("%s", pattern3);*/printf("\n");while (a < 60) //设置测试次数{char string[9000]; //存储邮件的字符串数组printf("请输入邮件内容,按回车结束(支持中英文):\n");scanf_s("%s", string, 9000);Position p1 = KMP(string, pattern1); //调用模式匹配函数,得到pattern在string中的位置Position p2 = KMP(string, pattern2); //同上,返回数组下标赋值给p2Position p3 = KMP(string, pattern3);if (p1 == NotFound && p2 == NotFound&& p3 == NotFound) //当全部关键词都未匹配上为正常邮件否则只要有一个匹配则为垃圾邮件printf("\033[0;32;40m正常邮件! \033[0m\n\n"); //格式符表示打印绿色字体else printf("\033[0;31;40m垃圾邮件! \033[0m\n\n"); //格式符表示打印红色字体/*//输出不带颜色if (p1 == NotFound && p2 == NotFound && p3 == NotFound)printf("正常邮件!\n\n");else printf("垃圾邮件!\n\n");*/a++;}return 0;
}

测试效果:


感觉不错的话请点个赞吧,感谢!

c++基于字符串匹配的垃圾邮件过滤系统相关推荐

  1. 毕业设计-基于深度学习的垃圾邮件过滤系统的设计与实现

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

  2. 基于C#的机器学习--垃圾邮件过滤

    在这一章,我们将建立一个垃圾邮件过滤分类模型.我们将使用一个包含垃圾邮件和非垃圾邮件的原始电子邮件数据集,并使用它来训练我们的ML模型.我们将开始遵循上一章讨论的开发ML模型的步骤.这将帮助我们理解工 ...

  3. 论题:基于机器学习的垃圾邮件过滤系统

    目录 摘要 1.引言 2.相关工作 3.数据集与特征提取 4.机器学习模型的设计与选择 5.模型优化与融合策略 6.系统实现与应用 7.结论 本文为论题:基于机器学习的垃圾邮件过滤系统的撰写思路. 摘 ...

  4. 基于机器学习的垃圾邮件过滤系统

    前言: 前段时间写了篇论题:基于机器学习的垃圾邮件过滤系统,然后有童鞋问我具体实现的框架啊,那我们现在来简单说一下. 目录 前言: 一.概述 二.数据收集

  5. 第六篇:基于朴素贝叶斯分类算法的邮件过滤系统

    前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节 ...

  6. 机器学习工程实例 垃圾邮件过滤系统 数据预处理 训练模型 交叉验证 精准率召回率计算 步骤详细解析

    本博客所有内容均整理自<Hands-On Machine Learning with Scikit-Learn & TensorFlow>一书及其GitHub源码. 看<Ha ...

  7. 自己动手打造企业垃圾邮件过滤系统

    电子邮件是整个互联网业务重要的组成部分.据相关报道统计,四分之三以上的用户上网的主要目的是收发邮件,每天有十数亿封电子邮件在全球传递,其应用频率已经超过了WWW服务,因此,电子邮件已成为网络用户不可或 ...

  8. 简单垃圾邮件过滤系统

    头文件: typedef struct chuan1 {char* str;int chang;int maxchang;}chuan; int chushi(chuan* s, int max, c ...

  9. 一个基于Flask框架做的仿QQ邮箱系统(收发邮件、贝叶斯模型训练、垃圾邮件过滤、个性化标签)

    一个基于Flask框架做的仿QQ邮箱系统(收发## 标题邮件.贝叶斯模型训练.垃圾邮件过滤.个性化标签) 1.贝叶斯邮件垃圾邮件分类 对上千封邮件进行贝叶斯模型分类训练,对基本邮件实现垃圾分类效果. ...

最新文章

  1. 【零基础学习iOS开发】【02-C语言】08-基本运算
  2. python3.7 6如何安装-Python 3.7.1在CentOS 6.10 安装部署
  3. org.apache.maven.archiver.MavenArchiver.getManifest错误
  4. HDU 2836 Traversal 简单DP + 树状数组
  5. vue中有关.env;.env.development,.env.production的相关介绍
  6. Python eclipse开发环境搭建
  7. 返回表达式列表中最小值least(exp1,exp2,exp3,……,expn)
  8. c语言排队系统,【分享】C语言 银行取票排队系统
  9. build shop
  10. C# 值类型和引用类型
  11. Unix命令行程序和内建指令
  12. stack(栈)数据结构详解
  13. html 折叠焦点图切换,自适应全屏焦点图切换CSS3特效
  14. 数据分析之数据可视化
  15. IDEA修改主题颜色,只需要四步
  16. 数字资产投资论坛暨全球数字资产领袖委员会成立大会1月16日将在纽约举行
  17. [我是面试官系列]如何判断一个人的执行力?
  18. 读《解忧杂货店》有感
  19. 【超全超详细】2W字零基础黑客学习路线,知识体系(附学习路线图)
  20. 虚拟机Linux的安装

热门文章

  1. 食物图片变菜谱:这篇CVPR论文让人人都可以学习新料理
  2. 【黎曼积分】第一型曲面积分公式推导
  3. PHP实现查询关键字描红
  4. 进军硅谷——程序员面试揭秘
  5. Jmeter连接MySQL获取短信验证码
  6. 【Python】计算手机销量年增长率
  7. cad图纸问号怎么转换文字_cad图纸的文字问号处理办法
  8. H.264视频压缩标准拓展视频监控的潜力
  9. 产品要新意更要“全套解决方案”!山姆让露营玩出“风格”
  10. 自学计算机6个月总结——不完全学习路线分享(2021年2月27日修正)