Mahout使用K-Means进行中文文本聚类

一、数据准备

版本说明

使用的Mahout版本为apache-mahout-distribution-0.10.1

使用的Hadoop版本为hadoop-2.3.0-cdh5.0.0

分词

使用爬虫对每个URL的标题、关键词、描述进行爬取,再用中文分词工具进行分词;

(中文分词工具:http://lxw1234.com/archives/2015/07/422.htm

最后,每个URL的分词结果生成一个文本文件,以空格分隔,如:

 
  1. url1.txt
  2. 四驱 旗舰版 多媒体 配置 参数 明细
  3. url2.txt
  4. 代表 四宝 厨艺 视频 烹饪 四宝 如意 金砖 富贵 骑士 视频
  5. url3.txt
  6. 体验 泰国 之旅 曼谷 高尔夫球场 球场 腾讯网 体验 泰国 之旅 曼谷 高尔夫球场 球场
  7. ……

将文本文件转换成SequenceFile

将前面分词后的*.txt压缩上传至Hadoop网关机,解压到一个本地目录,如/tmp/txt/

使用Mahout命令将文本文件转换成SequenceFile,同时会将这么多小文本文件合并成一个Sequence:

 
  1. cd $MAHOUT_HOME/bin
  2. export MAHOUT_LOCAL=true
  3. ./mahout seqdirectory -i file:///tmp/txt/ -o file:///home/lxw1234/txt-seq/ -c UTF-8 -chunk 64 -xm sequential

参数说明:

MAHOUT_LOCAL:指定Mahout是否以本地模式运行;如果该变量值为空,则表示在Hadoop上运行;

seqdirectory:Mahout自带的将文本文件转换成SequenceFile的命令;

-i:输入的文本文件目录;

-o:输出的SequenceFile目录;

-xm sequential:表示在本地执行,而不是用MapReduce执行;

-c UTF8:使用UTF8编码格式;

-chunk 64:64M一个chunk,也就是文件块block,应该和HDFS的块大小一致或成倍数关系;

执行成功后,在本地的/home/lxw1234/txt-seq/目录下生成了chunk-0文件,该文件格式为SequenceFile,可以用hadoop fs –text命令查看文件内容:

 
  1. hadoop fs -text file:///home/lxw1234/txt-seq/chunk-0 | more
  2. /url809.txt 哈弗 精英 网易 精英 图片 哈弗 精英 哈弗 精英 车厢 内饰 哈弗 精英 细节 图片 哈弗 精英 经销商 图片
  3.  
  4. /url1369.txt 内饰 基本 不变 凤凰网 内饰 基本 不变
  5.  
  6. /url2625.txt 浪琴 按钮 致敬 历史 传统
  7.  
  8. /url2267.txt 一汽 马自达 阿特 少量
  9.  
  10. /url1831.txt 广州 的哥 收入 减半 租车公司 广州 的哥 收入 广州 的哥 离职 广州
  11.  

将文本文件转换成SequenceFile也可以自己写程序来完成,Mahout也提供了相应的API。

将转换好的SequenceFile上传至HDFS

hadoop fs -mkdir /tmp/mahout/txt-seq/

hadoop fs -put /home/lxw1234/txt-seq/chunk-0 /tmp/mahout/txt-seq/

将SequenceFile上传至HDFS的/tmp/mahout/txt-seq/目录

 

二、解析SequenceFile,转换成向量表示

Mahout聚类算法使用向量空间(Vectors)作为数据数据。

接下来在Hadoop上,使用之前生成的SequenceFile,转换成向量表示:

使用命令:

 
  1. cd $MAHOUT_HOME/bin
  2. export MAHOUT_LOCAL=
  3. export HADOOP_CLASSPATH=/home/lxw1234/apache-mahout-distribution-0.10.1/lib/lucene-analyzers-common-4.6.1.jar:
  4. /home/lxw1234/apache-mahout-distribution-0.10.1/lib/lucene-core-4.6.1.jar:$HADOOP_CLASSPATH
  5. ./mahout seq2sparse -i /tmp/mahout/txt-seq/ -o /tmp/mahout/txt-sparse -ow \
  6. --weight tfidf --maxDFPercent 90 --namedVector \
  7. -a org.apache.lucene.analysis.core.WhitespaceAnalyzer

参数说明:

MAHOUT_LOCAL:由于要在Hadoop上完成转换,因此,设该变量值为空;

HADOOP_CLASSPATH:加入需要的jar包到Hadoop的classpath,这两个jar包主要是mahout用来分词的;

seq2sparse:Mahout自带的解析向量的命令;

-i:输入的SequenceFile目录;

-o:输出目录;

-ow:当输出目录存在时,覆盖;

–weight tfidf:权重公式,可选的有tfidf和tf;

–maxDFPercent:过滤高频词,当DF值大于90%时候,将会被过滤掉;

–namedVector:生成的向量同时输出附加信息;

-a:指定分词器;由于Mahout本身对中文支持不好,前面已经将中文做好了分词,以空格分隔,这里指定的WhitespaceAnalyzer是以空格为分隔符的分词器;

 

其他可能有用的选项:

–minDF:最小DF阈值;

–minSupport:最小的支持度阈值,默认为2;

–maxNGramSize:是否创建ngram,默认为1。建议一般设定到2就够了;

–minLLR:The minimum Log Likelihood Ratio。默认为1.0。当设定了-ng > 1后,建议设置为较大的值,只过滤有意义的N-Gram。

–logNormalize:是否对输出向量做Log变换;

其他可输入命令./mahout seq2sparse –help 来查看。

 

在HDFS上查看解析后的结果:

 
  1. hadoop fs -ls /tmp/mahout/txt-sparse
  2. Found 7 items
  3. /tmp/mahout/txt-sparse/df-count
  4. /tmp/mahout/txt-sparse/dictionary.file-0
  5. /tmp/mahout/txt-sparse/frequency.file-0
  6. /tmp/mahout/txt-sparse/tf-vectors
  7. /tmp/mahout/txt-sparse/tfidf-vectors
  8. /tmp/mahout/txt-sparse/tokenized-documents
  9. /tmp/mahout/txt-sparse/wordcount
  10.  

各个文件的用途:

  • file-0:文件。词文本 -> 词id(int)的映射。词转化为id,这是常见做法。
 
  1. hadoop fs -text /tmp/mahout/txt-sparse/dictionary.file-0 | more
  2. 一发不可收拾 0
  3. 万元 1
  4. 两种 2
  5. 书店 3
  6. 书画 4
  7. 以上 5
  8. 低于 6
  9. 偷窥 7
  10. 全部 8
  11. 写真 9
  12. 前排 10
  13.  

 

  • df-count:目录。词id->文档频率(df);
 
  1. hadoop fs -text /tmp/mahout/txt-sparse/df-count/* | more
  2. 0 1
  3. 15 2
  4. 30 4
  5. 45 7
  6. 60 2
  7. 75 1
  8. 90 6
  9. 105 1
  10. 120 5
  11. 135 1
  12. 150 2
  13. 165 2
  14. 180 2
  15.  

 

  • file:词id -> 文档集词频(cf)。
 
  1. hadoop fs -text /tmp/mahout/txt-sparse/frequency.file-0 | more
  2. 0 1
  3. 15 2
  4. 30 4
  5. 45 7
  6. 60 2
  7. 75 1
  8. 90 6
  9. 105 1
  10. 120 5
  11. 135 1
  12. 150 2
  13. 165 2
  14. 180 2
  15. 195 470
  16.  

 

  • wordcount:目录。词文本 -> 文档集词频(cf),这个应该是各种过滤处理之前的信息。
 
  1. hadoop fs -text /tmp/mahout/txt-sparse/wordcount/* | more
  2. 一发不可收拾 2
  3. 万元 220
  4. 两种 2
  5. 书店 2
  6. 书画 2
  7. 以上 2
  8. 低于 2
  9. 偷窥 3
  10. 全部 2
  11. 写真 3
  12. 前排 11
  13.  

 

  • tf-vectors、tfidf-vectors:目录。词向量,每篇文档一行,格式为{词id:特征值},其中特征值为tf或tfidf。采用了内置类型VectorWritable,需要用命令”mahout vectordump -i <path>”查看。
 
  1. ./mahout vectordump -i /tmp/mahout/txt-sparse/tf-vectors/ | more
  2. {346:1.0,208:1.0,1532:1.0,668:1.0,238:1.0}
  3. {390:2.0,367:1.0,844:2.0,692:2.0,952:1.0}
  4. {1070:1.0}
  5. {896:1.0,1341:1.0,434:1.0,153:6.0,195:1.0,838:1.0,1005:1.0,739:3.0,1025:1.0,1480:6.0,707:6.0}
  6. {896:1.0,1341:1.0,838:1.0,153:6.0,195:1.0,1480:6.0,739:3.0,707:6.0}
  7. {896:1.0,1341:1.0,838:1.0,153:6.0,195:1.0,1480:6.0,1005:1.0,739:3.0,707:6.0}
  8.  
  9. ./mahout vectordump -i /tmp/mahout/txt-sparse/tfidf-vectors/ | more
  10. {346:5.210176467895508,208:4.858778476715088,1532:7.749150276184082,668:6.545177459716797,238:6.075173854827881}
  11. {390:7.129191875457764,367:7.749150276184082,844:11.532367706298828,692:11.532367706298828,952:7.749150276184082}
  12. {1070:7.749150276184082}
  13. {896:3.622015953063965,1341:2.697159767150879,434:7.2383246421813965,153:16.578933715820312,195:2.692904472351074,838:2.680246114730835,1005:3.03
  14. 6621570587158,739:4.602833271026611,1025:7.2383246421813965,1480:16.578933715820312,707:10.790275573730469}
  15. {896:3.622015953063965,1341:2.697159767150879,838:2.680246114730835,153:16.578933715820312,195:2.692904472351074,1480:16.578933715820312,739:4.60
  16. 2833271026611,707:10.790275573730469}
  17.  

 

  • tokenized-documents:分词后的文档。

 

三、运行K-Means

 
  1. cd $MAHOUT_HOME/bin
  2. export MAHOUT_LOCAL=
  3. ./mahout kmeans -i /tmp/mahout/txt-sparse/tfidf-vectors -c /tmp/mahout/txt-kmeans-clusters \
  4. -o /tmp/mahout/txt-kmeans -k 30 \
  5. -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 300 -ow --clustering
  6.  

参数说明:

-i:输入为上面产出的tfidf向量。

-o:每一轮迭代的结果将输出在这里。

-k:几个簇,即最终聚为几个类别。

-c:若不设定k,则用这个目录里面的点,作为聚类中心点。否则,随机选择k个点,作为中心点。

-dm:距离公式,文本类型推荐用cosine距离。

-x:最大迭代次数。

–clustering:在mapreduce模式运行。

–convergenceDelta:迭代收敛阈值,默认0.5,对于Cosine来说略大。

输出1,初始随机选择的中心点;

hadoop fs -ls /tmp/mahout/txt-kmeans-clusters

Found 1 items

/tmp/mahout/txt-kmeans-clusters/part-randomSeed

 

输出2,聚类过程、结果:

hadoop fs -ls /tmp/mahout/txt-kmeans

Found 5 items

/tmp/mahout/txt-kmeans/_policy

/tmp/mahout/txt-kmeans/clusteredPoints

/tmp/mahout/txt-kmeans/clusters-0

/tmp/mahout/txt-kmeans/clusters-1

/tmp/mahout/txt-kmeans/clusters-2-final

 

其中,clusters-k(-final)为每次迭代后,簇的30个中心点的信息。

四、查看聚类结果

由于Mahout的clusterdump命令只能在本地运行,因此需要将聚类结果从HDFS下载到本地:

hadoop fs -get /tmp/mahout/txt-kmeans/ /home/lxw1234/

hadoop fs -get /tmp/mahout/txt-sparse/ /home/lxw1234/

运行命令:

 
  1. cd $MAHOUT_HOME/bin
  2. export MAHOUT_LOCAL=true
  3. ./mahout clusterdump -i /home/lxw1234/txt-kmeans/clusters-2-final \
  4. -d /home/lxw1234/txt-sparse/dictionary.file-0 -dt sequencefile \
  5. -o /home/lxw1234/txt-kmeans-cluster-dump -n 50
  6.  

参数说明:

-i:输入最终迭代生成的簇结果。

-d:使用 词 -> 词id 映射,使得我们输出结果中,可以直接显示每个簇,权重最高的词文本,而不是词id。

-dt:上面映射类型。

-o:最终产出目录。

-n:每个簇,只输出50个权重最高的词。

 

看看dump出来的结果:

mahout kmeans

出来的聚类结果有些还可以,有些看上去有点不靠谱。

对Mahout的很多参数理解不够,还有待调整。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值