plda使ってみた(パラレルではないが)

まずは参考ページから:
Tokyotextmining#1 kaneyama genta
ldaとtwitterの合わせ技のネタはここから仕入れてきた。
plda - A parallel C++ implementation of fast Gibbs sampling of Latent Dirichlet Allocation - Google Project Hosting
plda本家
PLDAQuickStart - plda - A Quick Start Manual for plda - A parallel C++ implementation of fast Gibbs sampling of Latent Dirichlet Allocation - Google Project Hosting
pldaのチュートリアル

次に想定として、データはmongoDBに入っているとして、textデータだけdumpする。
#!/usr/bin/python
#coding: utf8

import re
import pymongo
import MeCab

sub_url = re.compile('(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)').sub
sub_user_hash = re.compile('(@|#)[a-zA-Z0-9_]+').sub

def delete(text):
return sub_user_hash('', sub_url('', text))

conn = pymongo.Connection()
db = conn.twitter
tweets = db.tweets

m = MeCab.Tagger('-u /home/ukyo/mecab-dic-overdrive/misc/dic/wikipedia.dic')

for t in tweets.find():
fuga = delete(t['text']).encode('utf8')
hoge = []
for f in m.parse(fuga).split('\n')[:-2]:
if '名詞' in f and not '名詞,数' in f and not '非自律' in f:
hoge.append(f.split('\t')[0])
print ','.join(hoge)

dumpしたデータを受け取って頻度を計算する。
#!/usr/bin/python
# coding: utf8

import sys
import re
sub = re.compile('\n').sub

def hoge(text):
fuga = sub('', text).split(',')
foo = {}
if len(fuga) < 5:
return
while(len(fuga) > 0):
n = fuga.count(fuga[0])
s = fuga[0]
for i in range(n): fuga.remove(s)
foo[s] = n
print ' '.join([str(k) + ' ' + str(n) for k, n in foo.items()])

for line in sys.stdin:
hoge(line)

実際使うときは以下のようなかんじで
$ dump.py | make_train_data.py > training.txt

最後に、ldaのチュートリアルにしたがってちょっと改変したりしてやっていけばモデルが完成する。
ちなみに、完成したモデルはソースコード一式にview_lda.pyというものがついているのでそれでどんな具合に分類できたのかを見ることができる(これは結構感動する)。


posted by 右京 | Python
blog comments powered by Disqus
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。