読者です 読者をやめる 読者になる 読者になる

おいしいとこはすこしだけ

文系出身SE見習いの備忘録。

久々に最近読んだ本感想

お久しぶりです。文系出身SE見習いの北白川キリコです。

なんやかやでしばらく更新していなかったので読んだ本の話などします。

 

ロボットからの倫理学入門

ロボットからの倫理学入門

 

ふぁーなんじゃこりゃ! 今一番興味がある範囲のやつ! ってなって買った。

人工知能とかロボットとか周辺に興味がある人、特に研究畑の人というよりは、技術を商品として世間に広めるかもしれないエンジニアの人にこそ是非読んでみてほしい本かも。

規範倫理学については、ロボットを話のフックにしつつよくある功利主義と義務論と徳倫理学を一通り。割とここはよくある感じ。

応用倫理学はロボット・人工知能・IoTなどなどの個別の話をしていて興味深かった。「ロボットが何かやらかしたとき、責任を帰属させることはできるか?」「逆に、ロボットを傷つけるのはいけないことか?」「人間がアンドロイドと会話をしてコミュニケーションをとった気になるとき、人間は騙されているのか?」「IoTですべての情報が収集され得るようになったとき、プライバシーはどうなるのか?」などなど。

メタ倫理的な視点は最初の方でさらっと紹介されたのと、あとは責任のくだりなどで結構出てきたのかな。

実に良かったです。

 

 あとこれは結構前に読みました。

コンピューターで「脳」がつくれるか

コンピューターで「脳」がつくれるか

 

めっちゃわかりやすいけど、知らなかった内容が初めてわかった!!という感じではなかったかな。でもぼやぼやしていた知識が整理できた感じはある。絵が豊富でビジュアル的に捉えられるのも嬉しいですね。

Serversman@VPSでUbuntuサーバを立ててCygwin(Conemu)からSSH接続できるようにした話

文系出身SE見習いの北白川キリコです。

今回はタイトル通りの内容です。(Qiitaとどっちに書こうか悩んだけどこっちにまとめて書きます)


用意したもの/使いたかったもの

  • Windows10
  • CygwinMinGWUTF-8非対応だったので)
  • ConEmu(かっこいいので)
  • Serversman@VPSで借りたUbuntuサーバ(安いので)
    • IPv4アドレス(XXX.XXX.XXX.XXX)
    • ポート番号(多分3843)
    • rootに対応するパスワード
  • TeraTerm(初回ログインに必要そうだったので/Puttyでも良いと思う)


Cygwinをインストール

https://www.cygwin.com/

基本的には上記公式HPからインストーラをDLして道なりに進めば大丈夫です。

参考:cygwinのインストールと使い方


ただ、インストールの際にmakeとsshを入れておかないと後で詰まります。

追ってインストールもできるのですが先にやっておいたほうが面倒がないと思います。


インストーラを起動して勧めていくとこの画面に辿りつくので、

f:id:kitashirakawakiriko:20161118234339p:plain

画面上部のSearch欄を使って以下の2つのパッケージを探します。

  • make(Develの下にあります)
  • openssh(Netsの下にあります)

ちなみに検索ワードを入力してからエンターキーを押すと次の画面に進んでしまってイライラするので注意。


CygwinをConEmuで開けるようにする

qiita.com

こちらを参考にさせていただきました。

別に真っ黒な画面でもいいといえばいいのですが、Conemu好きなので。


Teratermでログイン→鍵を生成して設置

root権限で仮想マシンへログインする | マニュアル|ServersMan@VPS Entry/Standard/Proプラン|仮想専用サーバー|クラウドサービス:ユビキタスプロバイダ DTI

ログインについてはServersMan@VPSさん側でマニュアルを用意してくれていたので素直に言うとおりにしました。


その後、TeraTermで鍵を作成します。

f:id:kitashirakawakiriko:20161118234350p:plain

f:id:kitashirakawakiriko:20161118234626p:plain

生成→パスフレーズ設定→公開鍵保存・秘密鍵保存の順でいいかと思います(厳密には公開鍵保存のときにはパスフレーズなくてもいいはずなのですが)。

保存先は一旦は適当で。後で然るべき場所に移動させます。


その後、公開鍵(id_rsa.pub)をサーバに設置します。

