summpyを使って文章を要約してみる(今北産業)

文章の要約をしたいなーって思って前にマルコフ連鎖やらいろいろ調べてて、その熱が冷めた今頃簡単にできるぞって情報を得たので試してみました。

Github上のソースは以下から

github.com

リクルートテクノロジーズの大杉さんと広島市立大学修士2回生の飯沼さんが作られたようです。
あざまっす!

blog.recruit-tech.co.jp

環境

Mecabの導入については以前の記事を参考にしてください。

kakushika.hatenablog.com

kakushika.hatenablog.com

導入

GithubのREADMEを見るとPython2.7〜だそうで、手元のMacの中に入ってるバージョンを見てみると問題なかったです。 初めてPythonだなーと思い見てたら、Pythonにもパッケージ管理としてpipというのがあるようです。
Rubyでいうgemですかね。

さっそくpipを使えるようにしてsummpyを入れてみました。

sudo easy_install pip
sudo pip install summpy

READMEに以下でWEBサーバーとして起動してcurlで実行できるとありますのでやってみます。

pip install summpy
python -m summpy.server -h 127.0.0.1 -p 8080
curl http://127.0.0.1:8080/summarize\?sent_limit\=3\&text\=要約したい文章を入力。

エラーでました。。

ImportError: No module named janome.tokenizer

READMEをもう一度読み返してみると以下が必要とのことです。
※読み落としてました。。

pipで入れることができるそうなので、まずはpipで既に何が入っているか確認してみます。

# pip freeze
altgraph==0.10.2
bdist-mpkg==0.5.0
bonjour-py==0.3
CherryPy==4.0.0
decorator==4.0.6
macholib==1.5.1
matplotlib==1.3.1
modulegraph==0.10.4
networkx==1.10
numpy==1.8.0rc1
py2app==0.7.3
pyobjc-core==2.5.1
pyobjc-framework-Accounts==2.5.1
pyobjc-framework-AddressBook==2.5.1
pyobjc-framework-AppleScriptKit==2.5.1
pyobjc-framework-AppleScriptObjC==2.5.1
pyobjc-framework-Automator==2.5.1
pyobjc-framework-CFNetwork==2.5.1
pyobjc-framework-Cocoa==2.5.1
pyobjc-framework-Collaboration==2.5.1
pyobjc-framework-CoreData==2.5.1
pyobjc-framework-CoreLocation==2.5.1
pyobjc-framework-CoreText==2.5.1
pyobjc-framework-DictionaryServices==2.5.1
pyobjc-framework-EventKit==2.5.1
pyobjc-framework-ExceptionHandling==2.5.1
pyobjc-framework-FSEvents==2.5.1
pyobjc-framework-InputMethodKit==2.5.1
pyobjc-framework-InstallerPlugins==2.5.1
pyobjc-framework-InstantMessage==2.5.1
pyobjc-framework-LatentSemanticMapping==2.5.1
pyobjc-framework-LaunchServices==2.5.1
pyobjc-framework-Message==2.5.1
pyobjc-framework-OpenDirectory==2.5.1
pyobjc-framework-PreferencePanes==2.5.1
pyobjc-framework-PubSub==2.5.1
pyobjc-framework-QTKit==2.5.1
pyobjc-framework-Quartz==2.5.1
pyobjc-framework-ScreenSaver==2.5.1
pyobjc-framework-ScriptingBridge==2.5.1
pyobjc-framework-SearchKit==2.5.1
pyobjc-framework-ServiceManagement==2.5.1
pyobjc-framework-Social==2.5.1
pyobjc-framework-SyncServices==2.5.1
pyobjc-framework-SystemConfiguration==2.5.1
pyobjc-framework-WebKit==2.5.1
pyOpenSSL==0.13.1
pyparsing==2.0.1
python-dateutil==1.5
pytz==2013.7
scikit-learn==0.17
scipy==0.13.0b1
six==1.4.1
summpy==0.2.1
Twisted==13.2.0
xattr==0.6.4
zope.interface==4.1.1

MecabPythonで実行するためのモジュールがないようなので追加します。

sudo pip install mecab-python3

ちなみにGithub上のリポジトリは以下です。
cookpadの方のようですね。いつもTechブログ読ませていただいてます。

github.com

無事必要なものがそろったので先ほどのWEBサーバー起動+curlで実行を試してみましょう。

要約を試す記事は以下です。
記事の選定が単純にGoogleニュースのトップだったからです。

www.asahi.com

実行

# python -m summpy.server -h 127.0.0.1 -p 8080
# curl http://127.0.0.1:8080/summarize\?sent_limit\=3\&text\=NHKは11日、塚本堅一アナウンサー(37)が危険ドラッグを所持していたとして、厚生労働省関東信越厚生局麻薬取締部に医薬品医療機器法違反の疑いで10日に逮捕された、と発表した。麻薬取締部によると、塚本容疑者は容疑を認めているという。逮捕容疑は、10日、自宅で危険ドラッグを所持していたというもの。同部は自分で使用する目的だったとみている。NHKの説明では、塚本容疑者は2003年入局。京都放送局などを経て、15年2月から東京のアナウンス室所属。「ニュース シブ5時」でリポーターを務めていた。NHKは「職員が逮捕されたことは遺憾であり、視聴者の皆様や関係者に深くおわびいたします。事実関係を調べたうえで厳正に対処します」とコメントを出した

結果

{
  "debug_info": {}, 
  "summary": [
    "NHKは11日、塚本堅一アナウンサー(37)が危険ドラッグを所持していたとして、厚生労働省関東信越厚生局麻薬取締部に医薬品医療機器法違反の疑いで10日に逮捕された、と発表した。", 
    "麻薬取締部によると、塚本容疑者は容疑を認めているという。", 
    "NHKの説明では、塚本容疑者は2003年入局。"
  ]
}

動きましたー!

結果としては文から単語に分解してというよりは、重要文抽出のような印象ですね。

RSSをクロールして、記事取得して、summpyで要約してDBに突っ込んでRubyAPIサーバー起動してフロントエンドから取得するという流れが出来そうです。いいすねー!

追記

WEBサーバーを起動して以下にアクセスしたら簡単な入力画面が表示されますね。便利!

http://localhost:8080/static/test.html

f:id:kakushika:20160111234821p:plain

他の方々が試したという記事