Webサイトやブログの文章を元に川柳を自動生成するサービスを作ってみた
すっかり、"作ってみた"シリーズの公開ブログになっていますが、また、どうでもいいようなアイデアを思い付いてしまったので作ってみました。
→今北川柳
ネーミングセンスがアレなのは気にしない方向で…。*1
これは何?
WebサイトやブログのURLを入力すると、文章から適当に単語を拾ってきて川柳をでっちあげるサービスです。
ただ文字列として生成するだけだと見た目的に面白くないので、色紙に毛筆で書いたっぽい画像を生成するようにしました。
試しにこのブログでやってみたら、こんな感じになりました。
全くもって中身がありませんね。(笑) これだけだとなんなので、ついでにasahi.comのトップ画面でやってみたら、こんなのになりました。
総選挙直後なので、やっぱり"総選挙"という単語が入ってきてますね。まぁ、やっぱり意味はサッパリ分かりませんが。(笑)
どんな仕組みなの?
川柳生成部分
基本的な仕組みとしては、対象の文章から5文字・7文字の言葉を拾ってきて、5・7・5に並べ替えているだけです。とは言え、一応まともな単語が出現するように、色々と工夫しています。
とりあえず、元の文章から日本語部分だけを拾う為に、半角の英数記号はばっさり捨てています。なので、"PHP"とか文章に含まれていたとしても、川柳に入ってくる事はありません。本当は英単語とか略語とかも単語の候補として拾えるといいんですけど、そういった単語の読みを取得する術がないので、仕方ないところですね…。
次に文章を単語に分解する訳ですが、最初は例によってMeCabたんに活躍してもらおうかと思ったんですが、MeCabで文章を解析してから、品詞も考慮して単語の候補を作ろうと思うと、とてもじゃないけど8秒ルールとかで収まるようなレスポンスにならなかったので、他の方法を探す事にしました。
必要なのは、"文章を文節ごとに区切る事ができる"という事と、"単語の読みが取得できる"という事で、これに関しては、CaboChaというまさにうってつけなライブラリがあるので、そちらを使う事にしました。
CaboChaで文章を解析すると、次のような形で文節の区切りやら、読みやらが得られます。
吾輩は猫である。名前はまだ無い。 * 0 1D 0/1 1.378671 吾輩 名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ O は 助詞,係助詞,*,*,*,*,は,ハ,ワ O * 1 4D 0/2 0.000000 猫 名詞,一般,*,*,*,*,猫,ネコ,ネコ O で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ O ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル O 。 記号,句点,*,*,*,*,。,。,。 O * 2 4D 0/1 0.000000 名前 名詞,一般,*,*,*,*,名前,ナマエ,ナマエ O は 助詞,係助詞,*,*,*,*,は,ハ,ワ O * 3 4D 0/0 0.000000 まだ 副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ O * 4 -1D 0/0 0.000000 無い 形容詞,自立,*,*,形容詞・アウオ段,基本形,無い,ナイ,ナイ O 。 記号,句点,*,*,*,*,。,。,。 O EOS
この結果から、一旦、文節の読みの長さ毎に配列に突っ込んでいって、5文字の配列から2つ、7文字の配列から1つ単語を取得して、川柳を生成しています。
ただし、5文字・7文字の単語が1つも無い場合のみ、プラスマイナス1文字の字余り・字足らずも許すようにしています。
あと、CaboChaの結果の中に係り受けの点数があるので、それを使って、いっぱい係られているほど単語として選ばれやすくなるように重み付けをしていたりもします。
イメージ生成部分
背景は自前で用意しておいて、ImageMagickを使って文字を載せています。
ただ、ImageMagickで縦書きする方法が分からなかったので、1文字ずつ分解して、座標指定で無理やり縦書きにしています。
拗音・促音だと幅が違うので、それっぽい場所に収まるように調整していたりとか、伸ばし棒(ー)の向きが縦にならないので、縦棒(|)にして誤魔化していたりとかしてるので、若干おかしな感じになる場合もありますが、まぁそれっぽい画像にできたんじゃないかなぁ、とそれなりに満足しています。
毛筆のフォントはフリーで使えるものを探してきて、利用させて頂きました。
→http://musashi.or.tv/kouzanmouhitufont.htm
こんなクオリティのものをフリーで使えるとは素晴らしい!
雑感
元々、文章要約の一つの形として川柳とか面白いかな、と思って作ってみたんですが、選択された単語同士に意味的な繋がりが無いので、いかんせん意味を持った川柳になる可能性が低いのが難点ですね。
もっと精度の高い川柳を生成しようと思うと、人工知能的なアプローチが必要になりそうです。それはそれで面白そうではあるので、またチャレンジしてみたいところではありますが。
という訳で、ぜひとも遊んで みて下さい!(七五調、一部字余り)