f:id:kitashirakawakiriko:20161118235306p:plain

TeraTermのウィンドウ上にドラッグアンドドロップするとこういうダイアログが表示されます。

「SCP」ボタンをクリックすると、カレントディレクトリに公開鍵がコピーされます。


あとは以下のような感じで。

$ mv id_rsa.pub ~/.ssh               # .sshに配置
$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys  # 公開鍵の内容をauthorized_keysファイルに統合
$ rm id_rsa.pub                      # 統合後は元の公開鍵は要らないので削除
$ chmod 600 authorized_keys          # authorized_keysのアクセス制限変更

ここまでやったらとりあえずサーバとのセッションを切断します。


秘密鍵でログインする準備

さっき適当なところに置いた秘密鍵ですが、これをホームディレクトリに置きます。

コマンド叩いてもいいし、どうせWindows上のことなのでエクスプローラ使ってもいいです(CygwinのホームディレクトリはだいたいC:\cygwin64\home(ユーザ名)だと思います)。

ただ、.sshフォルダ作るのはエクスプローラ上ではできないと思うので、

$ mkdir ~/.ssh      # .sshフォルダ作成
$ mv id_rsa ~/.ssh  # 秘密鍵を移動。.sshフォルダ内にさらにディレクトリを切ってもいいかも

こんな感じで移動して保存しておきます。


ここまでできたらいざアクセス!

$ ssh -l root -i .ssh/id_rsa -p [ポート番号] [サーバのIPアドレス]

パスフレーズを聞かれると思うので、鍵作成時に設定したパスフレーズを入力します。

これで接続できるはず!


Ubuntuの初期設定

無事に繋がる状態になったら、諸々の初期設定をしていきます。

ServerMan@VPSを借りてみた。Ubuntu初期設定 | さがさんといてください

初期設定に関してはこちらを丸パクリしましたので特に語ることはないです。


終わってみて

サーバ触ったことは仕事でもほとんどなかったので戸惑いましたが、分かってみれば一本道でした。

今後はちょっとしたWebサービスみたいなのを作っていきたいなと思ってます。

Doc2VecでMTGの類似カードを探すソフトができた

文系出身SE見習いの北白川キリコです。

 

Doc2VecでMTGの類似カードを探してみた - おいしいとこはすこしだけ

Doc2VecでMTGの類似カードをかなり探せるようになった - おいしいとこはすこしだけ

連続で記事にしてましたが、ついにフリーソフトの形式にできたので公開します。

 

ソフト概要

MTGのカード名を入力すると、それに似たカードを探してきてくれるソフトです。

機械学習でカードの特徴を見つけることで、似たカードかどうかを判断しています。

 

Similar Gathererという名前を付けました。

似たカードを集めるというのと、マジック・ザ・ギャザリングに引っ掛けて、あと語呂を良くしたみたいなネーミングで……説明するの恥ずかしいですね……

 

ダウンロード

下記DropBoxからどうぞ。

www.dropbox.com

※動作確認済みですが、未知のバグが存在する可能性があります。自己責任のもとで試してください。このソフトを使用したことにより発生したいかなる問題・損害にも、当方は一切の責任を負いません。

 

画面仕様・使い方

f:id:kitashirakawakiriko:20160827133530p:plain

上のテキストボックスにカードの名前を入力してボタンをポチーするだけです。

 

類似度計算の仕組み

カードテキストを単語ごとに分割し、Word2Vecという機械学習ニューラルネットワーク)の手法を使って単語を200次元のベクトルに変換しています。と同時に、一枚のカードのテキスト全体にもベクトルを割り振っています。まとめてDoc2Vecという手法になるそうです。

ちなみに、Doc2Vecの中でも、文章全体(カード全体)の特徴を正しく捉えやすいPV-DBOWという手法を採用しています。

Doc2Vecの実行は、Pythonライブラリgensimのモジュールで行なっています。

 

このDoc2Vecで生成されたベクトルを一旦テキストで書き出し、それをC#.NETで読み込ませて、ベクトル同士のコサイン類似度を計算→上位10件を表示しています。

zipファイル内に入っているcard_vecs.d2vがテキスト化されたベクトルデータです。

 

その他

C#.NETによるGUI側の開発環境はVisual C#。対応環境はWindows Vista以降とさせていただきます。

