かわみのメモ帳

趣味に関するメモを書いていきます。

普通の文章から川柳を自動で見つけよう その2(細かい設計編)

おはようございます。かわみです。
川柳探索のその2です。誰か見てる人はいるのだろうか。
どのように川柳を見つけるか、具体的に細かい部分の設計をしていく章です。
しかし書き終えて気づいたけど、実は前回で大方の設計が完了していたのである。

改めてゴールを定義

ゴールがふわふわした定義になっているように感じるので、この辺りできちんと定義しておきましょう。

『任意の数の文からなる文章の、任意の文中より、「五・七・五」の箇所を検出する。』

決まりましたねー!決まった。決まったところで、具体的に決めることを決めていこう。

ルールの制定

前回までの方法では、文に非ずものまでが検知されてしまいました。そこで、新たなルールを制定し、誤検知を防ぐことにしましょう。
文には句構造規則などさまざまな考え方やルールがありますが、今回は、お硬い論文でも何でもないので緩く考えましょう。 形態素解析で得られる品詞をもとに、品詞レベルで考えます。
まず品詞には大きく分けて以下のものがあります。

  • 名詞
  • 動詞
  • 形容詞
  • 助詞
  • 助動詞
  • 感動詞
  • 接続詞
  • 副詞
  • 連体詞
  • 接頭詞(辞)
  • 記号、フィラー、その他

(IPA品詞体系より)
※ちなみにこの品詞体系では形容動詞は名詞の一部として考えられます。
どんなものがあるかは上記リンクからご覧ください。
このうち、文頭および文末にあって自然なものだけを対象として検知すればよいのです。

文頭にあって不自然な品詞

自然なほうを数え上げるよりも不自然なほうを数え上げたほうが楽な気がするので、不自然なほうを考えます。
文頭にあって不自然な品詞としては、まず大分類では

  • 助詞
  • 助動詞
  • (記号?)

そして小分類にまで目をやると、ほかのそのような品詞が見えてきます。

  • 名詞, 接尾
  • 名詞, 非自立
  • 動詞, 接尾
  • 動詞, 非自立
  • 形容詞, 接尾
  • 形容詞, 非自立

あたりでしょうか。まあ思いっきり「接尾」って書いてあるものもあるけど。
よって、文頭は以上の品詞以外のものであれば検知対象としましょう。

文末にあって不自然な品詞

こちらも不自然なほうを考えます。
文末は意外に何が来ても良さそうなのですが、単語の前に付ける単語は来るべきではありません。

  • 連体詞
  • 接頭詞

文末については、以上の品詞以外のものであれば検知対象としましょう。
と言いたいところですが、前回の例を思い出しましょう。
「見てましたよ」は「見」「て」「まし」「た」「よ」に分割され、このうち「まし」「た」はともに助動詞です。
「ました」なら良さそうですが、「まし」で終わるのは不思議な感じがします。
よって、2連続していない助動詞は除外、と行きたいところですが、「ます」で終わっている場合は良さそうなので、 このルールは通用しません。あー…通用しないのかな。やだな。(CV.安良岡花火さん)

しかしながらよく考えると、「まし」が不自然なのはその後ろに助動詞がくっ付いているからで。 したがって、助動詞については後ろの助動詞の有無で判定すればよさげです。

文字→モーラ に変換

前回、川柳の17音は実は17"モーラ"との話を書いた覚えがありますが、 文字をモーラに変換する方法を考えましょう。パッと2種類の手法を思いつきましたので、前回登場した名句より「しすぎでしょ」を例に見ます。

手法A

ひらがなまたはカタカナの文字数をそのまま1モーラと数える手法。
ただし、「っ」以外の小さい文字はノーカウントとして数える。
この手法の場合、「ゃっ…!」とかいう文だとうまくいきませんが、そもそもそんな文は除外しましょうよ。

「し」→1 「す」→1 「ぎ」→1 「で」→1 「し」→1 「ょ」→0

よって合計すると5モーラです。漢字や固有の英語表現をひらがなやカタカナに変換できればうまくいきそうかも。

手法B

ひらがなまたはカタカナをローマ字に変換し、子音や母音からモーラを求める手法。
「しすぎでしょ」→「sisugidesho」と変換し、母音の数、つまり{a, i, u, e, o}の数を合計すると、モーラ数になります。 上記の例からは、i u i e o が抽出され、合計すると5個です。
ただし、「っ」を表現する「ppa」のように2連続で子音が現れるものと、それ以外の場合で「ん」を表現する、他の子音と連接する「n」も合計対象とします。
ちょっと面倒そうかもしれない。そしてこの手法でもひらがなやカタカナには変換しないといけない。

どちらにせよ英語の表現については曖昧ですが、英語は見ないことにして進めていきましょう。よ。
で、前回の次回予告にあったWikipediaの例は、どちらかといえば手法Aです。Bは混乱必須なのでここは大人しくAで。

処理の流れ

大体決めるべきところは決まったような気がするので、処理の流れを定義しておきます。

  • 文章の読み込み
  • 文に分割

一つひとつの文に対して、

何かが抜けてるような気もしますが、おおむねこんな感じの処理になると思います。

この章のまとめ

大方の設計は実は前回で終わっているのです。よって今回決めたのは本当に細かい部分。

  • 文頭・文末にはそれぞれに合った表現でなければならないというルールを制定
  • 「文字→モーラ」の変換は、ひらがな1文字をそのままモーラに変換するが、「っ」以外の小さい文字はカウントしない
  • 英語は見ない。日本語大好き。
  • 処理の流れ(上部参照)

あと考えるとすれば、意味の通じるものを検出するには、文節単位でみる必要があるということですかね。今のところはあまり考えない。

次回予告

この章までで設計はある程度できたので、あとは実装するのみ。で、どうせまた問題点が発見されるだろうため、その新たな問題点について書く予定です。 なければ「実行結果発表~~~!!」ってところです。お楽しみに。