mahout0.6 api调用
1.首先在解压缩的mahout文件中可以看到core包,该包是调用mahout api必须引入的jar包,
另外,该包里的driver.classes.default.props中记录了每个命令跟调用类的映射对应关系。
1.1 打开mahout源码包(可以通过maven部署在elicpse上),分析一下testClassifier类:
1.2 main函数会用很大的篇幅来处理命令输入的参数,BayesParameters params=new BayesParameters (),
params就是用来存储这些参数的.
1.3 根据这些参数,确定运行的是线性还是并行的作业,并启动一个作业,进入bayes的driver类BayesClassifierDriver中
1.4 BayesClassifierDriver的runJob的参数就是params,用Hadoop旧的api配置作业的过程,作业是在mapper中对作业进行分类的,所以要调用分类器的模型,这就需要将贝叶斯模型的相关参数存入作业当中去,即conf.set("bayes.parameters",params.toString()).接下来进入mapper类BayesClassifierMapper
1.5 BayesClassifierMapper中的configure函数相当于新api中的setup函数,是在map之前需要做的工作,目的就是为了建立分类器。
1.5.1首先读取driver中的params,
BayesParameters params=new BayesParameters (job.get("bayes.parameters"),"");
algorithm用来指定分类器算法,datastore用来存储模型结果,根据选择的算法,new出相应对象,比如选择朴素bayes,
algorithm= new BayesAlgorithm(), datastore =new InMemoryBayesDatastore(params);如果选择Cbayes,则algorithm= new CBayesAlgorithm(), datastore =new InMemoryBayesDatastore(params);
1.5.2 然后就可以生成并初始化分类器对象,classifier =new ClassifierContext(algorithm,datastore),classifier.initialize(),这样就建立起了一个分类器。
1.5.3 之后获取map的两个私有变量:默认分类defaultCategory和构成特征词数目gramSize,defaultCategory=params.get("defaultCat"),gramSize=params.getGramSize(),这样在configure函数中就建立了分类器
1.6map函数<Text key,Text value,OutputCollector<>output>,key指类别,value指分词结果
1.6.1 首先建立ngrams集合List<String>ngrams=new NGrams(value.toString(),gramSize).generateNGramsWithoutLabel(),用来存储某篇文章特征集合
1.6.2 然后调用分类器的分类方法,ClassifierResult result=classifier.classifyDocument(ngrams.toArray(new String(ngrams.size())),defaultCategory)
1.6.3最终,通过result.getlabel()得到相应类别