PythonによるDoc2Vec実行はSpyder(Python2.7.10)で行いました。

 

カードデータは、現状イニストラードを覆う影まで対応しています。今後も更新予定です。

 

 

よろしければ是非触ってみてください!

Doc2VecでMTGの類似カードをかなり探せるようになった

文系出身SE見習いの北白川キリコです。


kitashirakawakiriko.hatenablog.com

↑昨日の時点↑ではかなりビミョーな精度だったDoc2Vecでの類似カード探しですが、色々弄ってみたところいい感じになりました。

(メインのDoc2Vec実装部分は上記記事を参照してください)


改善した部分

  • 辞書の保存方式が間違っていたので修正した

Janomeユーザ辞書ファイルはcsv方式で保存しないといけなかったみたいなんですけど、txtファイルにしちゃってたので用語の抽出ができてなかったみたいです。さっくり直しました。


  • カード情報に、マナコストとカードの種類(クリーチャーとかインスタントとか)を追加した

カード名、タイプ、フレーバーテキストイラストレーター、エキスパンション、ナンバー、以外の全ての情報を参照するようになりました。


  • テキスト中に出てくるそのカードの名前の表記をタグに置き換えた

よく「~は」と略される部分ですね。あの部分のせいで、似た効果のカードでも全然違う単語で構成されていることになってしまっていたので、全て<selfname>というタグに置換しました。


  • パラメータを変更した
# model = doc2vec.Doc2Vec(card_text, size=100, window=8, min_count=2, workers=4)
model = doc2vec.Doc2Vec(card_text, size=200, window=5, min_count=1, workers=4,
                        dm=0, iter=20)

パラメータ「dm」はモデルの指定です。デフォルトの1だとPV-DMモデルで、1以外にするとPV-DBOWモデルになります。

あんまり詳しく分かっているわけでもないので追って勉強しようと思うのですが、文脈を読んだりするのはPV-DBOWのほうが得意なようです。

iterは処理のループ回数ですね。これを増やすと収束が進むはずです。


どんな結果になったか

精神を刻む者、ジェイス is similar to...

記憶の熟達者、ジェイス 0.634908735752

リリアナ・ヴェス 0.624688506126

ジェイス・ベレレン 0.623304367065

思考を築く者、ジェイス 0.606780409813

ギルドパクトの体現者、ジェイス 0.556868731976

盗まれた計画 0.550258159637

恐喝 0.52756613493

精神刻み 0.510042726994

アイ・スパイ 0.503896474838

苦悶の記憶 0.499331712723

ふむふむ。まあこれくらいは。(しかしカードタイトルは情報に入ってないのに精神刻みが入るのは偉い)


耕作 is similar to...

木霊の手の内 0.838466882706

爆発的植生 0.755218982697

つややかな雄鹿 0.728160262108

ガイアの恵み 0.713408350945

砕土 0.703940093517

はるかなる放浪 0.702058851719

荒々しき自然 0.701890289783

天球儀 0.700265944004

分かれ道 0.699324011803

地勢 0.691918075085

おお、かなり妥当に!


囁く者、シェオルドレッド is similar to...

下水溜まり 0.565416395664

ダクムーアの女魔術師 0.498627662659

アヌーリッドの濁り水潜り 0.486608326435

影生まれの悪魔 0.48333221674

永遠警備の歩哨 0.480452954769

魏の大将軍 司馬懿 0.465717792511

目覚めし深海、レクシャル 0.463148444891

野生のレオトー 0.450714677572

魔女エンジン 0.448547929525

シタヌールのケンタウルス 0.447803080082

や、やはり沼渡り……? でも少し近くなったし、類似度自体が低いので納得もできるかも。


ここからは新規で試したものを。

ファイレクシアの破棄者 is similar to...

真髄の針 0.778615474701

虚空石のガーゴイル 0.596821725368

翻弄する魔道士 0.588838577271

サーボの網 0.586093187332

無の空間 0.581093549728

失敗の宣告 0.561350464821

金輪際 0.511417448521

太陽の聖杯 0.463119745255

呉の参謀 魯粛 0.462164878845

タラスの研究者 0.456732481718

やるやん!


知識槽 is similar to...

盗品 0.629252254963

吹き荒れる潜在能力 0.575982689857

呪文織りのらせん 0.544468641281

思考の牢獄 0.540273070335

