我正在尝试使用mahout在this guide之后对一组文档(作为文本文件)执行TFIDF。
我已经成功创建了字典和向量权重,现在我正在尝试访问输出。在指南中,它说你可以轻松地将生成的字典文件的内容加载到Map中,其中令牌索引为键,令牌为值。"
我不知道如何将这个文件加载到地图中,因为他建议,有人知道它是如何完成的吗?
我从文本文件目录创建了我的向量,这是我在运行" ./ mahout seq2sparse ..."时遇到的一个问题。是控制分析仪的-a标志 - 应该是lucene的StandardAnalyzer。当尝试使用此标志运行时,我收到了ClassNotFoundException,但删除该标志解决了问题,我认为默认分析器也是这个,因此输出应该与示例相同。
如果有人知道如何将这本字典加载到地图中,我将永远感激不尽!
詹姆斯
答案 0 :(得分:6)
我已经解决了这个问题,所以我想把它放在谷歌上遇到这个问题的任何人身上。
SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path("<path do dictionary>"), conf);
IntWritable dicKey = new IntWritable();
Text text = new Text();
Map<Integer, String> dictionaryMap = new HashMap();
while (read.next(text, dicKey)) {
dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
}
read.close();
这对我有用,允许我从mahout读取我的字典文件中id到文本的映射。
答案 1 :(得分:1)
Mahout创建了基于StandardAnalyzer构建的 org.apache.mahout.vectorizer.DefaultAnalyzer ,因此您可以在-a标志中使用它。你不能使用StandardAnalyzer,因为它没有没有args的构造函数,这就是你有错误的原因。
答案 2 :(得分:1)
由于上面的代码缺少编译它所需的import语句等,这是一个更全面的版本,可以从命令行读取和转储dict文件的输出
dumpdict.java:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
class DumpDict {
public static void main(String[] args) {
try {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path(args[0]), conf);
IntWritable dicKey = new IntWritable();
Text text = new Text();
// HashMap dictionaryMap = new HashMap();
while (read.next(text, dicKey)) {
// dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
System.out.println(dicKey.toString()+" "+text.toString());
}
read.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
我发现有必要明确告诉java所有jar文件的位置:
export CLASSPATH=`find /path/to/mahout /usr/share/java -name '*.jar' | perl -ne 'chomp; push @jars, $_; END { print "\".:",(join ":",@jars),"\$CLASSPATH\"\n"; }'`
像这样编译:
javac dumpdict.java
像这样跑:
java -cp .:$CLASSPATH DumpDict {path to dict}
(对于使用java的人来说,这可能有点过头了,但对于我们这些经常不使用它的人来说,这可能会节省时间。)