Apache Mahout:构建垃圾邮件过滤器服务器

Lucene发生了一些相当有趣的事情。 它最初是作为一个库,然后其开发人员开始基于它添加新项目。 他们开发了另一个开源项目,该项目将向Lucene添加爬网功能(以及其他功能)。 Nutch实际上是任何人都可以使用或修改的功能齐全的Web Serach引擎。

受到Google关于Map Reduce和Google Filesystem的一些著名论文的启发,这些新功能用于将索引分发到Nutch,并添加到Nutch中,这些功能最终由他们自己拥有: Hadoop 。 从那时起,许多项目都通过Hadoop开发。 我们正面临由Lucene火花点燃的开源代码的大爆炸。

所有这些项目都在某种程度上与内容处理有关。 对于所有对搜索和信息检索感兴趣的人,现在我们将讨论该领域的另一个项目,该项目不在搜索的严格范围之内,但是可以教会您一些有关内容处理的有趣知识。
最近,我一直在阅读有关这个​​新库Mahout的信息,该库在一个库中一起提供了所有那些晦涩而神秘的机器学习算法。 许多现代网站都在使用机器学习技术。 这些算法相当古老且广为人知,但是由于其在社交网站(facebook比您可能会成为最好的朋友知道得更多)或Google(了解您的想法并猜测您可能想写的内容)中的广泛使用而最近流行。搜索框)。
简而言之,如果说计算机程序在T任务中的性能(由P衡量)随经验E的提高而提高,则可以说它是从经验E中学习有关某类任务T和绩效指标P的。

例如,如果您想制作一个程序来识别验证码,您将拥有:
T:识别验证码
P:正确识别的单词百分比
E:具有正确拼写的验证码数据库
因此,似乎他们所需要的只是计算能力。 而且他们需要大量的计算能力。 例如,在有监督的机器学习中(我一个月前才学到这个术语,不要指望我会非常学术),您向机器展示了一些您想要的示例(经验),并且机器从中提取了一些模式。 一个人学习时的行为几乎是相同的:从向该人显示的一些示例中,他使用其过去的知识来推断某种模式,这将有助于他对同一事件的分类。 好吧,计算机在学习事物方面非常愚蠢,因此您必须向他们展示很多示例来推断模式。
但是,分类只是问题的一部分。 Mahout的目标是三个大领域(由于该项目相对较新,将来还会有更多领域)。 分类,聚类和建议。 这些的典型示例:
  • 分类:这是一种有监督的学习,您为机器提供了…事物的许多实例(例如文档)以及它们的类别。 机器从所有这些机器中学习将已知实例分类为将来的实例。
  • 聚类:从某种意义上讲,它类似于分类,它使事物成组,但是这一分类不受监督。 您给机器提供了很多东西,然后机器将成组的类似物品组合在一起。
  • 建议:这正是IMDb或Amazon对页面底部推荐的电影或书籍的处理方式。 根据其他用户的喜欢程度(通过用户投票的排名明星来衡量),Amazon可以推断“喜欢这本书的其他用户也喜欢这些其他人”。
如果您想更好地定义这三个类别,可以转到Grant Ingersoll的博客 。

离线示例

现在,我将向您展示一个简单的程序,我认为这是一个非常明显的分类示例。 我们将邮件分为垃圾邮件和非垃圾邮件(研究人员将其称为火腿)。 步骤如下:
  1. 从网上获取火腿/垃圾邮件语料库(当然已经分类了)。
  2. 用语料库的80%训练分类器,剩下20%进行测试
  3. 创建一个简单的Web服务,对在线垃圾邮件进行分类。 您向其提供邮件,并且会显示“好”或“不好”(或“火腿”或“垃圾邮件”)
我们将要使用的语料库是Spam Assasin的语料库, Spam Assasin是Apache的开源项目,它是一个反垃圾邮件过滤器。 这是一个教程,因此我们不打算对非常困难的邮件进行分类,只是为了展示使用Mahout可以完成的简单程度(当然,困难的内容是由该库的开发人员编写的)。 这个语料库是一个非常简单的语料库 ,其结果将非常令人满意。
Mahout附带了一些已经准备好的示例。 其中之一是20个新闻组示例 ,该示例试图将新闻组中的许多邮件归类。 在Mahout Wiki中可以找到该示例,幸运的是,新闻组的格式与我们的邮件相同。 与20个新闻组相比,我们将对邮件应用相同的处理链。 顺便说一下,我们将使用称为朴素贝叶斯的分类算法,该算法使用著名的贝叶斯定理 ,而我在上一篇文章中已经提到过。 我不会解释该算法的工作原理,只向您展示它的工作原理!
Mahout有两个驱动程序(之所以这样称呼,是因为它们在Hadoop中也用作地图缩小作业来运行),一个用于训练分类器,另一个用于测试它。