嵐の目 0.520646452904

分かち合う運命 0.512997925282

ズアーの運命支配 0.511536240578

隠れ潜む捕食者 0.504770219326

悪逆な富 0.504193246365

遥かなる記憶 0.501467108727

わかる。


謙虚 is similar to...

お粗末 0.729776024818

羊術 0.692999660969

木化 0.607517182827

縮退 0.582631349564

突然の俗化 0.581382155418

変身術士の戯れ 0.559987187386

ダークスティールの突然変異 0.553241074085

牙の贈り物 0.55151540041

真に暗き時間 0.534347176552

畏敬の神格 0.523278415203

これは見事。


神の怒り is similar to...

滅び 0.883874058723

粉砕の嵐 0.823421597481

ラースの風 0.788604140282

審判の日 0.761777818203

至高の評決 0.690950989723

浄化 0.690596222878

弱者の報復 0.69019562006

カタストロフィ 0.659878373146

疫病の胞子 0.657440006733

ジョークルホープス 0.653918504715

妥当なところ。


大歓楽の幻霊 is similar to...

紅蓮光電の柱 0.742184579372

類電の反響 0.51984077692

テツモスの大神官 0.492548793554

ゴブリン修繕屋 0.492158710957

不純の焼き払い 0.481161177158

石炭運びの豚 0.481044828892

街道筋の強盗 0.477807700634

信仰の癒し手 0.474357873201

ドワーフの祭殿 0.473840385675

テフラダーム 0.47338578105

これはなかなか賢い!


石鍛冶の神秘家 is similar to...

タージ=ナールの剣鍛冶 0.601656615734

ワイアウッドの伝令 0.596696972847

コーの地図作り 0.559696435928

族霊導きの鹿羚羊 0.557160258293

森のレインジャー 0.538396596909

オンドゥの巨人 0.524216353893

鋼打ちの贈り物 0.510856449604

天空の鷹 0.503467321396

マイコシンスの水源 0.500601053238

国境地帯のレインジャー 0.481902807951

これも納得のいく感じ。


運命の輪 is similar to...

シヴ山の隕石 0.674663364887

弧状の刃 0.673180222511

裂け目の稲妻 0.660153388977

略取 0.655520141125

明日への探索 0.646709322929

精神攪乱 0.644515931606

霊気への抑留 0.644413173199

覆われた奇異 0.619173884392

陰謀団の呪い 0.617112517357

裂断術 0.605107724667

あ、あれ……? 命運の輪とごっちゃになってる?


というわけで

かなり賢いモデルになりました!

Webアプリか何かにして、気軽に色んな人に遊んでもらえるようにしたいんですけどね。

せめてデスクトップGUIアプリにできないかな? 少し方法を考えてみます。


※追記(8/26):GUIアプリになりました

Dropbox - Similar Gatherer.zip

作ってみました! Windows対応です。よろしければ触ってみてください。

今後もっと賢くしていけるといいなあ。

Doc2VecでMTGの類似カードを探してみた

文系出身SE見習いの北白川キリコです。


先月やりかけてた、MTGのカードデータと機械学習で何かできないかなーというのをようやく進めました。

先月の段階でWisdom Guildのテキストデータから必要な情報を抽出して形態素解析するところまでできていたので、今日はとりあえずそこからカード名とカードテキストだけ取り出してDoc2Vecで遊んでみました。


Doc2Vecとは

gensimのモジュールの1つです。

Word2Vecを提唱したGoogleのMikolovさんが、「Word2Vecを応用して単語だけじゃなくて文章もベクトル化できるんじゃない?」ということでParagraph2Vecというのを考えてくれました。

Doc2Vecは、その論文をもとに実装されたモジュールとのことです。(Mikolovさん自身が書いたソースコードは公開されていません)

gensim: models.doc2vec – Deep learning with paragraph2vec

gensimはCythonを使っているのでメッチャ早い!! chainerなら1億年ぐらいかかる*1ところを1分で処理してれます。


データ前準備

  • card_names.txt:カード名を改行区切りで記述したもの
  • card_text.txt:カードテキストを形態素解析したトークンを、半角スペース区切りで各カード1行になるよう記述したもの

カード名とカードテキストの順番が一致するようにする。

