catalinaの備忘録スマートフォン用の表示で見るcatalinaの備忘録ソフトウェアやハードウェアの備忘録。後で逆引きできるように。ElasticSearchGWが終わって、しばらく祝日なしの日が続きます。私は毎年この時期を「6月砂漠」と呼ぶことにしています。今回はMTGのカードのテキストデータを分析してみようと思います。画像処理ばかりやってると数式相手になることが多いので、時には気分転換も必要です。目的とかMTGのカードは時代によって流行り廃れがあります。去年はすごく流行っててカードショップでも高額で取引されていたカードが、今は全然見かけないとか。これを分析することができれば、何かデータが見えてこないかなというのが今回の目的です。テキストマイニングは初めてなので、できるだけ手軽に既存のツールやライブラリを組み合わせて実現していこうと思います。今回は環境を作り上げて軽く動かすところまでやってみます。Kibanaコンテナ一式を立てるElasticsearchを使うためのコンテナ一式を立てます。今回のElasticsearchの用途は次のとおりです他ホストからRESTでデータを投げ込んでもらう日本語解析にはkuromojiを使うKibanaで確認する早速コンテナを立てるところからやってみます。docker-composedocker-compose.ymlはこうなりました。elastic-stack:kuromoji.dockerfileelasticsearchの日本語解析プラグインとしてkuromojiを使いたいので、それを組み込むためのdockerfileを書きます。上記docker-compose.ymlが参照するkuromoji.dockerfileはこうなりました。インストールするだけでした。公式マニュアルにあるkuromojiをインストールする。analysis-kuromojiこれでelasticsearchの用意ができました。-dして起動確認します。logsでログを見たりします。うまく起動したら、kuromojiが有効になっているか確認します。'http://localhost:9200/_nodes/plugins?pretty'このあたりの基本的な操作はこちらのサイトを参考にさせていただきました。http://pppurple.hatenablog.com/entry/2017/05/28/141143Elasticsearchに投入するデータを用意する(MTGのカードデータ)以下の手順でデータを注入します。保存したファイルを整形して、ElasticsearchのRESTに渡すデータのダウンロードとElasticSearchへの注入を分けた理由は、MTG-APIが外部サーバだからというのと、個人的に空いた時間にちまちまとコードを書きたかったからです。ネットが繋がらない状態でもローカルにファイルを持っていれば作業できるので。MTG公式からのカードデータ取得と保存python3でいきます。以前DeepLearningのときに試したコードの引用ですね。--setcode=DOMこうするとカレントディレクトリに./card-texts/DOMディレクトリが作られ、そこにドミナリアのカード情報一覧が保存されます。./card-texts/DOM/0.txtはこんな内容になります。"キッカー{4}(あなたはこの呪文を唱えるに際し、追加で{4}を支払ってもよい。)\n飛行\nアカデミーのドレイクがキッカーされていたなら、これは+1/+1カウンターが2個置かれた状態で戦場に出る。444273}elasticsearchにデータを入れていくElasticSearchの前準備として次の2つを行います。kuromoji日本語解析器を設定しますMTGのカードを解析するためのマッピング設定を行います。簡単に説明します、前者の日本語解析器はいわゆる形態素解析してくれるモジュールです。何?私はその分野の専門家ではないので、今回の用途だけに絞って簡単に説明します。興味ない人は読み飛ばしてください。上記jsonのままでは、たとえばtextフィールドの長い文字列からの検索になってしまい、単語単位での分析がうまくできません。おおざっぱに解釈すると、単語単位に分割する方法の一つが形態素解析らしいです。英語やドイツ語などであれば、空白で区切れば単語単位になる日本語では空白で区切るという概念はないあたりが要因のようです。「日本語は助詞で区切ればいいのでは?」と思いますが、境界判別という問題があって、助詞がどこかわからない文字列だと解釈に困ります。そのあたりを頑張ってくれるモジュールということなので、便利に使わせてもらいましょう。設定はこうなりました。}}こうやってelastic-searchに投げます。application/json'うまくいけばこんなjsonレスポンスが返ってきます。"mtg"}下準備ができたのでデータ注入します。Elasticsearchに入力するデータは少々加工する必要があるので、スクリプト書きました。スクリプトの概要はこんな感じです。動作確認用にall_<カードセット名>.txtとして保存elasticSearchに入れる思ったより簡単にできたのでブログに直接乗せてしまいます。main()動かします。0x000001FCA430A048>エラーチェックがすっぽ抜けてますね。HTTPResponseオブジェクトが返ってきてとりあえずいけました。API叩いていても寂しいので、テキストマイニングっぽくワードクラウドを作ってみます。これでkibanaから日本語で検索したり色々できるようになります。ElasticSearchでワードクラウドを作る用意kibanaで操作していきます。選択インデックス名に"MTG"を入力あとは適当にOKおしていくこんだけです。このときの注意点で、フィールド名一覧の管理画面でtext,name,flavorの各フィールドの「Aggregatable」が有効になっていることを確認しておきます。詳しいことはわからないのですが、どうやらRAM上に載せておいて色々な処理に使える(たとえば今回のワードクラウド)ようです。目視確認それっぽいデータが入っていればOKです。ワードクラウドを作る用意ElasticSearchではタグクラウドというらしいです。タグクラウドを作るための基本設定をしていきます。IndexのNameから'MTG'を選択(これはkibanaで最初に作ったインデックスの名前です)これでタグクラウドの設定画面まできました。タグクラウドを出してみるタグクラウドの設定画面で色々設定してみます。テキストマイニングは初めてなので、まずは雰囲気を掴んで面白いと思うところが大事だと思います。設定値はこんな感じにしました。40こんな感じのできました。見たところ、MTG固有の用語がうまく分析できてなさそうです。リア)ひとまずテキストマイニングの土台ができたと思うので一旦良しとします。感想と今後の展望テキストの分析がうまくいっていないのは形態素解析の都合で、未知の単語をうまく解釈できてないことによるものです。今回の用途(MTG専用の分析をやりたい)であれば、kuromojiの辞書に追加してあげるだけでよさそうです。単語の出現傾向を分析するのも色々楽しそうです。今回のタグクラウドをいじっていると歴史的とアーティファクトがセットで現れることが多いです。ゲームが分かる人からみれば「ドミナリアでテストしたから当然でしょ」って内容ではありますが、こういう「当たり前だね」っていうのをデータで示しておくことは分析では重要なことだと思います。それでは今回はこれくらいで。13:40MTGのカード情報の傾向分析を行う(準備編)Tweet広告を非表示にする関連記事2017-05-04ChainerでMTGのカードを分類する(識別フェーズ)黄金週間なので趣味プログラミングに没頭です。»プロフィールid:Catalina1344ソフトウェアやハードウェアの備忘録。後で逆引きできるように。OpenMVSで3D再構築するOpenMVGを試してみる(環境構築+α)父の日ですね月別アーカイブ忍者AdMaxはてなブログをはじめよう!Catalina1344さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。