1. 程式人生 > >基於hadoop的分散式分詞程式(庖丁分詞)

基於hadoop的分散式分詞程式(庖丁分詞)

一、使用的分詞包——庖丁分詞器介紹

1.1、簡介:

庖丁系統是個完全基於lucene中文分詞系統,它就是重新建了一個analyzer,叫做PaodingAnalyzer,這個analyer的核心任務就是生成一個可以切詞TokenStream。

1.2、優點:

這裡之所以使用庖丁主要考慮到庖丁的分詞效率比其他的分詞器要高

1.3、缺點:

其分詞有一個缺點

例如下面一段文字:

“發展社群老年活動場所和服務設施”
如果想搜尋日本的和服相關資料,輸入關鍵字“和服”的時候,上面的資料也會被搜尋出來 搜尋引擎是第一步搜尋: 在浩瀚的資訊中,快速集結最後可能是所想要的結果, 按照可能是最好的順序展現出來。
人的眼睛是第二步搜尋: 找尋最符合要求的結果,同時將機器無法輕易識別的少數“無效”結果過濾 “和服”問題,涉及了漢語語義的問題,幾乎不可完全解決(可作為“特例”解決,或通過排序方法,將他排到相對靠後等價解決)。

但是這同時也是庖丁分詞的一個有點,因為對於一般的分詞而言要確定出到底是怎樣的一種組合也只是選擇概率較大的,將可能的組合全部給出給了我們選擇的機會。

——摘自百度百科

二、分詞程式單機測試:

2.1、匯入相應的分詞包、詞典

需要的包:

字典:將整個dic檔案拷貝到src目錄下

2.2、java分詞程式:(注意:這裡並沒有去除噪音和停用詞,只是簡單的測試庖丁分詞的可用性)

  1. publicclass TestPaoding {  
  2.     publicstaticvoid main(String[] args) {  
  3.         String line = "亞洲:中華人民共和國";  
  4.         PaodingAnalyzer analyzer = new PaodingAnalyzer();  
  5.         StringReader sr = new StringReader(line);  
  6.         TokenStream ts = analyzer.tokenStream("", sr);  
  7.         try{  
  8.             while
    (ts.incrementToken()){  
  9.                 CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);  
  10.                 System.out.println(ta.toString());  
  11.             }  
  12.         }catch(Exception e){  
  13.         }  
  14.     }  
  15. }  

2.3、單機程式測試結果:

三、單機程式mapreduce化:

3.1、開發環境:

偽分散式系統

hadoop1.1.2平臺

開發環境eclipse

需要的包跟上面寫的一樣,這裡就不贅餘了

3.2、mapreduce程式:

mapreduce計算框架淺析:

這裡因為只是進行簡單的分詞,沒有必要多個mapper,也不需要reducer。

