mahout0.9 hadoop2.x 编译

原网址:http://my.oschina.net/u/1047640/blog/262468
摘要
严格来说是mahout1.0 。这篇主要是搭建环境,在命令行进行中文文本分类,下篇将使用api和命令行构造的分类器对每篇文章分类,实现一个对用户打标签的应用。

一、准备环境。

     到我写这个的时候,mahout还是0.9版本,官网上发行的0.9版本不能跑在hadoop2.x上。不过最新的代码已经支持hadoop2.x了。所以自己编译一下也是ok的,因为实在不想换hadoop。这是棘轮效应吧,人总是往上爬容易,退回来比较难。
    废话不多说。首先要装了hadoop2.2.  svn  maven。最新的代码可以从svn上拷贝下来。地址是:

http://svn.apache.org/repos/asf/mahout/trunk

    我是用eclipse的svn插件直接导入的。导入到eclipse中是一个项目,里面全是文件夹,非常不好看。于是删除了eclipse project_explorer中的项目,重新import maven project,选择根目录。eclipse maven插件过时的应该导入不进来,会提示要安装两个maven connector,然后会说sl4j-1.6.2找不到。这个问题很头疼,我没办法,去网上下载了一个sl4j-1.6.4.jar,改名为sl4j-1.6.2.jar,然后放到eclipse的plugin目录下,重启eclipse之后,就可以导入了。导入之后,最后两个关于spark的子项目还是会有错。这还是因为maven插件的缘故。点开eclipse的插件安装页面,到下面这个网址"Maven for Scala" - http://alchim31.free.fr/m2e-scala/update-site
安装最后一个选项,scala组件。然后再次刷新整个项目,就可以看到mahout的全貌了。

可以看到最新的mahout里面,core项目改成了mrlegacy.据说mahout以后也不再继续发展mapreduce了,已经在开始开发spark了。
mrlegacy就是mapreduce核心算法的包,examples后来打成在hadoop上运行的jar包,我们到时候用命令行的时候 mahout脚本用来hadoop jar example-0.9-job.jar的。
当我们运行命令的时候 比如mahout seqdirectory -i docs -o seqdocs的时候,实际上执行了mahout.sh这个脚本,这个脚本会看你是单机还是hadoop模式 ,然后看有没有找到example-0.9-job.jar,如果是hadoop模式,会自动运行

hadoop example-0.9-job.jar org.apache.mahout.text.SequenceFilesFromDirectory -i docs -o seqdocs

这条命令。而类和命令的对应关系,在/mahout/src/conf/driver.classes.default.props这个文件里。 了解了这个之后,就很容易看mahout源码了。

准备中文分词工具。打开examples项目下的pom.xml看到,mahout现在用的是lucene4.6.1. 我翻了一下lucene4.6.1没有找到SmartChineseAnalyzer这个类,只找到了ChineseAnalyzer,这个只能分字,完全不能分词。然后搜索了一下,发现mmseg4j已经支持lucene4.6.1了。所以在pom.xml里添加下面这个依赖,导入mmseg4j的包。

<dependency>
    <groupId>com.chenlb.mmseg4j</groupId>
    <artifactId>mmseg4j-solr</artifactId>
    <version>2.0.0</version>
</dependency>

加入了mmseg4j的包,没有写<scope></scope>也就是maven的默认compile范围,这个范围内的jar都会被打包,也就是说,等会我们打玩包,examples-job.jar中会有mmseg4j, 这样就不用担心hadoop上跑的时候找不到class了。

这些工作都搞好后,就可以编译打包了。

cd workspace
cd mahout
mvn clean install -Dhadoop2 -Dhadoop2.version=2.2.0 -DskipTest=true
或者mvn package -Dhadoop2 -Dhadoop2.version=2.2.0 -DskipTest=true
或者在eclipse里游击mahout项目下的pom.xml右键run as xxx 但是要记得加-Dhadoop2
 -Dhadoop2.version=2.2.0这两个参数

maven 运行完之后就会在各个项目下的target下生成相应的jar包。我们只需要mahout-examples-1.0-SNASHOT-job.jar 和 mahout-examples-1.0-SNASHOT.jar. 我就比较偷懒,直接把这两个的名字改成0.9.jar替换掉了我以前安装的那个0.9的两个包。 如果只要某个项目,就到那个子项目的文件夹下mvn.下面是编译时间


