按键提取tfidf-vectors而不破坏fileformat

时间:2014-05-06 18:34:54

标签: apache-pig extract mahout

我在输出格式seq2sparse中有大约200000个tfidf-vectors。现在我需要提取500但不是随机分割功能。我知道其中500个的键,我需要它们与seq2sparse中的数据格式相同。 当我打开带有200000个条目的序列文件时,我可以看到键被编码 org.apache.hadoop.io.Text和带有org.apache.mahout.math.VectorWritable的值。

但是当我尝试使用时 https://github.com/kevinweil/elephant-bird/blob/master/mahout/src/main/java/com/twitter/elephantbird/pig/mahout/VectorWritableConverter.java

https://github.com/kevinweil/elephant-bird/blob/master/pig/src/main/java/com/twitter/elephantbird/pig/store/SequenceFileStorage.java

在Pig Latin中,为了读取和写入它们,输出有关键和值的org.apache.hadoop.io.Text。

我确实需要这种格式的500个条目,因为我想在trainnb和testnb中使用它们。


基本上,我知道如何做一些类似于mahout seqdumper的反向就足够了。

1 个答案:

答案 0 :(得分:0)

虽然没有特定的Mahout命令来执行此操作,但您可以编写一个相对简单的实用程序函数。使用Mahout&#39>:

org.apache.mahout.common.Pair;
org.apache.mahout.common.iterator.sequencefile.SequenceFileIterable;
org.apache.mahout.math.VectorWritable;  

org.apache.hadoop.io.SequenceFile;
org.apache.hadoop.io.Text;
com.google.common.io.Closeables;

您可以执行以下操作:

// load up the 500 desired keys with some function
Vector<Text>desiredKeys = getDesiredKeys();
//create a new SequenceFile writer for the 500 Desired Vectors 
SequenceFile.Writer writer =
        SequenceFile.createWriter(fs, conf, output500filePath ,
                                  Text.class,
                                  VectorWritable.class);         
try {
  // create an iterator over the tfidfVector sequence file 
  SequenceFileIterable<Text, VectorWritable>seqFileIterable =
          new SequenceFileIterable<Text, VectorWritable>(
              tfidfVectorPath, true, conf)

  // loop over tfidf sequence file and write out only Pairs with keys
  // contained in the desiredKeys Vector to the output500file 
  for (Pair<Text, VectorWritable> pair : seqFileIterable) {
      if(desiredKeys.contains(pair.getFirst())){
            writer.append(pair.getFirst(),pair.getSecond());
      }
  }
}finally {
  Closeables.close(writer, false);
}

并使用&#34; output500file&#34;的路径。为trainnb的输入。使用vector.contains()不是最有效的方法,但这是一般的想法。