LDRで購読しているフィードから単語セットを抽出して遊びたい。 データセットは一度取っておけばいいので、永続化をしておく。入力はLDRから吐き出したOPMLファイル(export.xml)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys,re,feedparser,shelve,MeCab,sgmllib
from xml.dom.minidom import parse, parseString
opmlfile = "/Users/kzfm/export.xml"
def getwordcounts(i,url):
print "#%d feedparser parse: %s" % (i,url)
try:
d = feedparser.parse(url)
except UnicodeDecodeError,e:
print "UnicodeDecodeError ", e
return {}
except sgmllib.SGMLParseError,e:
print "sgmllib.SGMLParseError", e
return {}
txt = ''
tage = re.compile(r'<[^>]+>');
for entry in d.entries:
if hasattr(entry,"summary_detail") : txt += tage.sub('',entry.summary_detail.value)
try:
t = MeCab.Tagger()
m = t.parseToNode(txt.encode('utf-8'))
wc = {}
while m:
if m.stat < 2:
if re.match('名詞',m.feature): wc[m.surface] = wc.get(m.surface,0)+1
m = m.next
return wc
except RuntimeError, e:
print "RuntimeError:", e;
def parse_opml(file):
urls = []
dom = parse(file)
for outline in dom.getElementsByTagName("outline"):
url = outline.getAttribute("xmlUrl")
if url: urls.append(url)
return urls;
if __name__ == "__main__":
url_lists = parse_opml(opmlfile)
tag_data = shelve.open("myldrwordsets")
for i,url in enumerate(url_lists):
tag_data[url] = getwordcounts(i,url)
tag_data.close()
- 1000件ぐらい取ってくるのに30分ぐらいかかったが、ダウンしているサイトをずっと待っているのはよくない。feedparserのタイムアウトの設定ってどうやんのかな。
- 今回はshelveを使ってみたがpickleとの使い分けの基準がいまいちわからん
できたファイルのサイズは15Mくらいだった。これで類似度を計算したり、クラスタリングするためのデータは揃った。
追記 08.07.13
shelveだとなぜか辞書の復元がうまくいかなかったのでcPickleに変更した
if __name__ == "__main__":
url_lists = parse_opml(opmlfile)
tag_data = {}
for i,url in enumerate(url_lists):
tag_data[url] = getwordcounts(i,url)
f=file("myldrwordsets","wb")
pickle.dump(tag_data,f)
f.close()