ただ、Janomeの簡易ユーザ辞書だと優先度を付けられないせいか、辞書登録しても複合語が分割されちゃってたりするんですよね……(「絆」「魂」とか)

この問題に関しては今後検討が必要。


Doc2Vecを動かしてみる

こちらを参考にさせていただきました。

ノート/テキストマイニング/Doc2Vecを試す - 東邦大学理学部情報科学科 山内のサイト


from gensim.models import doc2vec

# カードテキスト読み込み
card_text = doc2vec.TaggedLineDocument('card_text.txt')

# カード名前読み込み(結果表示に使用する)
with codecs.open('card_name.txt', 'r', encoding='utf-8') as f:    
    card_names = [card_name.replace('\n', '') for card_name in f.readlines()]

# モデルデータ作成
# sizeはベクトル圧縮時の次元数
# windowは解析時に対象単語の前後何単語まで見るか
# min_countは出現回数が何回以下の単語を無視するか
# workerはスレッド数
model = doc2vec.Doc2Vec(card_text, size=100, window=8, min_count=2, workers=4)

# データ保存
model.save('mtg.model')
model.save_word2vec_format('mtg.w2vmodel')


#ここから単語同士の類似度

word = u'飛行' # 類似単語を求めたい単語
print word + ' is similar to...'
# 類似単語と類似度のタプル(類似度上位10件)のリストを受け取る
for similarity in model.most_similar(positive=word):
    # タプルのままIPythonに出力するとリテラル表示されないのでこの書き方
    print similarity[0], similarity[1]

# 飛行 is similar to...
# トランプル 0.677506804466
# 速攻 0.510393500328
# 警戒 0.468019366264
# World 0.467057049274
# of 0.449396759272
# は 0.437647610903
# 細工 0.437286615372
# 呪術 0.430927336216
# 合う 0.42149746418
# 占 0.417448014021


# ここからカード同士の類似度

test_card_name = u'精神を刻む者、ジェイス' # 類似カードを求めたいカード名
card_index = card_names.index(test_card_name)

# 類似カードと類似度のタプル(類似度上位10件)のリストを受け取る
similar_docs = model.docvecs.most_similar(card_index)
print name_list[card_index] + ' is similar to...'
for similar_doc in similar_docs:
    print name_list[similar_doc[0]], similar_doc[1]

# 精神を刻む者、ジェイス is similar to...
# ジェイス・ベレレン 0.695143640041
# 解放された者、カーン 0.653617322445
# ゴルガリの凶漢 0.620760858059
# ヴェールのリリアナ 0.608255207539
# リリアナ・ヴェス 0.570708036423
# 屑鉄の学者、ダレッティ 0.563854336739
# 根囲い 0.533906698227
# ゴブリンの手投げ弾 0.528164923191
# 卑小な回収者 0.525354683399
# 威圧ドローン 0.524666070938

うーん。類似単語は正直微妙ですね。

類似カードはまあまあそれっぽいのが出てるのかな。多分プレインズウォーカーは文体が似てるんでしょうね。


他には、

耕作 is similar to...

我が威厳に相応しき領地 0.56421905756

分かれ道 0.517223894596

ウスーンのスフィンクス 0.4909247756

水晶のしぶき 0.488548845053

イロアスの武器庫 0.483968704939

ナイレアの試練 0.474029809237

はるかなる放浪 0.472717642784

炬火のチャンドラ 0.47109413147

非道の総督 0.466766059399

家畜化 0.463470190763

まあ確かに似てはいるか。


霧を歩むもの、ウリル is similar to...

道教の隠者 0.686899602413

果てしなきもの 0.671681404114

追われる足跡 0.65790194273

恐慌の呪文爆弾 0.642627716064

発掘 0.633514404297

夜鷹 0.631523430347

潜む者 0.622953295708

シェオルドレッドの刈り取るもの 0.622068822384

無慈悲なる者ケアヴェク 0.612911939621

防護の泡 0.612293899059

うーん、これはよく分からない。とりあえず呪禁が拾われてるっぽいけど。


囁く者、シェオルドレッド is similar to...

疫病甲虫 0.648859977722

遠沼の探検者 0.644255161285

湿地のゴブリン 0.580218136311

奪い取り屋、サーダ・アデール 0.574257850647

巨人釣り 0.570150911808

鏡の大魔術師 0.556969940662

