キーワード抽出に手をつけてみた

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
辞書を根こそぎインストールしていますが、"port search 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
    """
 
プロフィール

このブログ記事について

このページは、koshigoeが2007年3月31日 17:48に書いたブログ記事です。

ひとつ前のブログ記事は「安倍総理のホームページっていじられたんでしたっけ?」です。

次のブログ記事は「sshfsを触ってみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。