「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 件のコメント:
コメントを投稿