迷える魂 0.553947329521

野生の雄牛 0.537679135799

稲妻の鉤爪 0.528969883919

略奪する夜魔 0.525935411453

沼を渡る者、シェオルドレッドさん!!!!


ということで、まあなんとなーく似てはいるけどまだ似たカードとは言えないかなあ。

形態素解析の辞書の問題をクリアして、あとはパラメータ調整でもうちょっと精度を上げたいところです。

取り敢えず今日はここまで。


※追記(8/21):精度上がりました

kitashirakawakiriko.hatenablog.com


そういえば最近読んだ本

今更なラインナップを読んでます!

何者 (新潮文庫)

何者 (新潮文庫)

どっちも面白かった!!

*1:1億年は盛りすぎです。70倍ぐらいだそうです。

MTGと機械学習で遊びたいので準備中

文系出身SE見習いの北白川キリコです。


自然言語処理系のDeepLearningが相変わらず楽しいので、MTGでもできないかなーと思い最近ちまちま取り組んでいます。

言語はPythonで、とりあえずgensimでなんかできないかなーと思ってますが、他に面白そうなライブラリ見つけたらそっちに行くかも。


何がしたいの?

オリカのテキストを入力したらいい感じのマナコストをサジェストしてくれるプログラムを作りたい。

既存のデータベースを使って、カードテキストとマナコストを学習させたりできないかなー?

というのが、今回の目標です。


正直、どういうモデルを使えばそういうことができるのか、まだよく分かってない……色々試してみようかなという段階。

gensimはとりあえずword2vecで遊んでみたいので入れておきます。


前準備

  • WinPython(2.7.10)

WinPython - Browse /WinPython_2.7/2.7.10.3 at SourceForge.net

numpyとかscipyとかの主だったライブラリとか、あとIDEのSpyderとかもまるっと入っていて便利。


  • smart_open

smart_open 1.3.3 : Python Package Index

これがないとgensimの実行ができないようなので。

WinPythonにはインストール管理ができるコンパネが付いているので、手軽にパッケージからインストールしていきます。

(別にpipでもいいはずなんだけど、pipの導入自体が面倒くさくてやってないという)


↓のサイトに分かりやすく導入方法が書いてあります。

MinGW(gcc) の Windows へのインストールと使い方 | プログラマーズ雑記帳

ちょっと面倒くさいけど、MinGWみたいなLinuxライク環境入れとくと今後も便利そうですね。


  • gensim

gensim 0.13.3 : Python Package Index

ここまできてようやく満を持してgensim。

smart_openと同様にWinPythonのコンパネから。


Janome 0.2.8 : Python Package Index

あとは形態素解析が必要かなーと思うのでJanomeを導入。


データベース作成

データベースはWisdom Guildさんのカードデータベースより、出力形式を「テキスト」にして全データを検索することで取得。

WHISPER CARD DATABASE - Wisdom Guild


とはいえこのままだと、↓みたいな感じのベタ書きのテキストなので、

 英語名:Abandoned Outpost

日本語名:見捨てられた前哨地(みすてられたぜんしょうち)

 コスト:

 タイプ:土地

見捨てられた前哨地はタップ状態で戦場に出る。

(T):あなたのマナ・プールに(白)を加える。

(T),見捨てられた前哨地を生け贄に捧げる:あなたのマナ・プールに好きな色1色のマナ1点を加える。

イラスト:Edward P. Beard, Jr.

 セット:Odyssey

 稀少度:コモン

ここから必要な情報を切り出していく必要があります。


とりあえず欲しい情報としては、

  • カードの名前

  • マナコスト(色拘束とシンボル両方)

  • カードタイプ

  • テキスト

ぐらいかなー。


