日本のWikipediaのデータを使ったWord2vecでの類似語表示とngramで文生成 (1)
まともに使ったことがなかったWord2vecを使っていきます。
データを手に入れる
まず、Wikipediaのデータはここから拾ってきます。
Wikipedia:データベースダウンロード - Wikipedia
基本は最新の全ページを拾ってくればいいと思います。
英語を使いたい人は少し前処理を変える必要がありますが、普通にいけると思います。
wgetで拾います。容量が大きいので要注意。
wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
前処理
データが大きいので分割して処理します。
wikiextractorをcloneして使いましょう。
git clone https://github.com/attardi/wikiextractor.git cd wikiextractor
extractというフォルダに、1ファイル50Mずつで分割して出力します。
python WikiExtractor.py -b 50M -o extract jawiki-latest-pages-articles.xml.bz2
正規化
こちらのコードを使わせていただきました。
umiushizn.blogspot.jp
normalize_neologd.py
# encoding: utf8 from __future__ import unicode_literals import re import unicodedata def unicode_normalize(cls, s): pt = re.compile('([{}]+)'.format(cls)) def norm(c): return unicodedata.normalize('NFKC', c) if pt.match(c) else c s = ''.join(norm(x) for x in re.split(pt, s)) s = re.sub('-', '-', s) return s def remove_extra_spaces(s): s = re.sub('[ ]+', ' ', s) blocks = ''.join(('\u4E00-\u9FFF', # CJK UNIFIED IDEOGRAPHS '\u3040-\u309F', # HIRAGANA '\u30A0-\u30FF', # KATAKANA '\u3000-\u303F', # CJK SYMBOLS AND PUNCTUATION '\uFF00-\uFFEF' # HALFWIDTH AND FULLWIDTH FORMS )) basic_latin = '\u0000-\u007F' def remove_space_between(cls1, cls2, s): p = re.compile('([{}]) ([{}])'.format(cls1, cls2)) while p.search(s): s = p.sub(r'\1\2', s) return s s = remove_space_between(blocks, blocks, s) s = remove_space_between(blocks, basic_latin, s) s = remove_space_between(basic_latin, blocks, s) return s def normalize_neologd(s): s = s.strip() s = unicode_normalize('0-9A-Za-z。-゚', s) def maketrans(f, t): return {ord(x): ord(y) for x, y in zip(f, t)} s = re.sub('[˗֊‐‑‒–⁃⁻₋−]+', '-', s) # normalize hyphens s = re.sub('[﹣-ー—―─━ー]+', 'ー', s) # normalize choonpus s = re.sub('[~∼∾〜〰~]', '', s) # remove tildes s = s.translate( maketrans('!"#$%&\'()*+,-./:;<=>?@[¥]^_`{|}~。、・「」', '!”#$%&’()*+,-./:;<=>?@[¥]^_`{|}〜。、・「」')) s = remove_extra_spaces(s) s = unicode_normalize('!”#$%&’()*+,-./:;<>?@[¥]^_`{|}〜', s) # keep =,・,「,」 s = re.sub('[’]', '\'', s) s = re.sub('[”]', '"', s) return s if __name__ == "__main__": assert "0123456789" == normalize_neologd("0123456789") assert "ABCDEFGHIJKLMNOPQRSTUVWXYZ" == normalize_neologd("ABCDEFGHIJKLMNOPQRSTUVWXYZ") assert "abcdefghijklmnopqrstuvwxyz" == normalize_neologd("abcdefghijklmnopqrstuvwxyz") assert "!\"#$%&'()*+,-./:;<>?@[¥]^_`{|}" == normalize_neologd("!”#$%&’()*+,-./:;<>?@[¥]^_`{|}") assert "=。、・「」" == normalize_neologd("=。、・「」") assert "ハンカク" == normalize_neologd("ハンカク") assert "o-o" == normalize_neologd("o₋o") assert "majikaー" == normalize_neologd("majika━") assert "わい" == normalize_neologd("わ〰い") assert "スーパー" == normalize_neologd("スーパーーーー") assert "!#" == normalize_neologd("!#") assert "ゼンカクスペース" == normalize_neologd("ゼンカク スペース") assert "おお" == normalize_neologd("お お") assert "おお" == normalize_neologd(" おお") assert "おお" == normalize_neologd("おお ") assert "検索エンジン自作入門を買いました!!!" == \ normalize_neologd("検索 エンジン 自作 入門 を 買い ました!!!") assert "アルゴリズムC" == normalize_neologd("アルゴリズム C") assert "PRML副読本" == normalize_neologd(" PRML 副 読 本 ") assert "Coding the Matrix" == normalize_neologd("Coding the Matrix") assert "南アルプスの天然水Sparking Lemonレモン一絞り" == \ normalize_neologd("南アルプスの 天然水 Sparking Lemon レモン一絞り") assert "南アルプスの天然水-Sparking*Lemon+レモン一絞り" == \ normalize_neologd("南アルプスの 天然水- Sparking* Lemon+ レモン一絞り")
conv.py
import sys import normalize_neologd as nneo import re for line in sys.stdin: line = line.replace("。","。\n") line = re.sub(r'<[^\]]*>', '', line) print(nneo.normalize_neologd(line))
全ファイルに対して処理をすると重いので、今回は1ファイルだけ使います。
mecabで-bオプションをつけないとうまくいきませんでした。
cat extract/AA/wiki | python conv.py | mecab -b 100000000 -Owakati -d /usr/local/lib/mecab/dic/ipadic/ > wiki.txt
ここから生成したテキストを処理していきます。
2017年に作った食べ物を振り返る
2017年を食べ物で振り返る
一年の振り返りかたは色々あると思いますが、今年はたくさん食べ物(特にお菓子)を作ったので写真を添えて見ていくことで、一年を振り返りたいと思います。
- 卵サンド
レシピ見てたら作りたくなったので作りました。からしがきいてておいしい。 - フレンチトースト
アルミホイルで簡単に作れるやつ。カラザをとったほうがおいしいかも。
- レアチーズケーキ
底が抜けない型で作ったのと、クッキーがあまり固まらなかった。でもおいしかった。 - フォッカッチャ
普通のパンより歯ごたえがありますよね。じゃがいも入ってるから腹持ちがよい。
- チョコレアチーズケーキ
底が抜けない型使ったのでまた崩壊しました。味は普通においしい。
- 焼きチョコ
友達が好きだったやつ。食感がガルボみたいにほろほろでおいしい。 - チョコチップスコーン
チョコを刻んでいれた。おなかにたまる。
- ガトーショコラ
粉糖かけたらそれっぽくみえた。けっこう重めだけどおいしい。
- 紅茶のスコーン
アールグレイを入れたスコーン。香りが少しリッチ。
- クリームチーズのプリン
普通のプリンよりリッチ。生クリームいれてるのでおいしい。
- 生チョコ
完成後の写真がなかった。ブランデーを入れたことで風味がよくなった。
- チョコパイ
冷凍パイ生地を使ったので簡単さくさく。
- パウンドケーキ
しっとりしてる。発酵バターでリッチな風味に。
- クッキー
ふつーにふつーなクッキー。作るの簡単でいいですね。
- スイートポテト
裏ごしがまあまあめんどい。入れ物は100均で買うと便利。
- ウインナーパン
卵黄を塗るときれいな色になるよ。皮付きのほうがぱりっとしておいしいかも。
- ちぎりパン
練乳入れてるので甘め。発酵とかはめんどいけど作ってて楽しい。
- とうもろこしのかき揚げ
甘くておいしい。お塩をつけると箸が進む。
- ガーリックラスク
作った回数一番多いお菓子。バジルをかけるとそれらしくなるよ。
- ザッハトルテ
見た目がしゃれおつスイーツ。作るの大変だし1000円くらいかかるけどリッチ。
- チョコラスク
グラサージュの余ったチョコで作ったラスク。ふつー。
- チョコスコーン
さっきのやつよりのっぺりしてる。焼いたら広がった。
- リコッタチーズのパンケーキ
リコッタチーズを使ったパンケーキです。もう少しチーズ多くてもよかったかも。
- フォンダンショコラ
砂糖100gの暴力的な甘さ。一個あたりのお腹にたまる感はすごい。
- 生クリームのプリン
チョコ味とか色々つくった。わりとふつう。
- みかんカルピスの寒天ゼリー
ヘルシー。味は無難。
- 食パン
ホームベーカリーでせいっとしました。機械があるとお手軽~~~
- フランスパン
なんかあんま膨らまなかった。そして固い。
- ラスク
さっきのフランスパンで作った。これまた固い。
- チーズタルト
市販のミニタルト型で作ったらとても簡単。そのままトレーにいれたままだと運びやすい。
- 豚肉の唐揚げ
急におかずぽくなったけどおいしいですよこれ。おすすめです。
- カレーチャーハン
カレー粉と肉とご飯を炒めるだけ。シンプルでおいしい。
- マフィン
型を買ってみたのでおためしに。プレーンでおいしい。
- 豚肉とじゃがいものピリ辛炒め
豆板醤おいしいですよね~。ご飯が進む。
- フランスパン二号
さっきのよりおおきく膨らんだけど、クープが納得行かない。味はおいしい。
- フランスパン三号
けっこうきれいになりました。粉とか酵母こだわると沼。
- チョコタルト
膨らまさせすぎた。冷やして密度上げるとちょうどよくなります。
- ざくざくクッキー
グラノーラを入れてざくざくに。食感が楽しいし味も面白い。
- 紅茶のクッキー
少しもろもろしたけど、紅茶は安定感ありますよね。
- フロランタン
材料が高い。アーモンドスライスが高い。天板一枚分できて味もおいしい。
- パウンドケーキ2号
安い素材でチャレンジ。200円しないくらい。
- スノーボールクッキー
丸くなりにくいけどおいしいよ。冬らしいのも良い。 - ザッハトルテ2号
一番右のやつです。見た目も味もこだわった一品です。
- レアチーズケーキ2号
昔失敗したのが悔しかったのでリトライです。底のクッキーをチョコ味に変えたのがまたおいしいところです。レモン汁を3倍に増やしてさっぱりにしました。
まとめ
なんだかんだたくさんお菓子をつくりましたね。2018年はもう少しおかずとか増やしたいところです。あとはお菓子の見た目も気合入れていきたい。
はてなブログのデザインについて
今日ははてなブログのデザインについて書いていきます。
好みのブログのデザインに変えることで、ブログを書くモチベーションにも繋がるので大切です。
テーマ選び
個人的には公式テーマの中から比較的好みのものを見つけるのがいいと思います。デザイン選びのページに飛んで考えてみましょう。
公式テーマはやはりよくも悪くも無難です。そのままでは同じデザインのブログをよく見かけるはずです。そこで背景などのカスタムが大事になると思います。
カスタマイズ
先程のページから背景画像や背景色などのテーマを変更できます。
ここをいじることで他人とかぶりにくいデザインの作成ができるかなと思います。
公式のテーマを何も変更せずに使うと、カテゴリの項目がなかったり、逆に必要のない要素がサイドバーにあるかもしれません。それもここのサイドバーから簡単に追加ができます。自分のサイドバーはこのようにしています。
まとめ
今回はデザインの変更について軽く触れました。デザインを変更することで書く人にも読む人にも良いものにできると思います。
アドベントカレンダーを終えて
アドベントカレンダー25日目です。 adventar.org
今日はアドベントカレンダーの総まとめをしたいと思います。
書いた内容一覧
- jupyter notebookについて - 機械学習とその他
- numpyのよく使う関数について - 機械学習とその他
- scikit-learnのSVMを使ってみた - 機械学習とその他
- scikit-learnのconfusion matrixとclassification reportについて - 機械学習とその他
- gitlabのissue templatesについて - 機械学習とその他
- matplotlibで円グラフを描画する - 機械学習とその他
- jupyter notebookのextensionのgist-itについて - 機械学習とその他
- chainer以外でのcupyの使用について - 機械学習とその他
- chainerのto_cpuについて - 機械学習とその他
- 意識低い系お菓子作り - 機械学習とその他
- scikit-learnのgrid_search使ってみた - 機械学習とその他
- ChainerのTupleDatasetについて - 機械学習とその他
- chainerのSerial_Iteratorについて - 機械学習とその他
- 意識中くらいのお菓子作り - 機械学習とその他
- ubuntu14.04 + python3 でopencvをいれて動画をいじろうとしたら苦戦した話 - 機械学習とその他
- 水平棒グラフの作成をした - 機械学習とその他
- imagenetとその使い方について - 機械学習とその他
- pythonのCounterについて - 機械学習とその他
- kaggleでお勉強 - 機械学習とその他
- trainerのextensionsについて - 機械学習とその他
- kaggleの始め方 - 機械学習とその他
- 意識高い系お菓子作り - 機械学習とその他
- よく使うコマンドについて - 機械学習とその他
- 大学院について - 機械学習とその他
- アドベントカレンダーを終えて - 機械学習とその他
一人アドベントカレンダーをしようと思ったきっかけ
このはてなブログを開設したときに、機械学習について書いていこうと思っていたのですが、実際に記事を投稿することはあまりなく、放置されているような状態でした。アウトプットをしたいと思っていたのにあまり出来ていない状態だったので、アドベントカレンダーをきっかけに、ある程度記事を書いていければいいかなと思ってはじめました。
アドベントカレンダーを始めて
実際にアウトプットをしてみて気づいたのは、きちんと理解していないと何も書けないということです。この一年間で色々やってきたとは思っていたのですが、中途半端な理解では書くことができず、下書きで見送る記事も多くありました。
一人アドベントの長所短所
一人アドベントは毎日アウトプットをするために新しくコードを書いたり、わからない部分を調べたりするので勉強にはなりました。ただし、毎日アウトプットという面に縛られて記事の品質は低下するときもありました。毎回当日投稿も厳しいので、一日遅れまでは特に気にせずにいきました。
まとめ
アドベントはみんながアウトプットを行うきっかけになっていいと思います。また、グループで行えば知見も溜まっていくのでいいこと尽くめです。アドベントが終わってもブログを書く習慣が残ればなと思います。
お疲れ様でした。
大学院について
アドベントカレンダー24日目です。
今日は少し毛色を変えて、本学の大学院について書いていきたいと思います。
大学院について
大学院入学までの流れ
内部進学であれば、推薦を出すだけでスッと終わります。支給されるタイプの奨学金が欲しい場合には書類が増えますが、それでもそこまで大変ではありません。4年の4,5月くらいまでに大学院に進学する意思を決めておけば大丈夫です。
大学院の講義
学部のときの講義に比べれば、座学だけではなく実際に手を動かす講義も多いのがいいところです。ソースコードをある程度書くような講義も多いのがいいところですね。悪い所としては、必要な単位数に対して全体の講義数はそこまで多くないので、ある程度は好きでもない講義を取る必要があるところです。大学院に進学してるくらいなのである程度専門に寄らせてほしい気持ちはありますね。
広義の意味で捉えるのであれば、人工知能に関する講義は多かったかもしれません。機械学習の授業、ニューラルネットワークの授業、統計などの授業、Rを用いた分析の授業などがあります。
大学院生の生活
これは完全に人によりけりです。ばりばり研究をしてるような人もいれば、開発をしてるような人もいるでしょうし、それ以外の活動に勤しんでいる人もいます。授業を大方取り終えてしまえば、4年生くらいの授業の少なさにはなるので、研究室に来る人も来ない人もいます。その関係か夜型の人が大半です。
大学院生の人数
うちの専攻はとても少なくて、同学年には30人くらいしかいません。同じ研究室に院生がいればラッキーくらいの感覚です。いない人はいい感じに後輩と仲良くするか、他の研究室の院生と仲良くしましょう。
大学院の卒業要件
学部のときと同じ部分として、一定単位数を取る必要があります。異なるところとしては、学会での発表が原則として必要になります。人気なのは情報処理学会ですね。
TAについて
SAは時給1000円ですが、TAは時給1600円、一コマ90分で3500円貰えます。実験は3コマあるので、1日実験のTAをすることで1万円がもらえることになります。
大学院進学の動機など
もともと大学院に行くことに決めていた、学部である程度就活がうまくいったので、院ならもっといいところにいけると思った、もっと研究がしたかったなど動機は様々です。大体どの人も直接聞けば教えてくれるので、大学院に興味がある人は聞いてみるといいと思います。
大学院に行くか迷っている人
内部進学であれば、5月くらいまでは何も考えずに就活をすることができるので、就活をしながら考えてみるといいと思います。企業で働いている人に相談してみたり、院生に相談してみるのもありだと思います。院には行きたいけど、お金がないから行かない、というのは少しもったいないのかもしれません。逆に、そこまで院に行きたくはないけどなんとなくでいくというのはそこそこ地獄かもしれません。
要注意事項
院に行くに従って、基本的に学部と同じ研究室に所属し続けることとなると思います。その際に、自分の卒業までその先生がいるのか、ちゃんと面倒を見てくれる人なのか、というのは重要な要素となると思います。院進学を考える4,5月くらいでは、まだ先生からきちんと指導をしてもらってないのでどんな人かはわからないと思います。3年生のうちから4年生や院生にどのような指導をしているか見ておけば参考になるかと思います。
まとめ
本学では進学は1割に満たない珍しい選択なので、家族や先輩、色んな人に相談した末に決めたほうがいいと思います。行くこと自体は全く悪いことではないですし、来てほしいですが、何らかの目的はあったほうがいいと思います。
よく使うコマンドについて
アドベントカレンダー23日目です。
今日はよく使うコマンドについて書いていきたいと思います。
よく使うコマンド
ls
ディレクトリに何のファイルがあるか見れます。常に打ちます。clear
ターミナルのスクリーンを一度きれいにします。これも常に打ちます。last
ログイン履歴が見れます。使うサーバーに普段誰かログインしているのか確認するときなど。who
現在ログインしてる人を確認できます。作業前に大体使います。nvidia-smi
GPUの使用率などを確認できます。学習前や学習してる間に適宜確認します。ps aux
誰がどういうプロセスを動かしてるか確認できます。nvidia-smi
で学習が回ってるのを確認したときに、誰が動かしてるか調べるのに使ったりします。top
CPU使用率やメモリ使用率を見れます。明らかに重いときに使います。free -h
メモリ使用率を比較的見やすい形で見れます。明らかにメモリを確保するプログラムを動かすときに使ってます。dstat
かっこいい形でCPU率などのデータが見れます。CPU使ってそうなときに使います。du -m --max-depth=1
容量確認ができます。モデルサイズが大きくて心配なときなど。
まとめ
サーバーの使用率を確認するようなコマンドばかりでしたね。ブラウザとかで統合して見れれば良さそうですが、サーバーには導入されてなくて使えないのが悲しいところです。