Hadoopのword co-occurrence実現


Word Co-occurrenceはずっとどのように正しく訳すべきなことを知らないで、単語の類似度か?それとも共生単語?それとも単語の共生行列ですか?
これは統計の中でよく使われるテキスト処理アルゴリズムで、1組のドキュメントセットのすべての出現頻度が最も近いフレーズを測定するために使用される.ええ、実は文脈のフレーズで、単語ではありません.比較的によく使われるアルゴリズムであり、他の統計アルゴリズムを派生することができる.「人々はこれを見て、それを見ている」という結果を提供することができるので、推薦に使えます.例えば、共同フィルタリング以外のショッピング商品の推薦、クレジットカードのリスク分析、あるいはみんなが何が好きかを計算します.
例えばI love youは、「I love」が現れると同時に「love you」の出現を伴うことが多いが、中国語の処理は英語とは異なり、まず分詞庫で前処理する必要がある.
Mapper,Reducer,Driverのようにコードを分割する
Mapperプログラム:
package wco;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WCoMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

  @Override
  public void map(LongWritable key, Text value, Context context)
      throws IOException, InterruptedException {
    
    /*
     *              .
     */
    String line_lc = value.toString().toLowerCase();
    String before = null;
    
    /*
     *         
     *    key             
     *  value   1
     */
    for (String word : line_lc.split("\\W+")) { //     ,          
      if (word.length() > 0) {
        if (before != null) { //       ,      (         ,       before = word)
          context.write(new Text(before + "," + word), new IntWritable(1));
        }
        before = word; //        
      }
    }
  }
}

Reducerプログラム:
package wco;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WCoReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

  @Override
  public void reduce(Text key, Iterable<IntWritable> values, Context context)
      throws IOException, InterruptedException {

    int wordCount = 0;
    for (IntWritable value : values) {
      wordCount += value.get(); //    word count
    }
    context.write(key, new IntWritable(wordCount));
  }
}

Driverプログラムは説明しません.天下のDriverは同じです.
package wco;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class WCo extends Configured implements Tool {

  @Override
  public int run(String[] args) throws Exception {

    if (args.length != 2) {
      System.out.printf("Usage: hadoop jar wco.WCo <input> <output>
");       return -1;     }     Job job = new Job(getConf());     job.setJarByClass(WCo.class);     job.setJobName("Word Co Occurrence");     FileInputFormat.setInputPaths(job, new Path(args[0]));     FileOutputFormat.setOutputPath(job, new Path(args[1]));     job.setMapperClass(WCoMapper.class);     job.setReducerClass(WCoReducer.class);     job.setOutputKeyClass(Text.class);     job.setOutputValueClass(IntWritable.class);     boolean success = job.waitForCompletion(true);     return success ? 0 : 1;   }   public static void main(String[] args) throws Exception {     int exitCode = ToolRunner.run(new Configuration(), new WCo(), args);     System.exit(exitCode);   } }

アルゴリズムの核心は実は前語と後語を同時に取り出してkeyとしてvalueを加えてword countをし、単語の共生頻度を統計してテキストをクラスタリングすることである.ネット上でk-meansの多くを見て、実は多くの時アルゴリズムは需要によって歩いたので、k-meansあるいはあいまいなkの平均値は必ずしも高くなくて、wordcountも必ずしも貧乏で低いとは限らない.
本文は“実践が真理を検証します”のブログから出て、転載をお断りします!