def gen_wg_card_list(path):
    
    import codecs
    import re
    
    white_str = u'白'
    blue_str = u'青'
    black_str = u'黒'
    red_str = u'赤'
    green_str = u'緑'
    none_str = u'◇'
    
    eng_header = u' 英語名:'
    jan_header = u'日本語名:'
    cost_header = u' コスト:'
    color_header = u' 色指標:'
    type_header = u' タイプ:'
    illust_header = u'イラスト:'
    set_header = u' セット:'
    rarity_header = u' 稀少度:'
    
    card_list = []
    
    with codecs.open(path, encoding = 'utf_8_sig') as f:        
        # カードの情報は、
        # 日本語名・マナシンボル・点数で見たマナコスト・カードタイプ・カードテキスト
        # の5要素の配列で管理
        card_info = [u'', [0]*6, 0, u'', u'']
        info_set = [False]*5
        for line in f.readlines():
            
            # 日本語名・コスト・色指標・タイプ・カードテキスト以外は飛ばす
            if line.count(eng_header) or \
            line.count(illust_header) or \
            line.count(set_header) or \
            line.count(rarity_header) or \
            line == u'\r\n':
                # この直前までに必要事項が全て埋まっていたらリストに加える
                if False not in info_set:
                    info_set = [False]*5
                    card_list.append(card_info)
                    card_info = [u'', [0]*6, 0, u'', u'']
                continue
            
            # 日本語名は()内の読みがなを削除して登録
            elif line.count(jan_header):
                info_set[0] = True
                card_info[0] = re.sub(u'\r\n', u'', re.sub(
                u'(.*)', u'', re.sub(jan_header, u'', line)))
            
            # マナコストはWUBRG+Nの6要素の配列で管理
            elif line.count(cost_header):
                info_set[1] = True
                card_info[1][0] = line.count(white_str)
                card_info[1][1] = line.count(blue_str)
                card_info[1][2] = line.count(black_str)
                card_info[1][3] = line.count(red_str)
                card_info[1][4] = line.count(green_str)
                card_info[1][5] = line.count(none_str) 
               
                # 点数で見たマナコストは()の数でカウント
                info_set[2] = True
                card_info[2] = line.count(u'(')
            
            # 色指標しかない場合はマナコスト-1とする
            elif line.count(color_header):
                info_set[1] = True
                card_info[1][0] = line.count(white_str)
                card_info[1][1] = line.count(blue_str)
                card_info[1][2] = line.count(black_str)
                card_info[1][3] = line.count(red_str)
                card_info[1][4] = line.count(green_str)
                card_info[1][5] = line.count(none_str)
    
                info_set[2] = True
                card_info[2] = -1
            
            # カード・タイプからサブタイプや部族を削除して登録
            elif line.count(type_header):
                info_set[3] = True
                card_info[3] = re.sub(u'\r\n', u'', re.sub(
                u' --- .*', u'', re.sub(type_header, u'', line)))
            
            # その他の部分は全てカードテキストとして登録
            else:
                info_set[4] = True
                card_info[4] += line
            
    return card_list

if __name__ == '__main__':
    card_list = gen_wg_card_list('C:\\Python\\Projects\\mtg\\resource\\mtgdata.txt')

ってこれ、今気づいたけどマナコストのカウントの仕方おかしいですね……