训练分类器时,会为其提供一个文件(是,一个文件),该文件每行包含一个已经分析过的文档。 “分析”的含义与Lucene分析文档的含义相同。 实际上,我们将使用Lucene StandardAnalizer来清理一些文档并将它们转换为术语流。 该流将放在此培训文件的一行中,其中第一个术语是该项目所属的类别。 例如,培训文件将如下所示

火腿新mahout版本发布

垃圾邮件现在购买伟哥特别折扣

Mahout附带了一个小程序,用于将文档目录转换为这种格式。 该目录必须为每个类别都有一个内部目录。 在我们的案例中,我们将测试集分为两个目录,一个目录用于测试,另一个目录用于训练(都在<mahout_home> / examples / bin / work / spam中,其中<mahout home>是解压缩mahout分布的位置) 。

我们将分别在其中放置一个垃圾邮件目录和一个火腿目录。

测试
火腿

垃圾邮件

培养
火腿

垃圾邮件

我们手动将大约80%的火腿放入火车/火腿中,其余的放入测试/火腿中,并将垃圾与火车/垃圾邮件和测试/火腿中的垃圾相同(准备测试集从未如此简单! !!)

接下来,我们将使用以下命令准备训练和测试文件

bin/mahout prepare20newsgroups -p examples/bin/work/spam/train -o examples/bin/work/spam/prepared-train -a org.apache.mahout.vectorizer.DefaultAnalyzer -c UTF-8
bin/mahout prepare20newsgroups -p examples/bin/work/spam/test -o examples/bin/work/spam/prepared-test -a org.apache.mahout.vectorizer.DefaultAnalyzer -c UTF-8
默认分析器是Lucene分析器(实际上它包装在mahout类中)
我们将训练分类器。 训练分类器意味着向mahout提供训练文件,并让他使用数据构建内部结构(是的,您可以通过使用“内部”一词来推断出该结构如何工作)。
bin/mahout trainclassifier -i examples/bin/work/spam/prepared-train -o examples/bin/work/spam/bayes-model -type bayes -ng 1 -source hdfs
该模型是在bayes-model目录中创建的,算法是Bayes(朴素的Bayes),我们正在使用Hadoop分布式文件系统(不是,但是当您不使用像Hbase这样的分布式数据库时,您会将该命令告知命令),并且ng是要使用的ngram。 ngram是单词组。 给予更多的ngram可以为每个单词(周围的单词)添加更多的上下文。 您使用的ngram越多,结果应该越好。 我们使用1是因为更好的结果显然会花费更多的处理时间。
现在,我们使用以下命令运行测试
bin/mahout testclassifier -m examples/bin/work/spam/bayes-model -d examples/bin/work/spam/prepared-test -type bayes -ng 1 -source hdfs -method sequential

一段时间后,我们得到以下结果

-------------------------------------------------------Correctly Classified Instances : 383 95,75%Incorrectly Classified Instances : 17 4,25%Total Classified Instances : 400
=======================================================Confusion Matrix-------------------------------------------------------a b <--Classified as189 11 | 200 a = spam6 194 | 200 b = ham

很好的结果!!!

实时对垃圾邮件进行分类的服务器

但是我们与20newsgroup示例并没有做任何不同的事情! 现在,如果我们想对即将到来的邮件进行分类,该怎么办。 我们将创建一个反垃圾邮件服务器,邮件服务器将在其中发送接收到的所有邮件,如果它是垃圾邮件或垃圾邮件,我们的服务器将做出响应(应用此过程)
服务器将尽可能地简单(这只是概念证明):
public class Antispam extends HttpServlet {private SpamClassifier sc;public void init() {try {sc = new SpamClassifier();sc.init(new File("bayes-model"));} catch (FileNotFoundException e) {e.printStackTrace();} catch (InvalidDatastoreException e) {e.printStackTrace();}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Reader reader = req.getReader();try {long t0 = System.currentTimeMillis();String category = sc.classify(reader);long t1 = System.currentTimeMillis();resp.getWriter().print(String.format("{\"category\":\"%s\", \"time\": %d}", category, t1-t0));} catch (InvalidDatastoreException e) {e.printStackTrace();}}}
我们将做一个非常简单的示例,我们将使用一个简单的servlet。 重要的类是SpamClassifier
public class SpamClassifier {private ClassifierContext context;private Algorithm algorithm;private Datastore datastore;private File modelDirectory;Analyzer analyzer;public SpamClassifier(){analyzer = new DefaultAnalyzer();}public void init(File basePath) throws FileNotFoundException, InvalidDatastoreException{if(!basePath.isDirectory() || !basePath.canRead()){throw new FileNotFoundException(basePath.toString());}modelDirectory = basePath;
algorithm = new BayesAlgorithm();BayesParameters p = new BayesParameters();p.set("basePath", modelDirectory.getAbsolutePath());p.setGramSize(1);datastore = new InMemoryBayesDatastore(p);context = new ClassifierContext(algorithm, datastore);context.initialize();}public String classify(Reader mail) throws IOException, InvalidDatastoreException {String document[] = BayesFileFormatter.readerToDocument(analyzer, mail);ClassifierResult result = context.classifyDocument(document, "unknown");return result.getLabel();}}
您有一个数据存储和一个算法。 数据存储代表您先前创建的训练分类器的模型。 我们正在使用InMemoryBayesDatastore(也有使用Hadoop数据库的HbaseBayesDatastore),并为其提供了基本路径和ngrams大小。 我们使用1的ngram来简化此示例。 否则,有必要对分析后的文本构造ngram进行后处理。

