Apache Mahout:构建垃圾邮件过滤器服务器
受到Google關(guān)于Map Reduce和Google Filesystem的一些著名論文的啟發(fā),這些新功能用于將索引分發(fā)到Nutch,并添加到Nutch中,這些功能最終由他們自己擁有: Hadoop 。 從那時(shí)起,許多項(xiàng)目都通過Hadoop開發(fā)。 我們正面臨由Lucene火花點(diǎn)燃的開源代碼的大爆炸。
所有這些項(xiàng)目都在某種程度上與內(nèi)容處理有關(guān)。 對(duì)于所有對(duì)搜索和信息檢索感興趣的人,現(xiàn)在我們將討論該領(lǐng)域的另一個(gè)項(xiàng)目,該項(xiàng)目不在搜索的嚴(yán)格范圍之內(nèi),但是可以教會(huì)您一些有關(guān)內(nèi)容處理的有趣知識(shí)。 最近,我一直在閱讀有關(guān)這個(gè)??新庫(kù)Mahout的信息,該庫(kù)在一個(gè)庫(kù)中一起提供了所有那些晦澀而神秘的機(jī)器學(xué)習(xí)算法。 許多現(xiàn)代網(wǎng)站都在使用機(jī)器學(xué)習(xí)技術(shù)。 這些算法相當(dāng)古老且廣為人知,但是由于其在社交網(wǎng)站(facebook比您可能會(huì)成為最好的朋友知道得更多)或Google(了解您的想法并猜測(cè)您可能想寫的內(nèi)容)中的廣泛使用而最近流行。搜索框)。 簡(jiǎn)而言之,如果說計(jì)算機(jī)程序在T任務(wù)中的性能(由P衡量)隨經(jīng)驗(yàn)E的提高而提高,則可以說它是從經(jīng)驗(yàn)E中學(xué)習(xí)有關(guān)某類任務(wù)T和績(jī)效指標(biāo)P的。例如,如果您想制作一個(gè)程序來識(shí)別驗(yàn)證碼,您將擁有: T:識(shí)別驗(yàn)證碼 P:正確識(shí)別的單詞百分比 E:具有正確拼寫的驗(yàn)證碼數(shù)據(jù)庫(kù) 因此,似乎他們所需要的只是計(jì)算能力。 而且他們需要大量的計(jì)算能力。 例如,在有監(jiān)督的機(jī)器學(xué)習(xí)中(我一個(gè)月前才學(xué)到這個(gè)術(shù)語(yǔ),不要指望我會(huì)非常學(xué)術(shù)),您向機(jī)器展示了一些您想要的示例(經(jīng)驗(yàn)),并且機(jī)器從中提取了一些模式。 一個(gè)人學(xué)習(xí)時(shí)的行為幾乎是相同的:從向該人顯示的一些示例中,他使用其過去的知識(shí)來推斷某種模式,這將有助于他對(duì)同一事件的分類。 好吧,計(jì)算機(jī)在學(xué)習(xí)事物方面非常愚蠢,因此您必須向他們展示很多示例來推斷模式。 但是,分類只是問題的一部分。 Mahout的目標(biāo)是三個(gè)大領(lǐng)域(由于該項(xiàng)目相對(duì)較新,將來還會(huì)有更多領(lǐng)域)。 分類,聚類和建議。 這些的典型示例:
- 分類:這是一種有監(jiān)督的學(xué)習(xí),您為機(jī)器提供了…事物的許多實(shí)例(例如文檔)以及它們的類別。 機(jī)器從所有這些機(jī)器中學(xué)習(xí)將已知實(shí)例分類為將來的實(shí)例。
- 聚類:從某種意義上講,它類似于分類,它使事物成組,但是這一分類不受監(jiān)督。 您給機(jī)器提供了很多東西,然后機(jī)器將成組的類似物品組合在一起。
- 建議:這正是IMDb或Amazon對(duì)頁(yè)面底部推薦的電影或書籍的處理方式。 根據(jù)其他用戶的喜歡程度(通過用戶投票的排名明星來衡量),Amazon可以推斷“喜歡這本書的其他用戶也喜歡這些其他人”。
離線示例
現(xiàn)在,我將向您展示一個(gè)簡(jiǎn)單的程序,我認(rèn)為這是一個(gè)非常明顯的分類示例。 我們將郵件分為垃圾郵件和非垃圾郵件(研究人員將其稱為火腿)。 步驟如下:訓(xùn)練分類器時(shí),會(huì)為其提供一個(gè)文件(是,一個(gè)文件),該文件每行包含一個(gè)已經(jīng)分析過的文檔。 “分析”的含義與Lucene分析文檔的含義相同。 實(shí)際上,我們將使用Lucene StandardAnalizer來清理一些文檔并將它們轉(zhuǎn)換為術(shù)語(yǔ)流。 該流將放在此培訓(xùn)文件的一行中,其中第一個(gè)術(shù)語(yǔ)是該項(xiàng)目所屬的類別。 例如,培訓(xùn)文件將如下所示
火腿新mahout版本發(fā)布垃圾郵件現(xiàn)在購(gòu)買偉哥特別折扣
Mahout附帶了一個(gè)小程序,用于將文檔目錄轉(zhuǎn)換為這種格式。 該目錄必須為每個(gè)類別都有一個(gè)內(nèi)部目錄。 在我們的案例中,我們將測(cè)試集分為兩個(gè)目錄,一個(gè)目錄用于測(cè)試,另一個(gè)目錄用于訓(xùn)練(都在<mahout_home> / examples / bin / work / spam中,其中<mahout home>是解壓縮mahout分布的位置) 。我們將分別在其中放置一個(gè)垃圾郵件目錄和一個(gè)火腿目錄。
測(cè)試 火腿垃圾郵件
培養(yǎng) 火腿垃圾郵件
我們手動(dòng)將大約80%的火腿放入火車/火腿中,其余的放入測(cè)試/火腿中,并將垃圾與火車/垃圾郵件和測(cè)試/火腿中的垃圾相同(準(zhǔn)備測(cè)試集從未如此簡(jiǎn)單! !!)接下來,我們將使用以下命令準(zhǔn)備訓(xùn)練和測(cè)試文件
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 默認(rèn)分析器是Lucene分析器(實(shí)際上它包裝在mahout類中) 我們將訓(xùn)練分類器。 訓(xùn)練分類器意味著向mahout提供訓(xùn)練文件,并讓他使用數(shù)據(jù)構(gòu)建內(nèi)部結(jié)構(gòu)(是的,您可以通過使用“內(nèi)部”一詞來推斷出該結(jié)構(gòu)如何工作)。 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目錄中創(chuàng)建的,算法是Bayes(樸素的Bayes),我們正在使用Hadoop分布式文件系統(tǒng)(不是,但是當(dāng)您不使用像Hbase這樣的分布式數(shù)據(jù)庫(kù)時(shí),您會(huì)將該命令告知命令),并且ng是要使用的ngram。 ngram是單詞組。 給予更多的ngram可以為每個(gè)單詞(周圍的單詞)添加更多的上下文。 您使用的ngram越多,結(jié)果應(yīng)該越好。 我們使用1是因?yàn)楦玫慕Y(jié)果顯然會(huì)花費(fèi)更多的處理時(shí)間。 現(xiàn)在,我們使用以下命令運(yùn)行測(cè)試 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一段時(shí)間后,我們得到以下結(jié)果
-------------------------------------------------------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很好的結(jié)果!!!
實(shí)時(shí)對(duì)垃圾郵件進(jìn)行分類的服務(wù)器
但是我們與20newsgroup示例并沒有做任何不同的事情! 現(xiàn)在,如果我們想對(duì)即將到來的郵件進(jìn)行分類,該怎么辦。 我們將創(chuàng)建一個(gè)反垃圾郵件服務(wù)器,郵件服務(wù)器將在其中發(fā)送接收到的所有郵件,如果它是垃圾郵件或垃圾郵件,我們的服務(wù)器將做出響應(yīng)(應(yīng)用此過程) 服務(wù)器將盡可能地簡(jiǎn)單(這只是概念證明): 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();}}} 我們將做一個(gè)非常簡(jiǎn)單的示例,我們將使用一個(gè)簡(jiǎn)單的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();}} 您有一個(gè)數(shù)據(jù)存儲(chǔ)和一個(gè)算法。 數(shù)據(jù)存儲(chǔ)代表您先前創(chuàng)建的訓(xùn)練分類器的模型。 我們正在使用InMemoryBayesDatastore(也有使用Hadoop數(shù)據(jù)庫(kù)的HbaseBayesDatastore),并為其提供了基本路徑和ngrams大小。 我們使用1的ngram來簡(jiǎn)化此示例。 否則,有必要對(duì)分析后的文本構(gòu)造ngram進(jìn)行后處理。該算法是該方法的核心,并且是策略設(shè)計(jì)模式的明顯實(shí)例。 我們正在使用BayesAlgorithm,但是我們可以使用使用互補(bǔ)樸素貝葉斯算法的CbayesAlgorithm。
ClassifierContext是用于對(duì)文檔進(jìn)行分類的接口。
我們可以使用curl測(cè)試我們的服務(wù)器: curl http://localhost:8080/antispam -H "Content-T-Type: text/xml" --data-binary @ham.txt我們得到
{"category":"ham", "time": 10}結(jié)論
如我們所見,垃圾郵件過濾過程可以分為兩部分。 一個(gè)離線過程,其中您已經(jīng)有很多郵件已經(jīng)被某人分類,并訓(xùn)練分類器。 還有一個(gè)在線過程,您可以在其中測(cè)試文檔以使用先前創(chuàng)建的模型對(duì)文檔進(jìn)行分類。 該模型可以發(fā)展,您可以添加更多具有更多信息的文檔,并且在執(zhí)行脫機(jī)處理后,將使用新模型更新在線服務(wù)器。 該模型可能非常大。 這是Hadoop進(jìn)入現(xiàn)場(chǎng)的地方。 脫機(jī)過程可以發(fā)送到運(yùn)行hadoop的群集,并使用相同的庫(kù)(Mahout!)執(zhí)行與完全相同的算法,并更快地獲得結(jié)果。 當(dāng)然,算法是不一樣的,因?yàn)樗怯杉褐锌隙〒碛械臄?shù)千臺(tái)計(jì)算機(jī)(或擁有的兩三臺(tái)PC)并行執(zhí)行的。 Mahout在設(shè)計(jì)時(shí)就考慮了這一點(diǎn)。 它的大多數(shù)算法都是為在Hadoop上工作而量身定制的。 但是有趣的是,它們也可以在沒有測(cè)試目的的情況下工作,或者在您必須將算法合并到服務(wù)器而無需分布式計(jì)算的情況下使用,就像我們?cè)诒疚闹兴龅哪菢印?成為集群用戶和嵌入應(yīng)用程序的各種可能性的組合使Mahout成為使用Web規(guī)模數(shù)據(jù)的現(xiàn)代應(yīng)用程序的強(qiáng)大庫(kù)。參考:來自我們的JCG合作伙伴 Emmanuel Espina的 火腿,垃圾郵件和大象(或如何使用Mahout構(gòu)建垃圾郵件過濾服務(wù)器) ? 在emmaespina博客上。
翻譯自: https://www.javacodegeeks.com/2012/03/apache-mahout-build-spam-filter-server.html
總結(jié)
以上是生活随笔為你收集整理的Apache Mahout:构建垃圾邮件过滤器服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击阻断特定连接是什么(ddos
- 下一篇: PIT和TestNG突变测试简介