基于最大熵方法的垃圾邮件过滤插件的设计与实现

来源:岁月联盟 作者:司广涛 朱巧明 李培 时间:2010-08-30

  摘要:结合邮件的半结构化特征,将最大熵模型引入垃圾邮件过滤中,构造出基于最大熵模型的垃圾邮件过滤系统框架。在此基础上,将其与Outlook提供的PIA相结合,利用.NET技术开发出基于最大熵模型的垃圾邮件过滤插件,在客户端实现了基于内容的垃圾邮件过滤,较好地解决了垃圾邮件的问题。?
  关键词:最大熵模型;邮件过滤;.NET;Outlook插件?
 
  邮件以其方便、快捷、低成本等优点逐渐成为人们日常生活中主要的通信手段之一。但大量垃圾邮件的出现,给全球用户带来了巨大损失。据调查,我国用户平均每人每周收到的垃圾邮件数量占收到的总邮件数量的61.63%[1]。垃圾邮件的泛滥已带来严重后果,因此有效地区分正常邮件和垃圾邮件成为一项紧迫的任务。近年来,有关垃圾邮件过滤技术的研究逐渐兴起。常见的过滤方法有黑、白名单技术和规则过滤等,但由于邮件发送者在不断变化,规则难以维护,准确率不高,使这些方法都具有一定的局限性。将垃圾邮件过滤与机器学习、文本分类和信息过滤技术相结合,对邮件正文内容进行分析,已成为目前研究的热点[2]。?
  最大熵模型是一种广泛应用于统计语言处理领域的技术。结合邮件的半结构化特性,本文将最大熵模型应用到垃圾邮件过滤中,构造出基于最大熵模型的垃圾邮件过滤系统框架,并将其与Outlook相结合,基于.NET平台开发出了Outlook垃圾邮件过滤插件,在客户端利用最大熵模型实现了基于内容的垃圾邮件过滤。?
  
  1基于最大熵模型的垃圾邮件过滤?
  
  1.1最大熵模型?
  
  2.1互操作程序集?
  .NET框架中提供的COM Interop技术,使开发人员可以在.NET代码中直接访问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基于最大熵模型的垃圾邮件过滤插件?
  
  为了在客户端对用户收到的邮件实现基于内容的过滤,将最大熵模型与Outlook插件开发技术结合,
  在.NET平台上实现了基于最大熵模型的垃圾邮件过滤插件。?
  3.1IDTExtensibility2接口的实现?
  (1)在OnConnection()方法中获得Outlook和插件ME-MFS对象实例;判断连接模式,把用户自定义数据传送到?OnStartupComplete方法。?
  取得宿主程序和插件对象的实例;?
  判断连接模式connectMode,若不为ext_ ConnectMode.ext_cm_Start ̄up则调用OnStartup Complete( ),并传递用户自定义数据。?
   (2) 在OnStartupComplete()方法中构造用户界面,定义事件委托以完成业务逻辑,并对用户自定义数据进行处理。?
  取得活动Explorer 对象的CommandBars;?
  取得CommandBars中的“菜单栏”;?
  如果用户自定义菜单不存在,则创建用户自定义菜单,并将其添加到系统菜单栏,向自定义菜单中添加各菜单项;?
  设置用户自定义菜单项的事件委托,以完成业务逻辑。?
  (3) 在OnDisconnection()方法中检查断开模式,把用户自定义数据传递到OnBeginShutdown()方法,释放Outlook实例。?
  判断断开模式disconnectMode,若不为ext_Disconnect Mode.ext_?dm_HostShutdown,则调用OnBeginShutdown( ),并传递用户自定义数据;?
  释放宿主程序对象实例。?
   (4) 在OnBeginShutdown()方法中还原对Outlook用户界面所作的修改。?
  取得活动Explorer的菜单栏;?
  取得用户自定义菜单,如果存在,则从菜单栏中删除用户自定义菜单,还原对用户界面的修改。?
  
  3.2自定义用户界面?
  按照上述方法中的步骤,在Outlook中构造用户自定义菜单“MEMFS”,插入完成垃圾邮件过滤功能的菜单项:?
  (1)特征提取——获得用户Outlook文件夹中现有的所有邮件,把“垃圾邮件”文件夹中的邮件作为垃圾邮件,其他邮件文件夹中的邮件作为正常邮件;提取邮件特征,生成特征文件,以进行最大熵模型的训练。?
  (2) 模型训练——根据已生成的特征文件,进行GIS迭代收敛,得到最大熵模型。?
  (3) 模型调整——邮件过滤结果不正确时,帮助用户修改模型参数,实现用户的个性化要求。?
  3.3垃圾邮件过滤逻辑的实现?  得到最大熵模型后,即可使用此模型进行垃圾邮件过滤。当新邮件到达时,插件获取新邮件的特征,由最大熵模型对新邮件进行判断。如果是垃圾邮件,则将其由收件箱转移到垃圾邮件文件夹中。?
  
  取得收件箱中收到的新邮件;?
  提取新邮件的特征;?
  用最大熵模型进行概率估计,求出新邮件对正常邮件和垃圾邮件的概率,取其中较大的概率对应的类别作为新邮件类别; ?
  若新邮件为垃圾邮件,则将其转移到垃圾邮件文件夹。?
  在邮件特征提取和新邮件到达处理时,都要获得Outlook 2003文件夹中的邮件项。获得这些邮件项的基本过程如下:?
  用Application对象的GetNamespace()方法取得NameSpace类型;?
  用NameSpace的GetDefaultFolder()方法取得MAPIFolder类型;?
  使用MAPIFolder.Items索引器枚举各邮件项。?
  
  4结束语?
  
  本文将在统计处理领域应用广泛的最大熵模型引入到垃圾邮件过滤中,利用Outlook 2003提供的PIA,在.NET平台上开发出了垃圾邮件过滤插件,在客户端实现了基于内容的垃圾邮件过滤,能较好地帮助用户解决垃圾邮件泛滥的问题。本文的插件开发技术,稍作修改即可应用于其他版本的Outlook。?
  
  :?
  [1]互联网协会反垃圾邮件中心.2005年第三次中国反垃圾邮件状况调查报告[EB/OL].[2006-02].http://www.anti-spam.cn/.?
  [2]潘文锋.基于内容的垃圾邮件过滤研究[D].北京:中国院研究生院,2004:4-9.?
  [3]RATNAPARKHI A. Maximum entropy models for natural language ambiguity[D].[S.l.]:University of Pennsylvania, 1997.?
  [4]CARTER E.Coming to grips with the mess of types in the Office PIAs [EB/OL].http://blogs.msdn.com/eric_carter/archive/2004/05/06/127698.aspx.?
  [5]KHOR S M,LEONARD A.Office 2003主Interop 程序集的安装和使用[EB/OL].(2005-04).http://www.microsoft.com/china/msdn/library/office/office/ OfficePrIntopAssFAQ.mspx.?
  [6]BOYCE J.Microsoft Office Outlook 2003完全揭密[EB/OL].(2004-12).http://www.microsoft.com/china/msdn/library/office/office/UsingVBAInOutlook.mspx.?
  [7]TROELSENF A W.使用C#进行Outlook 2003编程的简介[EB/OL].(2004-07).http://www.microsoft.com/china/msdn/library/langtool/vcsharp/USdv_vstechartol03csharp.mspx.

图片内容