该算法是该方法的核心,并且是策略设计模式的明显实例。 我们正在使用BayesAlgorithm,但是我们可以使用使用互补朴素贝叶斯算法的CbayesAlgorithm。

ClassifierContext是用于对文档进行分类的接口。

我们可以使用curl测试我们的服务器:
curl http://localhost:8080/antispam -H "Content-T-Type: text/xml" --data-binary @ham.txt

我们得到

{"category":"ham", "time": 10}

结论

如我们所见,垃圾邮件过滤过程可以分为两部分。 一个离线过程,其中您已经有很多邮件已经被某人分类,并训练分类器。 还有一个在线过程,您可以在其中测试文档以使用先前创建的模型对文档进行分类。 该模型可以发展,您可以添加更多具有更多信息的文档,并且在执行脱机处理后,将使用新模型更新在线服务器。 该模型可能非常大。 这是Hadoop进入现场的地方。
脱机过程可以发送到运行hadoop的群集,并使用相同的库(Mahout!)执行与完全相同的算法,并更快地获得结果。 当然,算法是不一样的,因为它是由集群中肯定拥有的数千台计算机(或拥有的两三台PC)并行执行的。 Mahout在设计时就考虑了这一点。 它的大多数算法都是为在Hadoop上工作而量身定制的。 但是有趣的是,它们也可以在没有测试目的的情况下工作,或者在您必须将算法合并到服务器而无需分布式计算的情况下使用,就像我们在本文中所做的那样。 成为集群用户和嵌入应用程序的各种可能性的组合使Mahout成为使用Web规模数据的现代应用程序的强大库。

参考:来自我们的JCG合作伙伴 Emmanuel Espina的 火腿,垃圾邮件和大象(或如何使用Mahout构建垃圾邮件过滤服务器)   在emmaespina博客上。


翻译自: https://www.javacodegeeks.com/2012/03/apache-mahout-build-spam-filter-server.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建模步骤_古建设计 | sketchup建模步骤教程(简易入门版)

前言本篇教程主要是针对古建建模入门者。小N给大家分享一套我相对简易的建模步骤。(PS&#xff1a;但是估计有些人可能会感觉我做的东西已经繁琐了……)因为主要是为了让大家熟悉、入门和好记忆。所以讲的东西&#xff0c;小N我会相对简单&#xff0c;有些细节的内容不会更多展…

JavaScript模块化

JavaScript模块化的实现方式&#xff1a; <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>模块化</title></head> <body><script type&quo…

Linux下面的IO模型

1. Linux下的五种I/O模型 阻塞I/O模型&#xff1a; 一直阻塞 应用程序调用一个IO函数&#xff0c;导致应用程序阻塞&#xff0c;等待数据准备好。 如果数据没有准备好&#xff0c;一直等待….数据准备好了&#xff0c;从内核拷贝到用户空间,IO函数返回成功指示。 我们 第一…

改变导航栏上边的状态栏颜色

#pragma mark - 改变状态栏颜色 -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }转载于:https://www.cnblogs.com/block123/p/5195203.html

PIT和TestNG突变测试简介

变异测试是一种技术&#xff0c;它可以发现测试未涵盖代码的哪些部分。 它类似于代码覆盖范围 &#xff0c;但变异测试不限于在测试期间执行给定行的事实。 这个想法是修改生产代码&#xff08;引入突变&#xff09;&#xff0c;这应该改变其行为&#xff08;产生不同的结果&am…

JavaScript内存管理——优化内存占用

使用具备垃圾收集机制的语言编写程序&#xff0c;开发人员一般不必操心内存管理的问题。但是&#xff0c;JavaScript在进行内存管理及垃圾收集时面临的问题还是有点与众不同。其中最主要的一个问题&#xff0c;就是分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序的少…

Java 8的烹调方式– Lambda项目

什么是project lambda &#xff1a;Project lambda是用于以Java语言语法启用lambda表达式的项目。 Lambda表达式是功能编程语言&#xff08;如lisp&#xff09;中的主要语法。 Groovy将是支持lambda表达式&#xff08;也称为闭包&#xff09;的java的最接近亲戚。 那么什么是la…

ffmpeg文档38-视频源

38 视频源 下面是当前有效的视频源 buffer 缓冲视频帧&#xff0c;其可以作为滤镜链图的环节 它通常用于编程&#xff0c;特别是通过libavfilter/vsrc_buffer.h的接口。 接受如下参数&#xff1a; video_size 指定视频尺寸&#xff0c;(同时指定width 和 height)。语法同于ffmp…

系统架构的演变 -----自 罗文浩

转自&#xff1a;https://my.oschina.net/lwhmdj0823/blog/617713版权声明&#xff1a;罗文浩所有摘要: 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#x…

前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)

