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.pswp.cn/news/373657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373657.shtml
英文地址,請注明出處:http://en.pswp.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…