nabetaの日記: こんなものをつくる
匿名の投稿でも数が多いと同じ人間の投稿か、そうでないかの区別ができるのだそうだ、
という話を耳にはさんで、そういう仕組みをシステム化できないかなと考えた話
ちょっと作ってみたら色々わからないことが出てきて詰まってしまう。
はじめは投稿文章のパラメータをなんとか抽出して、それを統計計算処理にぶち込む
ことしか考えていなかったけど、作っているうちに混乱してきた、ちょっと頭を冷やす。
(統計の本どこに埋まっているだろうか、発掘しないと先にすすめそうにない)
import twitter
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
import numpy
#
# Yahoo!日本語形態素解析API
# http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
apiUrl = "http://jlp.yahooapis.jp/MAService/V1/parse"
parseFilter = "1|2|3|4|5|6|7|8|9|10|11|12|13"
typeLst = {
u"形容詞":1, u"形容動詞":2, u"感動詞":3, u"副詞":4, u"連体詞":5, u"接続詞":6,
u"接頭辞":7, u"接尾辞":8, u"名詞":9, u"動詞":10, u"助詞":11, u"助動詞":12, u"特殊":13 }
def morph_uniq(sentence, appid=appId, pfilter=parseFilter):
c = urllib2.urlopen(
"%s?appid=%s&results=uniq&filter=%s&sentence=%s" % (apiUrl, appid, pfilter, urllib.quote_plus(sentence)))
soup = BeautifulSoup(c.read())
return [(w.surface.string,
(float(w.count.string)/float(soup.uniq_result.total_count.string)),
typeLst[w.pos.string])
for w in soup.uniq_result.word_list]
#
# python-twitter
# http://code.google.com/p/python-twitter/
api = twitter.Api()
statuses = api.GetPublicTimeline()
stat={}
for sid, uid, msg in [(s.id,s.user.id,s.text.encode('utf-8')) for s in statuses]:
if not uid in stat.keys():
stat[uid] = []
stat[uid].append([sid,msg])
#
# 発言者に分けて文章の癖を調べるパラメータを探す(TBD)
# 文章の長さとか品詞の使用頻度くらいを試しに使う
# Numpy
# http://www.scipy.org/SciPy
for userid in stat.keys():
usum = dict([(pos, []) for pos in range(0,14)])
#
# 発言の文字数に関するもの
#
usum[0].append(map(lambda(sid,smg):len(smg),stat[userid]))
#
# 発言の品詞使用頻度
#
for (sid,smg) in stat[ userid ]:
say = dict( [(pos, []) for pos in range(1,14)] )
for word, count, pos in morph_uniq(smg):
say[pos].append([count,word])
for kid in say.keys():
usum[kid].append(sum(map(lambda(p,s):p,say[kid])))
#
# 結果表示
#
for kid in usum.keys():
wk = numpy.array(usum[kid])
print userid,":",kid,":",wk.mean(),",",wk.var(),",",wk.std()
こんなものをつくる More | Reply ログイン