マルコフ連鎖で、botの発言を生成していると、時々片括弧が生み出されてしまいます。
たとえばこんな感じ。
群馬(ポロリもあるよ)」=感謝なんだろうかと担当さんにレスの仕方教えてあげてくださいー
http://twitter.com/tomiya_bot/status/29734855453450243
手っ取り早く処理するならば、括弧を全て除去すればいいのですが、正しい括弧の使用でも破壊してしまう恐れがあります。しかし、その一方で片括弧が正しい「(ry」みたいなときもあります。この処理は簡単そうで意外に難解だと思います。正当なやり方であれば、プログラムのコンパイラのように、スタックを使って括弧を分析させる方法もあるのですが、それはちょっと時間がかかるので、中間的なペアマッチング法で実装してみました。下記にコードを載せておきます。
#!/usr/bin/python # -*- encoding: utf-8 -*- def rm_parentheses(txt=u""): #print txt pr = re.compile(ur'\{|\(|\[|\「|\[|\【|\『|\{|\〔|“|‘|《|\ \}|\)|\]|\」|\]|\】|\』|\}|\〕|”|’|》') parentheses = {u"『":u"』", # left u"{":u"}", u"(":u")", u"【":u"】", u"〔":u"〕", u"[":u"]", u"{":u"}", u"「":u"」", u"“":u"”", u'"':u'"', u'《':u'》', u"』":u"『", # right u"}":u"{", u"」":u"「", u")":u"(", u"】":u"【", u"〕":u"〔", u"]":u"[", u"}":u"{", u"”":u"“", u"》":u"《"} #文字列から文字を一つずつ取り出す for m in txt: #print m, #対象の括弧が見つかったら if pr.match(m): #parenthesesを利用して、相手の括弧を見つけ、oppositeに入れる opposite = parentheses[m] #print opposite try: #相手が見つからなければその括弧は削除する if re.search(opposite, txt) == None: txt = re.sub(m, "", txt) #エラーは無視 except re.error: pass return txt if __name__ == '__main__': print rm_parentheses(u"(あいうえお)「きゃー!!")
この方法でも欠点があり、「(ry」の問題や「あい(えお{お)かきく}けこ」のような書き方には対処できません。
ご意見や、こんな方法あるわよってのがあれば教えてください。