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

Apache Mahout:构建垃圾邮件过滤器服务器相关推荐

  1. 什么是垃圾邮件过滤器,它的原理是什么?

    什么是垃圾邮件过滤器 垃圾邮件过滤器是一个程序,可检测未经请求和不需要的电子邮件(垃圾邮件)并阻止它们到达收件人的收件箱. 垃圾邮件过滤器还根据特定标准组织邮件.例如,Gmail 用户将他们的邮件分类 ...

  2. 防止Domino邮件服务器作为垃圾邮件转发服务器

    故障原因: Domino邮件服务器被作为垃圾邮件转发服务器,造成邮件收发严重阻塞 解决方法: 在服务器配置的"路由/smtp"---- "限制与控制" ---- ...

  3. wordpress撰写模式_如何在WordPress中撰写好的博客评论并绕过垃圾邮件过滤器

    wordpress撰写模式 Have you ever thought about what makes a good blog comment? Want to know of a sure-fir ...

  4. 基于 Apache Mahout 构建社会化推荐引擎

    http://www.ibm.com/developerworks/cn/java/j-lo-mahout/ Web 2.0 的一个核心思想就是"群体智慧",即基于大众行为,为每个 ...

  5. 千万当心!不启用代理功能,网站也有可能被恶意用作垃圾邮件发送服务器

    摘要:         最近巡检网站时,发现有大量的异常链接,如"tcp        0    912 hhrz.org:80          125.224.196.186:1087  ...

  6. 垃圾邮件分类器_如何在10个步骤中构建垃圾邮件分类器

    垃圾邮件分类器 If you're just starting out in Machine Learning, chances are you'll be undertaking a classif ...

  7. 集体智慧编程——垃圾邮件过滤器(贝叶斯)-Python实现

    介绍垃圾邮件分类器的设计与实现,分为一下几个步骤: 特征提取: 将训练样本的正文切分为特征,如果是英文,直接按照空格切分,每个词可以作为一个特征:如果是中文,则需要借助分词器,如jieba分词器等.切 ...

  8. python垃圾邮件过滤_垃圾邮件过滤器Python newbi

    我需要能够处理数据集,应用我的分类算法(我选择了3个朴素的bayes版本),打印精度得分到终端,并执行5到10倍交叉验证,找出有多少电子邮件是垃圾邮件. 正如你所看到的,我已经完成了一些任务,但是没有 ...

  9. 大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型

最新文章

  1. 如何在5美元的Raspberry Pi上构建个人开发服务器
  2. 干货|一文读懂中国7大支付体系(附27页流程图)
  3. C#读写word,文段及表格
  4. 判断是否是数组的方法
  5. html页面foot,HTML tfoot用法及代码示例
  6. 基于python开发的口罩供需平台
  7. 贪心算法求解问题的选择准则
  8. php手机网页_使用PHPCMS搭建wap手机网站
  9. 计件工资系统c语言,计件工资管理系统
  10. 计算机考研402,2021双非无项目科班402分上岸中科大-数学经验+复试全过程
  11. 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
  12. 分享高压超低噪声LDO测试结果(High Voltage Ultra-low Noise LDO)
  13. UOS其他分区及移动硬盘带锁问题处理
  14. 嵌入式主板有哪些特点?
  15. 在VMware8.0下安装crux2.6
  16. android设置个性桌面,秀出真个性 Android桌面美化类软件横评
  17. 侯捷 C++系列课程视频 | 侯捷 C++ STL 视频
  18. SAP接口debug设置外部断点
  19. Centos7单机安装torque6.1.2
  20. 数据结构自学笔记(C语言)十大排序

热门文章

  1. leetcode初级算法2.旋转数组
  2. 如何添加数据到session中
  3. aws mfa 认证_如何为您的AWS账户设置多因素身份验证(MFA)
  4. java对话_您应该保持联系的十大高级Java对话
  5. jvm高并发_JVM上的高并发HTTP客户端
  6. 候选JEP:记录和密封类型
  7. java 挥发注解_Java的挥发性修饰符
  8. udt java_Java DB中的Java用户定义类型(UDT)
  9. Spring Cloud Netflix尤里卡
  10. 反射和内省_单例设计模式–内省和最佳实践