人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

PythonからYahoo!形態素解析APIを使う

集合知プログラミングのp.349を参考にYahoo!が提供する形態素解析のWebサービスをPythonから使ってみた。形態素解析をWebサービスでやるなんて遅くて使い物にならなくね?ChaSenMeCab使うよ!って使う前は思ってたのだがやってみたら驚くほど快適。かなり高速に結果を返してくれる。しかも、Yahoo!が作った特別な辞書を使っているらしく、IPAの辞書に比べて固有名詞の抽出精度がかなり高い印象を受けた。使う上での壁は、

くらいか?Yahoo!のIDを持っていれば、アプリケーションIDの登録はWeb上で簡単にでき、審査もない。

Pythonで使う場合は、HTMLを解析するBeautifulSoupというライブラリをインストールしておくと下のサンプルのようにかなり短く書ける。

#coding:utf-8
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

appid = "XXXXXXX"  # 登録したアプリケーションID
pageurl = "http://api.jlp.yahoo.co.jp/MAService/V1/parse"

# 形態素解析した結果をリストで返す
def morph(sentence, appid=appid, results="ma", filter="1|2|3|4|5|6|7|8|9|10|11|12|13"):
    ret = []
    # 文章をURLエンコーディング
    sentence = urllib.quote_plus(sentence.encode("utf-8"))
    query = "%s?appid=%s&results=%s&filter=%s&sentence=%s" % (pageurl, appid, results, filter, sentence)
    c = urllib2.urlopen(query)
    soup = BeautifulSoup(c.read())
    return [(w.surface.string, w.reading.string, w.pos.string)
            for w in soup.ma_result.word_list]

sentence = u"庭には二羽ニワトリがいる。"
result = morph(sentence, appid=appid)
for word, reading, pos in result:
    print word, reading, pos

出力は、

庭 にわ 名詞
に に 助詞
は は 助詞
二 2 名詞
羽 わ 接尾辞
ニワトリ にわとり 名詞
が が 助詞
いる いる 動詞
。 。 特殊

こんな感じ。filterには取り出したい品詞を指定できる。形容詞(1)、形容動詞(2)、感動詞(3)、副詞(4)、連体詞(5)、接続詞(6)、接頭辞(7)、接尾辞(8)、名詞(9)、動詞(10)、助詞(11)、助動詞(12)、特殊(13)が割り振られている。テキスト処理だと名詞のリストが欲しい場合が多いけどその場合は、

# 形態素解析した結果をリストで返す
def morph(sentence, appid=appid, results="ma", filter="1|2|3|4|5|6|7|8|9|10|11|12|13"):
    ret = []
    # 文章をURLエンコーディング
    sentence = urllib.quote_plus(sentence.encode("utf-8"))
    query = "%s?appid=%s&results=%s&filter=%s&sentence=%s" % (pageurl, appid, results, filter, sentence)
    c = urllib2.urlopen(query)
    soup = BeautifulSoup(c.read())
    return [w.surface.string for w in soup.ma_result.word_list]

sentence = u"Googleが今まで立ち上げてきたプロジェクト(検索、ブックサーチ、YouTube買収、Googleアース、ストリートビューなど)の舞台裏が書かれていて興味深かった。"
result = morph(sentence, appid=appid, filter="9")
for w in result:
    print w,

とすればよい。結果は、

Google プロジェクト 検索 ブック サーチ YouTube 買収 Google アース ストリート ビュー 舞台裏

GoogleとかYouTubeもちゃんと抽出できてる。これからいろいろ使っていきたい。

追記(2010/1/3)

アドレスが変わったようです。また、上記のGETでは、長いセンテンスはURLに展開できないらしくエラーになります。その場合は、下のようにPOSTで投稿できます。

appid = "自分の使ってね!"  # アプリケーションID
pageurl = "http://jlp.yahooapis.jp/MAService/V1/parse"

# Yahoo!形態素解析の結果をリストで返す
# http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
def morph(sentence, appid=appid, results="ma", filter="1|2|3|4|5|6|7|8|9|10|11|12|13"):
    sentence = sentence.encode("utf-8")
    params = urllib.urlencode({'appid':appid, 'results':results, 'filter':filter, 'sentence':sentence})
    c = urllib2.urlopen(pageurl, params)  # POSTで投稿
    soup = BeautifulSoup(c.read())
    return [w.surface.string for w in soup.ma_result.word_list]