這裡的inputformat沒有加控制,如果檔案很多時,就一定要對inputformat進行控制,控制分片的大小,這樣才能保證mapreduce的計算效率最高

  1. package test;  
  2. import java.io.IOException;  
  3. import java.io.StringReader;  
  4. import net.paoding.analysis.analyzer.PaodingAnalyzer;  
  5. import org.apache.hadoop.conf.Configuration;  
  6. import org.apache.hadoop.conf.Configured;  
  7. import org.apache.hadoop.fs.Path;  
  8. import org.apache.hadoop.io.LongWritable;  
  9. import org.apache.hadoop.io.Text;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  14. import org.apache.hadoop.util.Tool;  
  15. import org.apache.hadoop.util.ToolRunner;  
  16. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  17. publicclass TestTOkenizer extends Configured implements Tool {  
  18.     publicstaticclass Map extends Mapper<LongWritable,Text,Text,Text>{  
  19.         publicstaticvoid main(String[] args)throws Exception{  
  20.             int res = ToolRunner.run(new Configuration(), new TestTOkenizer(), args);  
  21.             System.exit(res);  
  22.         }  
  23.         //計數器,當在跑資料的時候出錯,計數器就起作用了,能統計出多少資料是成功完成了的
  24.         enum Counter  
  25.         {  
  26.             LINESKIP,  
  27.         }  
  28.         //Map程式
  29.         publicvoid map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{  
  30.             //獲取單行文字內容
  31.             //1 這裡是長江大學石油軟體實驗班,我是張三
  32.             //這裡為了模仿微博分詞過程中前面可能都有一個ID號,所以在輸入的要進行分詞的String中也加入了序號
  33.             String line = value.toString();  
  34.             try
  35.             {  
  36.                 //根據空格進行字串拆分
  37.                 String[] lineSplit = line.split("[\\s]+");  
  38.                 //將第一個序號放在anum變數中
  39.                 String anum = lineSplit[0];  
  40.                 //將文字內容放到bnum變數中
  41.                 String bnum = lineSplit[1];  
  42.                 //初始化庖丁分詞器
  43.                 PaodingAnalyzer analyzer = new PaodingAnalyzer();  
  44.                 //根據文字內容構造StringReader
  45.                 StringReader sr = new StringReader(bnum);  
  46.                 //用來整合分好的單個詞
  47.                 StringBuilder sb = new StringBuilder();  
  48.                 //去停用詞後的文字
  49.                 String resultString="";  
  50.                 //分詞
  51.                 org.apache.lucene.analysis.TokenStream ts = analyzer.tokenStream("", sr);  
  52.                 try{  
  53.                     while(ts.incrementToken()){//將單個分好的片語裝成一個StringBuilder,方便後面的去噪和去停用詞
  54.                         CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);  
  55.                         sb.append(ta.toString()+"   ");  
  56.                     }  
  57.                     //構造去停用詞物件
  58.                     FileExcludeStopWord fileExcludeStopWord = new FileExcludeStopWord();  
  59.                     //去停用詞,返回最終的分詞結果
  60.                     resultString = fileExcludeStopWord.fileExcludeStopWord(sb.toString());  
  61.                 }catch(Exception e){  
  62.                 }  
  63.                 //將結果輸出到hdfs中
  64.                 context.write(new Text(anum), new Text(resultString));  
  65.             }  
  66.             catch(java.lang.ArrayIndexOutOfBoundsException e){  
  67.                 context.getCounter(Counter.LINESKIP).increment(1);  
  68.                 return;  
  69.             }  
  70.         }  
  71.     }  
  72.     //配置、提交任務
  73.     publicint run(String[] args) throws Exception {  
  74.         Configuration conf = getConf();  
  75.         Job job = new Job(conf, "TestTOkenizer");//任務名
  76.         job.setJarByClass(TestTOkenizer.class);  
  77.         FileInputFormat.addInputPath(job, new Path(args[0]));//配置輸入路徑
  78.         FileOutputFormat.setOutputPath(job, new Path(args[1]));//配置輸出路徑
  79.         job.setMapperClass(Map.class);//指定Map類的位置
  80.         job.setOutputFormatClass(org.apache.hadoop.mapreduce.lib.output.TextOutputFormat.class);  
  81.         job.setOutputKeyClass(Text.class);  
  82.         job.setOutputValueClass(Text.class);  
  83.         job.waitForCompletion(true);  
  84.         //接下來的兩句,是自己測試玩的,檢視下job的狀態
  85.         System.out.println("job's name"+job.getJobName());  
  86.         System.out.println("job status"+(job.isSuccessful()?"yes":"no"));  
  87.         return job.isSuccessful()?0:1;  
  88.     }  
  89. }  