二、数据准备。

    mahout在命令行模式下要求的文本是这个结构的:每个类别的文件,放到同一个文件夹下,文件夹的名称就是类别。看下我的数据: 

在我的docs目录下,有mp3 camera等目录,每个目录下都是一篇篇文章。


三、命令和结果。

然后我运行了

mahout seqdirectory -i docs -o seqdocs

注意,docs是在hadoop上的,不是本地的。如果你跑本地的,那输入输出都应该在本地,还要

export MAHOUT_LOCAL=true

上面是第一步,生成了序列化文件。序列化后的文件,可以通过hadoop的text或者mahout 的seqdumper命令查看


接下来就是一对命令,一个个来了,我是参照mahout官网上的20newsgroup敲的命令
将序列化文件分词,变成向量文件,然后分开成训练集和测试集。

mahout seq2sparse -i seqdocs  -o vectors -lnorm -nv -wt tfidf
mahout split -i vectors/tfidf-vectors --trainingOutput train --testOutput test 
 --randomSelectionPct 40 --overwrite --sequenceFiles -xm sequential

注意上面的命令有点坑爹,输入目录并不是vectors,而是这个文件夹下的另外一个文件夹,就为这个疏忽,我苦战两晚都没成功 。下面训练模型。model是指定模型存在哪里。labelindex表示把labelindex文件放到哪里。

mahout trainnb  -i train -el 
        -o model 
        -li labelindex 
        -ow 
        -c

加了c表示是c贝叶斯。不要忘记了-el,表示从输入目录生成labelindex文件。

mahhout testnb 
        -i test
        -m model 
        -l labelindex 
        -ow 
        -o testresult 
        -c

成功的话会在屏幕上输出结果,效果非常不错:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。首先,Mahout是一个基于Hadoop的机器学习框架,可以用于实现各种机器学习算法,包括协同过滤推荐算法。Mahout中的推荐算法实现了多种模型,包括基于用户的协同过滤、基于物品的协同过滤和隐式反馈等。 而你的问题是如何使用Mahout 0.9版本中的ReloadFromJDBCDataModel连接MySQL,并采用SVD推荐算法。下面是具体的步骤: 1. 首先,你需要在MySQL中创建一个数据表,用于存储用户和物品之间的评分数据。数据表至少需要包含三个字段:用户ID、物品ID和评分值。可以使用以下SQL语句创建数据表: ``` CREATE TABLE ratings ( user_id INT NOT NULL, item_id INT NOT NULL, rating FLOAT NOT NULL, PRIMARY KEY (user_id, item_id) ); ``` 2. 然后,在Mahout中使用ReloadFromJDBCDataModel类连接MySQL数据库。具体的代码如下: ``` String url = "jdbc:mysql://<host>:<port>/<database>"; String user = "<username>"; String password = "<password>"; DataModel model = new ReloadFromJDBCDataModel(url, user, password); ``` 其中,<host>是MySQL服务器的主机名或IP地址,<port>是MySQL服务器的端口号,<database>是要连接的数据库名,<username>和<password>是登录MySQL数据库所需的用户名和密码。 3. 接下来,使用SVD推荐算法对评分数据进行建模和预测。具体的代码如下: ``` RecommenderBuilder builder = new SVDRecommenderBuilder(); Recommender recommender = builder.buildRecommender(model); ``` 其中,RecommenderBuilder是一个接口,用于创建推荐器模型。SVDRecommenderBuilder是Mahout中实现SVD推荐算法的类。buildRecommender()方法用于创建推荐器模型。 4. 最后,使用推荐器模型进行预测。具体的代码如下: ``` int userId = <user_id>; int numRecommendations = <num_recommendations>; List<RecommendedItem> recommendations = recommender.recommend(userId, numRecommendations); ``` 其中,<user_id>是要为其进行推荐的用户ID,<num_recommendations>是要生成的推荐物品数量。recommend()方法用于生成推荐结果,返回一个RecommendedItem列表,每个RecommendedItem对象包含一个物品ID和一个预测评分值。 以上就是使用Mahout 0.9版本中的ReloadFromJDBCDataModel连接MySQL并采用SVD推荐算法的具体步骤。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值