川柳判定
お題を提出してそれに対する川柳を募集する、みたいなTwitter botでも作ろうかと思い、川柳を判定するプログラムを作りました。
実装
- Python2.7
- Yahoo!Japanテキスト解析api ルビ振り
Yahooのテキスト解析apiでルビ振りがあったので、その返り値の文字数を読み数としました。
- 文字列をスペースで分割
- それぞれurllib2でURIエンコード
- urlopenでYahoo!apiにGETリクエストを送信
- 返ってきたXMLをxmltodictでパースし、ディクショナリに
- Furiganaの長さを音数とする
- 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
課題
- 字余が判定できない
- 拗音(ゃ、ゅ、ょ)も一音として数えられてしまう