Posted at

川柳判定プログラム

More than 3 years have 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


課題


  • 字余が判定できない

  • 拗音(ゃ、ゅ、ょ)も一音として数えられてしまう