Mahout文本聚类学习之DictionaryVectorizer类(4)

  下面最后一步操作就是把文档集向量的不同部分做合并操作就可以了,可以想象出直接用向量的加法运算就可以完成这个功能。此功能对应mergePartialVectors()函数,它会执行一个MapReduce操作完成合并。

    job.setMapperClass(Mapper.class);
    job.setInputFormatClass(SequenceFileInputFormat.class);
    job.setReducerClass(PartialVectorMergeReducer.class);
    job.setOutputFormatClass(SequenceFileOutputFormat.class);
    job.setNumReduceTasks(numReducers);

从上面的代码可以看到PartialVectorMergeReducer是关键,Mapper只是将不同路径中的序列文件读了出来。

protected void reduce(WritableComparable<?> key, Iterable<VectorWritable> values, Context context) throws IOException,
      InterruptedException {

    Vector vector = new RandomAccessSparseVector(dimension, 10);
    //这一步做了一个向量的加法运算,最终会得到每一个由Key标记的文档完整向量!!
    for (VectorWritable value : values) {
      vector.assign(value.get(), Functions.PLUS);
    }
    //规范化操作
    if (normPower != PartialVectorMerger.NO_NORMALIZING) {
      if (logNormalize) {
        vector = vector.logNormalize(normPower);
      } else {
        vector = vector.normalize(normPower);
      }
    }
    if (sequentialAccess) {
      vector = new SequentialAccessSparseVector(vector);
    }
    
    if (namedVector) {
      vector = new NamedVector(vector, key.toString());
    }
    
    VectorWritable vectorWritable = new VectorWritable(vector);
    context.write(key, vectorWritable);
  }

致此完成了文档正规化词频的向量化操作。

posted @ 2012-09-27 19:24  answer0107  阅读(280)  评论(0)    收藏  举报