続・Pythonでデレステのガシャのスクショからアイドルの名前を読み取ろうと頑張った
むぅんです。お久しぶりです。
最近若干デレステのモチベが下がっていたのですが、久々にモチベが戻ってきたので今回は以前作った名前を読み取るプログラムの改良を行ったものを紹介しようと思います。
前回の記事はこちらになります。
shinemoon227.hatenablog.jp
さて、こちらのプログラムですが、主に2つの問題点がありました。
・名前が正しく読み取れることのほうが少ない
・長い名前のアイドルの名前が読み取れない
まず1つ目に関してですが、これは文字を認識していく上で仕方のないことです。勿論文字が違うこともありますし、除ききれなかったゴミが認識されてしまい記号が含まれてしまうこともあります。特に背景のあるSR以上のカードはかなり精度が悪いです。
2つ目に、少しでもゴミを減らすために読み取る幅を更に狭めてしまうと、「イヴ・サンタクロース」や「メアリー・コクラン」といった長い名前のアイドルがまるで読み取れないといった問題点も挙げられます。
difflibの利用
そこで今回はPythonのdifflibというライブラリを利用し、認識できた文字列と最も名前の近いアイドルを出力結果とすることで、少なくとも実在しないアイドルの名前になることを避ける方針でプログラムを組んでみました。
文字列str1とstr2の類似度 (ただし )はdifflib.SequenceMatcher(None, str1, str2).ratio()で求めることができます。完全に一致していれば1、全く一致していなければ0が返ってきます。
a = '関裕美' b = '間裕美' c = '積裕美' print(difflib.SequenceMatcher(None, a, b).ratio()) print(difflib.SequenceMatcher(None, a, c).ratio())
$ python3 main.py 0.6666666666666666 0.6666666666666666
類似度とは言ってもあくまで文字がどれくらいの割合で一致しているかというだけで、見た目が似ている漢字であるとか読みが同じ漢字であるかということは関係なく計算されるようです。上記の例ではどちらも文字列の $2/3$ が一致しているということがわかるわけですね。カタカナなどは全角と半角でも区別されるそうです。
アイドルは全員合わせても200人未満なので、それぞれの名前をリストに格納しておき、その中で最も類似していた名前を解としました。ただし、稀に1文字も認識できないことがあり、その場合は比較しようがないので適当な文字列を返します。
def searchCorrectName(txt, nameList): if txt == '': return '???' mem = {} for name in nameList: d = difflib.SequenceMatcher(None, txt, name).ratio() if d > 0: mem[name] = d return sorted(mem.items(), key=lambda x:x[1], reverse=True)[0]
やっていることはこれだけです。txtが読み取った文字列、nameListが全アイドルの名前が格納されたリストです。
一応簡単に解説しておくと、txtが空のとき、すなわち名前が認識できていなかったときは'???'を返します。そうでなかったときは類似度が0より大きい名前とその類似度をディクショナリmemに格納します(かすってすらいない名前が大半なのでそれらは弾く)。最後にそれをソートし、reverseにTrueを指定し降順にしてから先頭の要素(最大値)を持つキーを返すという関数になっています。
txt = re.sub(r'[ -~]', '', txt) txt = txt.replace(' ', '')
書き忘れていましたが、読み取った文字列は事前に上記の処理を行って余計な文字を除去しています。前回の記事では半角および全角スペースのみを除去していましたが、今回は正規表現で半角文字を一括で除去してしまいます。
実験
それでは以下の画像に写っているアイドルの名前を実際に読み取ってみましょう。
白菊ほたる 前川みく 結城晴 野々村そら 若林智香 ??? 佐久間まゆ 海老原菜帆 伊集院惠 メアリー・コクラン 西川保奈美 難波笑美
もともと読み取れていなかったアイドル以外は完璧です!しぶりんはどうやっても名前を読めなかったのでこればかりは仕方ないですね…。
ただ、プログラムを書いてたときは名前がほぼ一致している城ヶ崎姉妹の処理を工夫した気がするんですがその痕跡が見当たらなかったのは何故でしょうね…(プログラムを書いたのが去年のことなのに記事にするのが遅すぎる)
もし工夫するとするなら、プログラム作成時にはいなかった久川姉妹の名前も合わせて処理してやる必要がありそうです(Rは存在しないので現状滅多にスクショを撮れる機会はありませんが)。
今回参考にさせていただいた記事です。