f:id:insaneway:20191014012701j:plain
Image by Gerd Altmann from Pixabay

海外ドラマを見始めてしばらくすると、なにげに聞いた英語表現を以前別のドラマでも聞いたことあるな、と感じる瞬間が頻繁に訪れます。でもどのドラマか分からない、分かったとしてもどのエピソードなのかが思い出せない。下手すると100以上のエピソードだったりしますからneedle in a haystackになりがち。そんなことが実際頻発しましたので、昨年ローカルPCに字幕DBを構築し、一度見たドラマのエピソード字幕はそこにぶち込むようになりました。

RDB

RDBはMySQLを使っています。基本はDramaテーブル(id, name)とLineテーブル(id, drama_id, season_no, episode_no, seq_no, start_time, end_time, line)で構成されています。このDBにSRTファイルからセリフデータを流し込むスクリプトを作成し、ドラマ見終わった→SRTファイルをダウンロード→取り込み、という処理を行います。たまにSRTファイルが正常に取り込めなかったりもします。きちんとフォーマットが確定していないので仕方がない。その都度微調整。この取り込み処理がこのシステムで一番プログラム(Python)を書いた場所です。多分オープンソースのライブラリを使っていればそれすら不要だったと思います。でもSRTファイルフォーマットを一見して単純だと思ってしまったんだよなあ。今ならオープンソースライブラリを使います。

曖昧検索

Elasticsearchエンジンを使ってバックグラウンドでLineテーブルのlineフィールドをindex化する設定をしておきます。このエンジンは使うの初めてだったのですが、相当優秀です。ただし、データ量がすごいことになっているので、再インデックスを作ると一週間くらいかかると思います。後はこのエンジンに対して検索したい文字列で、curl http://localhost:9200/lines_development/_search?pretty -dを発行するだけです。APIを詳しく調べてないので、もしかしたらこれ以外に有用な利用法があるかもです。

UI

WEBアプリになってます。localhostを開くとGoogleみたく検索窓が一つあり、単語を入力するとElasticsearchの結果を表示。さらにその結果をクリックすると該当ドラマ、シーズン、エピソードの該当シーンの前後30秒をLineテーブルに問い合わせてブラウザに表示します。これもSQLクエリの操作なので数行の処理です。HTML出力が数十行。

こんな感じでwebアプリ開発は初めてでしたが、結構簡単に作れてしまいました。やはり英語を勉強したいという強い願望が可能にしてくれたんだと思います。