Python
テキスト分析
YahooAPI

川柳判定プログラム

More than 1 year has passed since last update.

川柳判定

お題を提出してそれに対する川柳を募集する、みたいなTwitter botでも作ろうかと思い、川柳を判定するプログラムを作りました。

実装

Yahooのテキスト解析apiでルビ振りがあったので、その返り値の文字数を読み数としました。

  1. 文字列をスペースで分割
  2. それぞれurllib2でURIエンコード
  3. urlopenでYahoo!apiにGETリクエストを送信
  4. 返ってきたXMLをxmltodictでパースし、ディクショナリに
  5. Furiganaの長さを音数とする
  6. 5音7音5音になっているか判定
senryu.py
# -*- coding: utf-8 -*-
import urllib2
import xmltodict

def yomilen(string):
  urlstr = urllib2.quote(string.encode("utf-8"))
  response = urllib2.urlopen('http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=yourappid&sentence='+urlstr).read()
  jres = xmltodict.parse(response)
  yomigana = ""
  if isinstance(jres["ResultSet"]["Result"]["WordList"]["Word"], list):
    for result in jres["ResultSet"]["Result"]["WordList"]["Word"]:
      yomigana = yomigana + result["Furigana"]
  else:
    yomigana = jres["ResultSet"]["Result"]["WordList"]["Word"]["Furigana"]
  length = len(yomigana)
  return length

def senryu(string):
  strs = string.split(" ")
  if len(strs) == 3:
    if yomilen(strs[0]) == 5:
      if yomilen(strs[1]) == 7:
        if yomilen(strs[2]) == 5:
          print u"川柳です"
          return True
        else:
          print u"3句目が5音ではありません"
          return False
      else:
        print u"2句目が7音ではありません"
        return False
    else:
      print u"1句目が5音ではありません"
      return False
  else:
    print u"575ではありません"
    return False

実行結果

In [1]: senryu(u'鳴かぬなら 殺してしまえ 時鳥')
川柳です
Out[1]: True

課題

  • 字余が判定できない
  • 拗音(ゃ、ゅ、ょ)も一音として数えられてしまう