3.3、去停用詞類(這個類寫的還不是很完美,停用詞表也還不夠完善,微博資料中,有一些沒包含在停用詞表中)

  1. package test;  
  2. import java.io.BufferedReader;  
  3. import java.io.FileInputStream;  
  4. import java.io.InputStreamReader;  
  5. import java.util.HashSet;  
  6. import java.util.Set;  
  7. publicclass FileExcludeStopWord {  
  8.     publicstaticfinal String stopWordFile = "/home/jonsen/workspace/testPaoding/src/test/stopword.txt";  
  9.     public String fileExcludeStopWord(String splitResultStr) {  
  10.         try {  
  11.             BufferedReader stopWordFileBR = new BufferedReader(  
  12.                     new InputStreamReader(new FileInputStream(stopWordFile)));  
  13.             // 用來存放停用詞的集合
  14.             Set<String> stopWordSet = new HashSet<String>();  
  15.             // 初始化停用詞表
  16.             String stopWord = null;  
  17.             while ((stopWord = stopWordFileBR.readLine()) != null) {  
  18.                 stopWordSet.add(stopWord);  
  19.             }  
  20.             if(stopWordFileBR!=

    相關推薦

    基於hadoop分散式程式

    一、使用的分詞包——庖丁分詞器介紹 1.1、簡介: 庖丁系統是個完全基於lucene的中文分詞系統,它就是重新建了一個analyzer,叫做PaodingAnalyzer,這個analyer的核心任務就是生成一個可以切詞TokenStream。 1.2、優點:

    paoding使用小例子學習筆記

    推薦使用為知筆記(Wiz),它是電腦、手機、平板都能用的雲筆記軟體,使用我的邀請註冊可獲VIP體驗:http://www.wiz.cn/i/02c6808b 做SRT遇到要分詞,以前做了一個分詞系統,但那個是老師提供的詞庫,真要自己來做分詞,沒詞庫怎麼行? 到處找詞庫,找

    Hadoop分散式叢集搭建方法Version: java 1.8+CentOS 6.3

    夏天小廚 前言 大資料這個概念,說的通俗點就是對海量資料的處理分析。據不完全統計,世界百分之九十的資料都由近幾年產生,且不說海量資料的ETL,單從資料的儲存和資料展現的實時性,傳統的單機就已經無法滿足實際場景的需要例如很多OLAP系統。由此引出了Hadoop,Hadoop

    基於Hadoop分散式叢集部署Hive2.3

    1. 基於docker安裝mysql 由於自己以前在Ubuntu kylin 16.04的系統上安裝mysql5.7一直有問題,後來學會了使用docker安裝mysql。覺得這個方法很方便,所以這次繼續使用docker安裝mysql。 ① 安裝docker 參考

    使用Python+jieba和java+在Spark叢集上進行中文統計

    寫在前邊的話:        本篇部落格也是在做豆瓣電影資料的分析過程中,需要對影評資訊和劇情摘要資訊進行分析而寫的一篇部落格        以前學習hadoop時,感覺做中文分詞也沒那麼麻煩,但是到了

    Hadoop分散式叢集環境搭建三節點

    一、安裝準備 建立hadoop賬號 更改ip 安裝Java 更改/etc/profile 配置環境變數 export $JAVA_HOME=/usr/java/jdk1.7.0_71 修改host檔案域名 172.16.133.149 hadoop101

    大資料開發面試部分:正常工作的Hadoop叢集中Hadoop都分別需要啟動哪些程序,它們的作用別是什麼大資料開發面試

    啟動的程序: namenode socondarynamenode datanode ResourceManager(JobTracker)JobTracker NodeManager(TaskTracker) DFSZKFailoverController J

    從零開始搭建hadoop分散式叢集環境:新建hadoop使用者以及使用者組

          搭建hadoop叢集環境不僅master和slaves安裝的hadoop路徑要完全一樣,也要求使用者和組也要完全一致。因此第一步就是新建使用者以及使用者組。對於新手來言,新建使用者使用者組,並賦予適當的許可權無疑是最大的問題。下面請跟隨我來新建使用者以及使用者組

    圖像切割—基於圖的圖像切割Graph-Based Image Segmentation

    子圖 衡量標準 content 彩色 cep 期待 mean 定義 筆記  圖像切割—基於圖的圖像切割(Graph-Based Image Segmentation) Reference: Efficient Graph-Ba

    創建區表按照年份區,自動新增

    rowtype 修改 reat med substr 創建 動態sql pro roc 創建分區表AAA,通過字段創建時間的年份來分區,分區表自動根據插入的數據新增對應的分區,不過此處自動創建的分區名稱為系統創建的,如:SYS_24。 CREATE TABLE AAA

    django中orm頁功能內置

    com 模塊 ren block views ext 如何解決 name view 分批獲取數據的方法 數據庫方法 models.Uinfo.objects.all()[10:20] django自帶的方法 創建一個新的url urlpatterns = [ url

    Android 音視頻深入 十五 FFmpeg 實現基於Rtmp協議的推流附源碼下載

    音視頻 FFmpeg Rtmp 推流 源碼地址https://github.com/979451341/Rtmp 1.配置RTMP服務器 這個我不多說貼兩個博客分別是在mac和windows環境上的,大家跟著弄MAC搭建RTMP服務器https://www.jianshu.com/p/6fce

    塊入門線段樹區間修改

    clu new inline https opened 聽說 線段樹 gis alt 例題地址:嘟嘟嘟 分塊其實我早都聽說過,而且怎麽回事差不多都清楚了,只是一直沒有寫。現在離NOIP2018也挺近了,考慮到分塊有時候確實能水到不少的分,決定這幾天寫一寫。 眾所周知

    一個Python編寫的小程式學生資訊管理系統

    def printInfo(StudentData,StudentName): """ :param StudentData: :param StudentName: :return: """ student = StudentData[Stude

    (轉載)分散式架構 -- 學習路線圖入門到進階

    由於分散式系統所涉及到的領域眾多,知識龐雜,很多新人在最初往往找不到頭緒,不知道從何處下手來一步步學習分散式架構。 本文試圖通過一個最簡單的、常用的分散式系統,來闡述分散式系統中的一些基本問題。 負載均衡 分散式快取 分散式檔案系統/CDN 分散式RPC 分散式資料庫/No

    Hadoop系列 - 本地除錯程式碼不使用jar包

    問題 最近學習Hadoop過程中遇到這樣一個問題:本地開發mapreduce程式,如果mapreduce到輸入和輸出都是設定本地,那麼是可以進行本地Debug的。但是在我把輸入源設成伺服器的HDFS,輸出設為HBase時,發現應用啟動就報某個mapper或Outputformat類找不到

    前端自動環境打包vue和ant design

    ... ole 技術 bsp 期望 命令 port console plugin 現實中的問題:有時候版本上線的時候,打包時忘記切換環境,將測試包推上正式服務器,那你就會被批了。 期望:在寫打包的命令行的時候就覺得自己在打包正式版本,避免推包時候的,不確信自己的包是否正確。

    hadoop埠使用配置總結非常好的總結

    轉自http://www.aboutyun.com/thread-7513-1-1.html   Hadoop叢集的各部分一般都會使用到多個埠,有些是daemon之間進行互動之用,有些是用於RPC訪問以及HTTP訪問。而隨著Hadoop周邊元件的增多,完全記不住哪個埠對應哪個應用,

    基於linux環境tcp網路程式設計線上英英詞典文件【2】

    程式碼: client.c /************************************************************************* File Name: client.c Author: Young

    [原始碼和文件分享]基於java語言的FTP伺服器Ping測試工具軟體

    一 需求分析 已知引數:目的節點IP地址或主機名 設計要求:通過原始套接字程式設計,模擬Ping命令,實現其基本功能,即輸入一個IP地址或一段IP地址的範圍,分別測試其中每個IP地址所對應主機的可達性,並返回耗時、生存時間等引數,並統計成功傳送和回送的Ping報文