Sponsored Link

Pythonでのキーワード抽出実装

初出: 2007/6/27
更新: 2007/7/1

文章からキーワードを抽出するスクリプトをPythonモジュールとして実装しました。
分かち書きした上に、適切に複合語をつくり、さらに重要そうなものかどうかのスコアをつけます。

アルゴリズムは、以下のサイトを参考にしました。
http://gensen.dl.itc.u-tokyo.ac.jp/
ここで紹介されている論文
* 中川裕志、森辰則、湯本紘彰: "出現頻度と連接頻度に基づく専門用語抽出",自然言語処理、Vol.10 No.1, pp. 27 - 45, 2003年1月
http://www.r.dl.itc.u-tokyo.ac.jp/~nakagawa/academic-res/jnlp10-1.pdf
に掲載されているFLR法のみを実装しています。

実行結果サンプル

たとえば、こんなページの本文をテキストファイルsample.txtに保存して以下のコマンドを打つと、下のような結果がでます。
$ ./mword.py < sample.txt | sort -t "   " -k2,2nr | less -isr
配置    17.000000
重要 性 11.313708
最終 的 6.727171
右      5.656854
重要    5.656854
製品    5.656854
X 軸    5.334838
Y 軸    5.334838
相対 的  5.045378
マス    5.000000
仕事     5.000000
比較     5.000000
コスト  4.242641
意志 決定 4.242641
開発    4.242641
左上     4.000000
労力    4.000000
横 軸   3.556559
縦 軸   3.556559
優先     3.464102
戦略 的  3.363586
簡単    3.000000
基準      3.000000
機能    3.000000
左下    3.000000
さ      2.828427
右 下   2.828427
製品 開発       2.828427
プロジェクト     2.000000
リスク   2.000000
逆      2.000000
残り     2.000000
順番     2.000000
処理      2.000000
側      2.000000
値      2.000000
度合い   2.000000
判明    2.000000

ダウンロード等

mword.py(右クリックで保存)
ライセンスは、Apacheライセンスv2.0なので自己責任でご利用ください。

動作に必要な環境

インストール

Mecab公式サイトに従って、Mecab, mecab-ipadic, mecab-pythonをインストールします。
少し古いバージョンのmecab-ipadicを使用している場合、mecab-ipadicを-pオプション付きでビルドし直す必要があります。(mecab-ipadic-2.7.0-20070610以降であれば標準的なビルドで大丈夫です。)
  1. mecabを、インストールしたらここに従って、mecabが正しく動くことを確認しましょう。
  2. mecab-pythonを、インストールしたらここに載っているサンプルのPythonスクリプトで正しく動作するかを確認しましょう。
以上が準備できれば、mword.pyは、単体で動作します。

APIとしての使用

コマンドラインアプリとしても動きますが、関数としてPythonから呼び出すことももちろんできます。
各種カスタマイズもできるようにしています。

APIとしてのサンプル

mword.pyを、ご自分が実行するスクリプトと同一ディレクトリに置くか、よく使うのであれば、site-packagesディレクトリに放り込みましょう。
基本的にはmword.calc関数へ文のジェネレータを渡すだけです。(ジェネレータなので、例えば、sys.stdinとか、ファイルオブジェクトを渡せます。単純にスクリプト内の文字列オブジェクトを渡したいときは、["渡したい文字列"]のようにリストなどにして渡してください。) 例えば、以下のように使用できます。 (sample.py)
#!/usr/bin/python
# _*_ coding: euc_jp _*_
# Copyright (C)  2007 Ayukawa Hiroshi
import mword


body = """
中国の国会にあたる全国人民代表大会(全人代)の常務委員会は29日、雇用契約の長期化を促すなど、労働者の権利保護を強化した労働契約法案を可決した。08年1月から施行する。

 中国では、山西省で明らかになった未成年者の強制労働など、正規の契約を結ばない雇用が横行し、労働者の保護が急務とされてきた。ただ、安い賃金を競争力としてきた企業には、負担となりそうだ。

 法案によると、働き始めてから1カ月を過ぎても書面契約を結ばない雇用主は、月給の2倍の割増賃金を支払わなければならない。また、同じ企業で勤続10年を超えたり、期限付き契約を2度更新したりした場合、労働者が希望すれば、基本的に無期限の雇用契約を結ぶことも義務づけた。派遣社員であっても、正社員と同じ仕事をした場合は、同じ賃金の支払いを受け取る権利がある、とした。また、労働者の権利に影響する社則の変更は、組合と協議するよう求めている。

 中国では労働契約を結んでも1年更新の企業が多いため、「安定に欠け、労働者の権益に深刻な影響を与えている」(全人代広報担当)として、雇用主に契約の長期化や退職時の補償金の支給を促す。 
"""

score = mword.calc(body.split("\n"))
words = score.keys()
words.sort(key=lambda x: score[x], reverse=True)
for word in words:
    print " ".join(word) + "\t%f" % score[word]

実行結果
ayu@~/work/mword% python sample.py | head -n 20
労働 者 10.298836
契約    6.324555
雇用 契約       4.680695
雇用 主 3.130169
企業    3.000000
中国    3.000000
賃金    2.828427
権利    2.828427
長期 化 2.828427
労働 契約       2.783158
労働 契約 法案  2.220906
書面 契約       2.114743
期限 付き 契約  2.075782
更新    2.000000
影響    2.000000
強制 労働       1.861210
雇用    1.732051
全国 人民 代表 大会     1.681793
全人代 広報 担当        1.587401
常務 委員 会    1.587401

動作のカスタマイズ

例えば、接尾辞を抽出に含めるかなどの細かい指示もmword.calc関数の引数で渡せるようになっていますが、これに関してのドキュメントはまた後日。。。