LoginSignup
4
4

More than 5 years have passed since last update.

川柳判定プログラム

Posted at

川柳判定

お題を提出してそれに対する川柳を募集する、みたいな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

課題

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4