前言&#xff1a;作为一名前端开发程序猿&#xff0c;每天都被产品经理催着开发&#xff0c;项目一启动&#xff0c;产品就过来了。嘘寒问暖&#xff1a;大胸弟&#xff0c;你啥时开始做啊&#xff1f;一般我们都会直接告诉TA&#xff0c;你先找接口解决数据问题。而我们也会经…

cron表达式详解

Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;Cron有如下两种语法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month …

将Ehcache添加到Openxava应用程序

介绍 本文介绍如何在Openxava应用程序上快速启用Ehcache&#xff0c;从而提高性能。 查看实体及其图时&#xff0c;将加载关系。 添加第二级缓存可加快关联元素的检索速度&#xff0c;因为已加载的元素是从缓存而不是数据库中检索的。 最终&#xff0c;该页面解释了分钟项目如…

java mongodb 返回所有field_JAVA高级之反射

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;今天跟大家分享JAVA高级之反射的知识。一、什么是反射反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所以属性和方法&#xff1b;对于…

Linux入门笔记——cal、date、free、clear、history、man、whatis、uname

1、cal 显示日历2、date 显示系统当前的日期和时间3、df查看磁盘剩余空间的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容4、free显示空闲内存的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容5、clear清除控制终端显示…

使用ASM 4处理Java类文件–第一部分:世界,您好!

什么是ASM &#xff1a;ASM是一个用于处理Java字节码的开源Java库。 因此&#xff0c;它具有与Apache BCEL相同的目的。 由于本文假定读者具有Java类文件格式的某些知识&#xff0c;因此建议在此处进行阅读。 那么它与BCEL有何不同&#xff1f; 首先&#xff0c;它允许使用事件…

(转)C#程序开发中经常遇到的10条实用的代码

原文地址&#xff1a;http://www.cnblogs.com/JamesLi2015/p/3147986.html 1 读取操作系统和CLR的版本 OperatingSystem os System.Environment.OSVersion; Console.WriteLine(“Platform: {0}”, os.Platform); Console.WriteLine(“Service Pack: {0}”, os.ServicePack); …

Ueditor的配置及使用

Ueditor官网&#xff1a;http://ueditor.baidu.com/website/ &#xff08;项目需要JSP版本&#xff1a;UTF-8版&#xff09; 1.配置 <script type"text/javascript" charset"utf-8">window.UEDITOR_HOME_URL "${ctx}/assets/plugins/uedi…

努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...

很多人都想用电脑端运行手机APP&#xff0c;但是又不知道怎么操作。纵横170yun小编推荐大家使用显卡服务器&#xff0c;在显卡服务器上运行安卓模拟器。让你轻轻松松在电脑端运行手机APP&#xff0c;甚至还可以多开噢 。如果你的电脑没有显卡&#xff0c;也没有关系&#xff0c…

Linux入门笔记——系统目录结构

目录 评论 / 根目录&#xff0c;万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核&#xff0c;最初的 RAM 磁盘映像&#xff08;系统启动时&#xff0c;由驱动程序所需&#xff09;&#xff0c;和 启动加载程序。 有趣的文件&#xff1a; /boot/…

线程故事:关于健壮的线程池

我的主题系列的另一个博客。 这次是关于线程池&#xff0c;尤其是可靠的线程池设置。 在Java中&#xff0c;线程池由Java 5中引入的ThreadPoolExecutor类实现。该类的Javadoc组织得很好。 因此&#xff0c;我不遗余力地在此处进行概述。 基本上&#xff0c; ThreadPoolExecutor…