摘要:结合邮件的半结构化特征,将最大熵模型引入垃圾邮件过滤中,构造出基于最大熵模型的垃圾邮件过滤系统框架。在此基础上,将其与outlook提供的pia相结合,利用.net技术开发出基于最大熵模型的垃圾邮件过滤插件,在客户端实现了基于内容的垃圾邮件过滤,较好地解决了垃圾邮件的问题。
关键词:最大熵模型;邮件过滤;.net;outlook插件
电子邮件以其方便、快捷、低成本等优点逐渐成为人们日常生活中主要的通信手段之一。但大量垃圾邮件的出现,给全球用户带来了巨大损失。据调查,我国用户平均每人每周收到的垃圾邮件数量占收到的总邮件数量的61.63%[1]。垃圾邮件的泛滥已带来严重后果,因此有效地区分正常邮件和垃圾邮件成为一项紧迫的任务。近年来,有关垃圾邮件过滤技术的研究逐渐兴起。常见的过滤方法有黑、白名单技术和规则过滤等,但由于邮件发送者在不断变化,规则难以维护,准确率不高,使这些方法都具有一定的局限性。将垃圾邮件过滤与机器学习、文本分类和信息过滤技术相结合,对邮件正文内容进行分析,已成为目前研究的热点[2]。
最大熵模型是一种广泛应用于统计自然语言处理领域的技术。结合邮件的半结构化特性,本文将最大熵模型应用到垃圾邮件过滤中,构造出基于最大熵模型的垃圾邮件过滤系统框架,并将其与outlook相结合,基于.net平台开发出了outlook垃圾邮件过滤插件,在客户端利用最大熵模型实现了基于内容的垃圾邮件过滤。
1基于最大熵模型的垃圾邮件过滤
1.1最大熵模型
2.1互操作程序集
.net框架中提供的com interop技术,使开发人员可以在.net代码中直接访问com组件。WWW.133229.cOM其基本原理[4]是,针对用户要访问的com组件,.net框架自动生成一个互操作程序集(interop assembly,ia)。ia是一个完全的托管程序集,其命名空间、类、方法等都与com组件相对应。这样,在.net程序中可以直接引用ia,由ia完成对真正com组件的访问。图2说明了ia的作用。
微软公司为outlook 2003提供了一个“正式的”互操作程序集,即主互操作程序集(primary interop assembly,pia),驻留在名称为micrsoft.office.interop.outlook.dll的全局程序集缓存中。在outlook的安装过程中,选择“.net可编程性支持”,或者下载客户端pia安装包来完成pia的安装[5]。
2.2outlook 2003对象模型
outlook通过对象和对象集合的层次系统(称为对象模型)为开发语言提供功能,开发人员利用可用的对象和功能与outlook进行交互,创建自己的解决方案。下面对其中几个重要的对象进行介绍[6]。
2.2.1application 对象
application是层次结构中所有其他对象的根,提供对其他所有outlook对象的访问。要从外部应用程序中访问outlook对象模型,必须先获得application对象的实例。
2.2.2namespace对象
namespace对象是outlook数据源的抽象根。如果要访问outlook数据,则必须创建namespace对象的实例。目前,所支持的唯一数据源是邮件应用程序编程接口mapi,用于访问outlook文件夹组中的所有outlook数据。
2.2.3mapifolder 对象
outlook数据存储区内有一组支持默认功能的文件夹,使用namespace的getdefaultfolder()方法返回某个默认文件夹,即mapifolder对象。
2.2.4items对象
items代表outlook项目集合,如邮件项目mailitem、任务项目taskitem等。可以使用application对象的createitem()创建新的项目或使用items对象的索引器获得并修改现有的项目。
2.2.5explorers和inspectors对象
outlook对象模型还定义了用来对用户界面进行操作的类型。explorers对象包含一组explorer对象,代表所有的浏览器。explorer类型表示用于显示文件夹内容的窗口。inspectors对象包含一组inspector对象,代表所有检查器。inspector对象代表显示outlook项目的窗口。
2.3用.net开发outlook插件
利用pia,开发人员可以在.net中方便地对outlook的编程接口进行操作[7]。visual studio.net 2003提供了“共享的外接程序”项目模板,通过创建自定义外接程序,对outlook 2003进行功能扩展。完成共享的外接程序向导后,得到包含两个项目的解决方案,即外接程序项目和对应的安装项目。
外接程序自动引用程序集extensibility.dll。它包含命名空间extensibility。其中确切定义了三个类型:
(1)idtextensibility2——所有外接程序都必须实现的关键接口;
(2)ext_connectmode——枚举变量,表示将宿主程序(outlook)连接到外接程序的各种方式;
(3)ext_disconnectmode——枚举变量,表示将外接程序与宿主程序断开的各种方式。 2.3.1 idtextensibility2接口的角色
idtextensibility2 接口类型定义了在插件生命周期的各个阶段宿主应用程序所调用的方法。
(1)onconnection()方法——插件连接到宿主程序时调用该方法。成功返回表明已加载了插件;否则宿主程序立即释放其对该插件的引用。
(2)ondisconnection()方法——插件断开连接并且在从内存中卸载之前,将激活此事件。
(3)onaddinsupdate()方法——当最终用户在宿主程序中插入或删除插件时,调用onaddinsupdate( )方法。
(4)onstartupcomplete()和onbeginshutdown()方法——只有在启动期间已连接了插件的情况下才调用onstartupcomplete();此时所有宿主资源均可供插件使用,因此典型的操作是为插件构造用户界面。宿主程序在关闭过程中要断开与插件连接的情况下调用onbeginshutdown();通常在此事件中执行所有资源清理操作,并还原对宿主程序所作的任何更改。
2.3.2实现用户界面和业务逻辑
宿主程序加载完成之后,所有的宿主资源均可供插件使用。因此,通常在onstartupcomplete()方法中构建插件的用户界面。例如,向浏览器标准命令栏中添加commandbarbutton的步骤如下:
(1)从活动资源管理器获得命令栏集。
(2)查看按钮是否在希望修改的命令栏控件集合中。如果不在,则创建并启用新的实例。
(3)设置commandbarbutton的click 事件委托,以完成其自定义功能。
根据步骤(3)中指定的自定义按钮的事件委托,在对应的方法中完成用户自定义操作,实现业务逻辑。
2.3.3注册共享外接程序
要在outlook中使用插件,必须注册插件动态链接库。该动态链接库的类标志符在注册表的\hkey_classes_root子树下注册。另外,必须在注册表中添加有关插件的信息。该信息提供插件的名称、说明、目标应用程序、初始加载行为和连接状态等。通常在注册表中创建以下键值:
hkey_current_user\software\microsoft\office\outlook\addins\progid
其中progid为插件程序的唯一标志符的字符串表示形式。
外接程序项目的生成设置中已选中了“注册com interop”,生成插件的过程中自动向com interop注册了.net类。
3基于最大熵模型的垃圾邮件过滤插件