「RSSの中に含まれる名詞の集計表を作成する」のRSSの読み込みの不具合解消しました。
mecab-pythonを使って、RSSの中に含まれる名詞の集計表を作るソースを試してみました。
http://vivo-design.blogspot.com/2011/06/mecab-pythonrss.html
の続きです。
Yahooの提供するRSSであれば、問題なく読めるのですが、それ以外は、「Failed to parse feed」となる点が解消しました。修正したソースで作成した集計表です。Yahoo以外のRSSを読み込んで、集計が出来ました。私が試行錯誤していた時に追記したものが、不要なだけでした。
修正したソース
analysis_rss_feed.py
本体
#coding:utf-8
import re
import csv
import MeCab
import feedparser
from extractKeyword import extractKeyword
#=====================
# ----- set URLs -----
#=====================
"""
# IT関連
URLs = ['http://headlines.yahoo.co.jp/rss/itmedia_ait.xml',
'http://headlines.yahoo.co.jp/rss/bcn.xml',
'http://headlines.yahoo.co.jp/rss/impress_c_sci.xml',
'http://headlines.yahoo.co.jp/rss/rbb.xml',
'http://headlines.yahoo.co.jp/rss/scan.xml']
# 雑誌関連
URLs = ['http://zasshi.news.yahoo.co.jp/rss/sspa.xml',
'http://zasshi.news.yahoo.co.jp/rss/sasahi.xml',
'http://zasshi.news.yahoo.co.jp/rss/shincho.xml',
'http://zasshi.news.yahoo.co.jp/rss/sbunshun.xml',
'http://zasshi.news.yahoo.co.jp/rss/chuokou.xml',
'http://zasshi.news.yahoo.co.jp/rss/playboyz.xml',
'http://zasshi.news.yahoo.co.jp/rss/gendaibiz.xml',
'http://zasshi.news.yahoo.co.jp/rss/bshunju.xml']
"""
# 一般のニュース関連
URLs = ['http://rss.asahi.com/f/asahi_newsheadlines',
'http://rss.rssad.jp/rss/mainichi/flash.rss',
'http://rss.yomiuri.co.jp/rss/yol/topstories',
'http://sankei.jp.msn.com/rss/news/points.xml',
'http://www.jiji.com/rss/ranking.rdf',
'http://www.kyodo.co.jp/feed/']
#===============================
# ----- category selection -----
#===============================
class_num = 0
word_classes = [u'名詞',u'動詞',u'形容詞',u'副詞',u'助詞',u'助動詞']
word_class = word_classes[class_num]
#==============================
# ----- defined functions -----
#==============================
def getwordcounts(url):
"""RSSフィードのタイトルと、単語の頻度のディクショナリを返す"""
# フィードをパースする
d = feedparser.parse(url)
wc={}
# すべてのエントリをループする
# RSSの種類によって,記事に相当する部分が異なることに対応する
for e in d.entries:
# 追加したこの部分が不要でした
# if 'summary_detail' in e: summary = e.summary_detail
if 'summary' in e: summary = e.summary
elif 'description' in e: summary = e.description
else: summary = e.link
# 単語のリストを取り出す
words = getwords(e.title+' '+summary)
# extractKeywordを用いるため,単語を連結してテキスト化
txt = ''
for i in range(len(words)):
txt += words[i]
words_sub = extractKeyword(txt,word_class)
for word in words_sub:
# dict型のkeyにwordがなければ,value=0として新設
wc.setdefault(word,0)
wc[word] += 1
return d.feed.title,wc
def getwords(html):
"""すべてのHTMLタグを取り除き,単語リストを返す"""
# htmlから'<[^>]+>'を''に置き換える
txt = re.compile(r'<[^>]+>').sub('',html)
tagger = MeCab.Tagger('-Owakati')
txt = txt.encode('utf-8')
return tagger.parse(str(txt)).split(' ')
# return tagger.parse(txt.encode('utf-8')).split(' ')
# return tagger.parse(txt.encode('euc-jp')).split(' ')
def main():
apcount = {}
wordcounts = {}
feedlist = [line for line in URLs]
for feedurl in feedlist:
wc = {}
try:
title,wc_ini = getwordcounts(feedurl)
for w,bc in wc_ini.items():
# csvで日本語を表示させるため,Shift_JIS化
# この部分はエンコードをかけると、どの文字コード
# でも、エラーになりました。
# wc.setdefault(w.encode('sjis'),bc)
wc.setdefault(w,bc)
wordcounts[title] = wc
# for word,count in wc.items():
for word,count in wc.items():
apcount.setdefault(word,0)
if count>1:
# それぞれの単語が出現するフィードの数を数える
apcount[word]+=1
except:
# urlが認識できなければエラー表示
print 'Failed to parse feed %s' % feedurl
# でたらめな単語が存在するフィードがあることや
# 一般的な単語の除外を考慮し,単語の出現率に敷居値を設定する
wordlist = []
for w,bc in apcount.items():
frac = float(bc)/len(feedlist)
if frac>0.1 and frac<0.5: wordlist.append(w)
# csvへの書き込み用リストを生成
header = ['Feed_name']+wordlist
rows = []
for blog,wc in wordcounts.items():
# row = [blog.encode('sjis')]
row = [blog.encode('utf-8')]
for word in wordlist:
if word in wc: row.append(wc[word])
else: row.append('0')
rows.append(row)
# csvへ書き込み
csv_writer = csv.writer(open('rss_data.csv','w'),lineterminator='\n')
csv_writer.writerow(header)
csv_writer.writerows(rows)
if __name__ == "__main__":
main()
修正したのは、下記の2箇所
# 一般のニュース関連
URLs = ['http://rss.asahi.com/f/asahi_newsheadlines',
'http://rss.rssad.jp/rss/mainichi/flash.rss',
'http://rss.yomiuri.co.jp/rss/yol/topstories',
'http://sankei.jp.msn.com/rss/news/points.xml',
'http://www.jiji.com/rss/ranking.rdf',
'http://www.kyodo.co.jp/feed/']
途中略
# 追加したこの部分が不要でした
# if 'summary_detail' in e: summary = e.summary_detail
if 'summary' in e: summary = e.summary
この部分が無くても、どのRSSでも正常に動作しました。


0 件のコメント:
コメントを投稿