春山征吾のWiki - Mahout/kmeans

Hadoop は使ってない.

参考

Lucene/Solr にデータをいれる.


データは以前デモ用に作成した自分のソーシャルブックマークから作ったものを利用する.
(desc は自分のコメント, bodyは本文抽出したもの.)

元データには title がないデータもあるが, 結果の見易さのために title を uniqueKey とした.

計4299件.

schema.xml の抜粋

<fields>
        <field name="uuid"   type="ignored"    />
        <field name="url"    type="string"  indexed="true" stored="true" required="true" />
        <field name="title"  type="string"  indexed="true" stored="true"  termVectors="true" />
        <field name="desc"   type="text_ja" indexed="true" stored="false" termVectors="true" multiValued="true"/>
        <field name="tag"    type="text_ws" indexed="true" stored="false" termVectors="true" multiValued="true"/>
        <field name="body"   type="text_ja" indexed="true" stored="false" termVectors="true" multiValued="true"/>
        <field name="timestamp" type="tdate" indexed="true" stored="true" />

        <field name="text" type="text_ja" indexed="true" stored="false" multiValued="true" termVectors="true" />
</fields>

<uniqueKey>title</uniqueKey>

<copyField source="title" dest="text"/>
<copyField source="desc"  dest="text"/>
<copyField source="tag"   dest="text"/>
<copyField source="body"  dest="text"/>

Lucene のインデックスから Mahout の Vector 作成



bin/mahout lucene.vector --dir ~/work/Solr/sbm/solr/collection1/data/index --dictOut sbm/dict --output sbm/output --field text --idField title

このデータでは body などは空の場合があるので, もしやるなら --maxPercentErrorDocs を適切に指定する必要があるようだ.

Canopy


t1, t2 は適当

env MAHOUT_HEAPSIZE=8000 bin/mahout canopy -i sbm/output -o sbm/canopy -t1 0.95 -t2 0.85 -dm org.apache.mahout.common.distance.CosineDistanceMeasure

bin/mahout clusterdump -i sbm/canopy/clusters-0-final/part-r-00000 -o canopy_dump

15クラスタ前後になった.

Kmeans


必ずしも cluster-2-final になるわけではない.

env MAHOUT_HEAPSIZE=8000 bin/mahout kmeans -i sbm/output -c sbm/canopy/clusters-0-final/part-r-00000 -o sbm/kmeans --maxIter 10 -cl

bin/mahout clusterdump -i sbm/kmeans/clusters-2-final -dt sequencefile -p sbm/kmeans/clusteredPoints -o kmeans_dump