(の数を数える方法だと(5)でも1マナと判定されてしまうので、()内にある数字を正規表現かなんかで抽出してintにするとかそういうのになるかなあ。


ともあれこれで一旦データベースの形にはなった(あとでマナコスト周り修正しなくちゃだけど)。

あとはカードテキストを形態素解析してー……と思ったら、問題発生。

MTG用語は一般辞書に含まれていないものが多いので、変な分割をされてしまったりするんですね。


形態素解析用辞書作成

というわけで、Janome用のユーザ辞書を作らないといけない。


はじめはMTG Wikiから単語を拾ってこられないかなーと思ったけど、結構面倒くさそう。

というわけで、

専門用語(キーワード)自動抽出システム”のページ

こちらのTermExtractをお借りすることで強引に解決することにしました。


TermExtractは、コーパス中の単語の語順や出現頻度から、連語による重要単語を抽出するというスグレモノperlモジュールです。

python版もあったんですが3.x対応だったのでやめておきました。

こいつに、先ほど抽出したカードテキストを食わせてやると……

クリーチャー

ターン終了

カード

呪文

土地

1つ

ターン

呪文1つ

ダメージ

土地1つ

カウンター

対象

プレイヤー

対戦相手

ちょっと変なのもありますが、いい感じではないでしょうか。

「絆魂」とか「呪禁」とか、「ツリーフォーク」なんかもちゃんと取れています。


これをJanomeユーザ辞書形式にすれば、形態素解析はできそうかなー。

というところで、今日は終わり。まだ機械学習のきの字にもかかってない。先は長いですが、頑張ろう。


……とりあえずword2vecで適当に遊んでみるところからやってみても良いかもしれないですね。

HP Stream 11にXubuntuを入れてみた

文系出身SE見習いの北白川キリコです。

 

先日のDeep Learning講習でTensorFlowを使うためにVirtual BoxにUbuntuを入れたんですけれども、このPCが結構古い上に(物理的に)重いラップトップで、今後ハンズオンの講習やら勉強会やらにいちいち持っていくのはちょっと骨だなーと。

 

そもそも、元々勉強会とかにはHP Stream 11 d012TUを持って行こうと思ってたんですよね。

今はこの型番だと30000円超えてるけど、買ったときは送料込みで28000円ぐらいでした。軽いし見た目も可愛いし、あとキーボードの感じが良くてめっちゃお気に入り。

でもこれディスク容量が32GBしかないんで、仮想マシンとかとても載らなかったんですよね。

 

で、悔しかったので、カッとなってこれをUbuntuにしちゃうことにしました。

大体買ったときから入ってるOSが8.1で使いにくいし、なかなか10にアップデートしてくれないし、もうWindowsなんか知らんわ。デュアルブートとか洒落くさい(容量もないし)。完全にUbuntuにしてやるぜ。

 

結論から言うと

f:id:kitashirakawakiriko:20160620003414j:plain

無事にUbuntuXubuntu(14.04)になったよー

無線LANも繋がるし快適に動いてます。

 

やったこと

※基本的にこの記事を参考にしています。

qiita.com

 

Step1. UNetboostinでインストールメディア(USBスティック)を作る

とりあえず、USBメモリを買ってきます。

で、HP Streamじゃない別のPCを用意します。

別PCに、Xubuntu14.04LTSのamd64のISOファイルUNetbootinをダウンロードしてきます。

ここまで揃ったら、別PCに買ってきたUSBを挿して、UNetbootinを起動して、さっき落としてきたISOファイルを指定してインストールメディアを作ります。UNetbootinの使い方は触ってれば分かりそう。分からなかったら公式を見よう。

 

Step2. Xubuntuをインストール

HP Streamにインストールメディアを突き刺して起動。

起動画面でEscを押してBIOS画面に行き……たいところなんですがやたら起動が早くて上手くいかないので、普通に起動しちゃいます。

www.windowseight.net

で、こちらの手順↑でBIOSUEFI)画面を呼びます。

F9を押してブート選択画面に行って、さっき突き刺したUSBメモリを選択。

あとは画面に従ってインストールするだけです。簡単。

 

Step3. Wi-fiに繋がらないので繋げる

無線LANドライバを認識していないのか上手く繋がりません。

HP StreamにはLANケーブルのコネクタがないので、Wi-Fiが使えないとどうしようもない。

 

blog.indeep.xyz

とりあえずこちらを参考に、無線LANチップの型番を調べてみたり。

でも出てきた型番(BCM43142)をLinux Wirelessで調べてきても見つからないんですよね。

 

別PCでいろんなドライバをDLして、それをHP Streamに移送して……とかやってたんですがどうにも埒が明かないので、USB-LANアダプタを買ってきました。

Logitec 有線LANアダプタ USB2.0 LAN-TXU2C

Logitec 有線LANアダプタ USB2.0 LAN-TXU2C

 

これでガチーンと繋いで、

  • apt-getのupdateとupgrade
  • firmware-b43-installerをインストール
  • 再起動!

→繋がらない!!

また色々調べてみて、

askubuntu.com

  • bcmwl-kernel-sourceをインストール
  • 再起動!!

→繋がりました!!

(本当はちゃんとコマンド書きたかったんだけどはてな記法がめんどくさくて断念した)

 

Step4. 日本語入力に対応させる

やったー繋がったーという喜びの声をツイッターに投稿しようとしたら日本語入力ができない。

 

でも、

"Xubuntu 14.04 LTS"の日本語入力

こちらを参考に、fcitx-mozcを導入したらすぐできるようになりました。

 

というわけで全部終わってみて

今のところすこぶる快適です。Windows8.1入ってたときより快適では?(あのメニュー画面本当に嫌いだったんですよね……)

Windowsでは動かないor非推奨な機械学習系ライブラリなんかを気楽に試したり、勉強会とかにフットワーク軽く持っていったりしようと思います。