Pythonでコーディングするネタとして、キーワード抽出に手をつけてみました。"キーワード抽出"のアルゴリズムや作法などに詳しくないので、以下のページをなぞる形で実装しました。
[を] 形態素解析と検索APIとTF-IDFでキーワード抽出
MeCabの用意
MacPorts経由で以下をインストールしました。
- mecab
- mecab-ipadic-eucjp
- mecab-ipadic-sjis
- mecab-ipadic-utf8
- mecab-jumandic-eucjp
- mecab-jumandic-sjis
- mecab-jumandic-utf8
- py-mecab
また、細かい事は考えず、/opt/local/etc/mecabrcで"dicdir = /opt/local/lib/mecab/dic/ipadic-utf8"としておきました。
pYsearch
DF値を求めるための自前のデータベースは無いので、Yahooのウェブ検索Webサービスを使います。楽をするために、Python用のSDKとして利用出来るpYsearchというモジュールをインストールしました。
Python Cheese Shop : pYsearch 3.0
母集団が手元に無いと難しい?
今回は、"キーワード抽出"の手順を体験する事が目的だったので、Yahooの検索APIを利用して済ませましたが、実際に何かしらのサービスや機能として提供する事を考えると、母集団の確保が結構なキモににるのでしょうか。
TF-IDFと異なる指標(?)を利用したキーワード抽出もあるのかな?
キーワード抽出の手順を体験する為に書いたコードです
# -*- coding: utf-8 -*- import math import MeCab from yahoo.search.web import WebSearch class TFIDF: def __init__(self, websearch_id): self.tf = {} self.df = {} self.tf_idf = [] self.mecab = MeCab.Tagger('-Ochasen') self.websearch = WebSearch(websearch_id) self.total = 19200000000 def clear(self): self.tf = {} self.df = {} self.tf_idf = [] def __calc_tf(self): result = self.mecab.parse(self.text) for line in result.split('\n')[1:-1]: el = line.split('\t') if len(el) > 3 and el[3].find('名詞-一般') == 0: self.tf[el[0]] = self.tf.get(el[0], 0) + 1 def __calc_df(self): self.websearch.results = 0 for word in self.tf: self.websearch.query = word dom = self.websearch.get_results() root = dom.getElementsByTagName('ResultSet')[0] self.df[word] = int(root.getAttribute('totalResultsAvailable')) def calc(self, text): """ text must encoded 'UTF-8' """ self.text = text self.__calc_tf() self.__calc_df() N = math.floor(self.total) for word in self.df: tfidf = self.tf[word] * math.log(N / self.df[word]) self.tf_idf.append((word, tfidf)) def get_tfidf(self): return self.tf_idf if __name__ == '__main__': """ 「美しい国、日本」の実現に向けて $(0!9(B 内閣総理大臣 安倍晋三(しんぞう) β版公式サイト http://newtop.s-abe.or.jp/767a8a008a9e9332/65e5672c8ad6/300c7f8e3057304456fd300165e5672c300d306e5b9f73fe306b541130513066/ """ source = """ 戦後六十年を経ました。還暦という言葉があるように、現在大きな意味で世代交代の時期に差し掛かっているものと思います。戦後体制が我が国の発展にこれまで大きく寄与してきたことは疑いの余地はありません。しかしながら、この六十年間で国内外をめぐる情勢は大きく変化しており、戦後体制を脱却し、新しい時代の価値観を再構築するときが来ております。 こうした中、次の六十年、百年に向けた日本の国づくりを行うことが、初めての戦後生まれの総理大臣となった私と私の内閣に与えられた使命であると考えております。吉田松陰先生は、後に明治維新の原動力となった弟子たちに「天下後世を以て己が任と為すべし」と説きました。国の将来のために尽くすことを自らの任務として自覚すべきであるというこの言葉を胸に、子供たちの世代が自信と誇りを持てる「美しい国、日本」の実現に向け、全身全霊を傾けてまいります。 """ yahoo_search_app_id = "********" tfidf = TFIDF(yahoo_search_app_id) tfidf.calc(source) results = tfidf.get_tfidf() results.sort(lambda x, y: cmp(y[1], x[1])) for el in results[:10]: print el[0], el[1] """ 言葉 24.8402858013 全身全霊 19.9646040493 還暦 18.0650480096 原動力 16.3783787492 総理 16.0873239923 価値 15.2228583283 情勢 15.0638562138 内閣 14.490081353 国 14.4771388668 世代 13.1410785428 """

