日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 默认站点!

默认站点

當前位置: 首頁 >

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

發布時間:2023/12/3 26 豆豆
默认站点 收集整理的這篇文章主要介紹了 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的博客 。

離線示例

現在,我將向您展示一個簡單的程序,我認為這是一個非常明顯的分類示例。 我們將郵件分為垃圾郵件和非垃圾郵件(研究人員將其稱為火腿)。 步驟如下:
  • 從網上獲取火腿/垃圾郵件語料庫(當然已經分類了)。
  • 用語料庫的80%訓練分類器,剩下20%進行測試
  • 創建一個簡單的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:构建垃圾邮件过滤器服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得默认站点網站內容還不錯,歡迎將默认站点推薦給好友。