機械学習とその他

機械学習したいマン

日本の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

ここから生成したテキストを処理していきます。

command not found エラーが出てしまう

clearコマンドを使おうとすると、以下のようなエラーが出てしまうようになりました。

clear: command not found


調べたところ、/usr/binにパスが通っていないのが問題のようです。
.bash_profileのexportが不味いと予想されますが、とりあえず/usr/binにパスを通して解決します。

export PATH=/usr/bin:$PATH
source ~/.bash_profile

これで試してみたところ直りました。後でちゃんと環境変数を確認します。

2017年に作った食べ物を振り返る

2017年を食べ物で振り返る

一年の振り返りかたは色々あると思いますが、今年はたくさん食べ物(特にお菓子)を作ったので写真を添えて見ていくことで、一年を振り返りたいと思います。

 

  • 卵サンド
    レシピ見てたら作りたくなったので作りました。からしがきいてておいしい。f:id:looseleaf0727:20171231221448j:plain

  • フレンチトースト
    アルミホイルで簡単に作れるやつ。カラザをとったほうがおいしいかも。

    f:id:looseleaf0727:20171231221622j:plain

  • レアチーズケーキ
    底が抜けない型で作ったのと、クッキーがあまり固まらなかった。でもおいしかった。

    f:id:looseleaf0727:20171231221815j:plain

  • フォッカッチャ
    普通のパンより歯ごたえがありますよね。じゃがいも入ってるから腹持ちがよい。

    f:id:looseleaf0727:20171231221902j:plain

  • チョコレアチーズケーキ
    底が抜けない型使ったのでまた崩壊しました。味は普通においしい。

    f:id:looseleaf0727:20171231221930j:plain

  • 焼きチョコ
    友達が好きだったやつ。食感がガルボみたいにほろほろでおいしい。

    f:id:looseleaf0727:20171231222004j:plain

  • チョコチップスコーン
    チョコを刻んでいれた。おなかにたまる。

    f:id:looseleaf0727:20171231222034j:plain

  • ガトーショコラ
    粉糖かけたらそれっぽくみえた。けっこう重めだけどおいしい。

    f:id:looseleaf0727:20171231222143j:plain

  • 紅茶のスコーン
    アールグレイを入れたスコーン。香りが少しリッチ。

    f:id:looseleaf0727:20171231222240j:plain

  • クリームチーズのプリン
    普通のプリンよりリッチ。生クリームいれてるのでおいしい。

    f:id:looseleaf0727:20171231222607j:plain

  • 生チョコ
    完成後の写真がなかった。ブランデーを入れたことで風味がよくなった。

    f:id:looseleaf0727:20171231222707j:plain

  • チョコパイ
    冷凍パイ生地を使ったので簡単さくさく。

    f:id:looseleaf0727:20171231222818j:plain

  • パウンドケーキ
    しっとりしてる。発酵バターでリッチな風味に。

    f:id:looseleaf0727:20171231223031j:plain

  • クッキー
    ふつーにふつーなクッキー。作るの簡単でいいですね。

    f:id:looseleaf0727:20171231223607j:plain

  • スイートポテト
    裏ごしがまあまあめんどい。入れ物は100均で買うと便利。

    f:id:looseleaf0727:20171231223637j:plain

  • ウインナーパン
    卵黄を塗るときれいな色になるよ。皮付きのほうがぱりっとしておいしいかも。

    f:id:looseleaf0727:20171231223755j:plain

  • ちぎりパン
    練乳入れてるので甘め。発酵とかはめんどいけど作ってて楽しい。

    f:id:looseleaf0727:20171231224507j:plain

  • とうもろこしのかき揚げ
    甘くておいしい。お塩をつけると箸が進む。

    f:id:looseleaf0727:20171231224554j:plain

  • ガーリックラスク
    作った回数一番多いお菓子。バジルをかけるとそれらしくなるよ。

    f:id:looseleaf0727:20171231224645j:plain

  • ザッハトルテ
    見た目がしゃれおつスイーツ。作るの大変だし1000円くらいかかるけどリッチ。

    f:id:looseleaf0727:20171231224715j:plain

  • チョコラスク
    グラサージュの余ったチョコで作ったラスク。ふつー。

    f:id:looseleaf0727:20171231224832j:plain

  • チョコスコーン
    さっきのやつよりのっぺりしてる。焼いたら広がった。

    f:id:looseleaf0727:20171231225118j:plain

  • リコッタチーズのパンケーキ
    リコッタチーズを使ったパンケーキです。もう少しチーズ多くてもよかったかも。

    f:id:looseleaf0727:20171231225209j:plain

  • フォンダンショコラ
    砂糖100gの暴力的な甘さ。一個あたりのお腹にたまる感はすごい。

    f:id:looseleaf0727:20171231225302j:plain

  • 生クリームのプリン
    チョコ味とか色々つくった。わりとふつう。

    f:id:looseleaf0727:20171231230505j:plain

  • みかんカルピスの寒天ゼリー
    ヘルシー。味は無難。

    f:id:looseleaf0727:20171231230549j:plain

  • 食パン
    ホームベーカリーでせいっとしました。機械があるとお手軽~~~

    f:id:looseleaf0727:20171231230936j:plain

  • フランスパン
    なんかあんま膨らまなかった。そして固い。

    f:id:looseleaf0727:20171231231159j:plain

  • ラスク
    さっきのフランスパンで作った。これまた固い。

    f:id:looseleaf0727:20171231231229j:plain

  • チーズタルト
    市販のミニタルト型で作ったらとても簡単。そのままトレーにいれたままだと運びやすい。

    f:id:looseleaf0727:20171231231310j:plain

  • 豚肉の唐揚げ
    急におかずぽくなったけどおいしいですよこれ。おすすめです。

    f:id:looseleaf0727:20171231231345j:plain

  • カレーチャーハン
    カレー粉と肉とご飯を炒めるだけ。シンプルでおいしい。

    f:id:looseleaf0727:20171231231609j:plain

  • マフィン
    型を買ってみたのでおためしに。プレーンでおいしい。

    f:id:looseleaf0727:20171231231632j:plain

  • 豚肉とじゃがいものピリ辛炒め
    豆板醤おいしいですよね~。ご飯が進む。

    f:id:looseleaf0727:20171231231707j:plain

  • フランスパン二号
    さっきのよりおおきく膨らんだけど、クープが納得行かない。味はおいしい。

    f:id:looseleaf0727:20171231232221j:plain

  • フランスパン三号
    けっこうきれいになりました。粉とか酵母こだわると沼。

    f:id:looseleaf0727:20171231232237j:plain

  • チョコタルト
    膨らまさせすぎた。冷やして密度上げるとちょうどよくなります。

    f:id:looseleaf0727:20171231232334j:plain

  • ざくざくクッキー
    グラノーラを入れてざくざくに。食感が楽しいし味も面白い。

    f:id:looseleaf0727:20171231232350j:plain

  • 紅茶のクッキー
    少しもろもろしたけど、紅茶は安定感ありますよね。

    f:id:looseleaf0727:20171231232406j:plain

  • フロランタン
    材料が高い。アーモンドスライスが高い。天板一枚分できて味もおいしい。

    f:id:looseleaf0727:20171231232420j:plain

  • パウンドケーキ2号
    安い素材でチャレンジ。200円しないくらい。

    f:id:looseleaf0727:20171231232509j:plain

    f:id:looseleaf0727:20171231232451j:plain

  • スノーボールクッキー
    丸くなりにくいけどおいしいよ。冬らしいのも良い。
  • ザッハトルテ2号
    一番右のやつです。見た目も味もこだわった一品です。

    f:id:looseleaf0727:20171231232548j:plain

    f:id:looseleaf0727:20171231232529j:plain

  • レアチーズケーキ2号
    昔失敗したのが悔しかったのでリトライです。底のクッキーをチョコ味に変えたのがまたおいしいところです。レモン汁を3倍に増やしてさっぱりにしました。

    f:id:looseleaf0727:20171231232629j:plain

まとめ

なんだかんだたくさんお菓子をつくりましたね。2018年はもう少しおかずとか増やしたいところです。あとはお菓子の見た目も気合入れていきたい。

はてなブログのデザインについて

今日ははてなブログのデザインについて書いていきます。

好みのブログのデザインに変えることで、ブログを書くモチベーションにも繋がるので大切です。

テーマ選び

個人的には公式テーマの中から比較的好みのものを見つけるのがいいと思います。デザイン選びのページに飛んで考えてみましょう。

f:id:looseleaf0727:20171226120718p:plain

 

公式テーマはやはりよくも悪くも無難です。そのままでは同じデザインのブログをよく見かけるはずです。そこで背景などのカスタムが大事になると思います。

カスタマイズ

先程のページから背景画像や背景色などのテーマを変更できます。
ここをいじることで他人とかぶりにくいデザインの作成ができるかなと思います。

f:id:looseleaf0727:20171226120953p:plain

公式のテーマを何も変更せずに使うと、カテゴリの項目がなかったり、逆に必要のない要素がサイドバーにあるかもしれません。それもここのサイドバーから簡単に追加ができます。自分のサイドバーはこのようにしています。

f:id:looseleaf0727:20171226121333p:plain

まとめ

今回はデザインの変更について軽く触れました。デザインを変更することで書く人にも読む人にも良いものにできると思います。

アドベントカレンダーを終えて

アドベントカレンダー25日目です。 adventar.org

今日はアドベントカレンダーの総まとめをしたいと思います。

書いた内容一覧

一人アドベントカレンダーをしようと思ったきっかけ

このはてなブログを開設したときに、機械学習について書いていこうと思っていたのですが、実際に記事を投稿することはあまりなく、放置されているような状態でした。アウトプットをしたいと思っていたのにあまり出来ていない状態だったので、アドベントカレンダーをきっかけに、ある程度記事を書いていければいいかなと思ってはじめました。

アドベントカレンダーを始めて

実際にアウトプットをしてみて気づいたのは、きちんと理解していないと何も書けないということです。この一年間で色々やってきたとは思っていたのですが、中途半端な理解では書くことができず、下書きで見送る記事も多くありました。

一人アドベントの長所短所

一人アドベントは毎日アウトプットをするために新しくコードを書いたり、わからない部分を調べたりするので勉強にはなりました。ただし、毎日アウトプットという面に縛られて記事の品質は低下するときもありました。毎回当日投稿も厳しいので、一日遅れまでは特に気にせずにいきました。

まとめ

アドベントはみんながアウトプットを行うきっかけになっていいと思います。また、グループで行えば知見も溜まっていくのでいいこと尽くめです。アドベントが終わってもブログを書く習慣が残ればなと思います。

お疲れ様でした。

大学院について

アドベントカレンダー24日目です。

adventar.org

今日は少し毛色を変えて、本学の大学院について書いていきたいと思います。

大学院について

大学院入学までの流れ

内部進学であれば、推薦を出すだけでスッと終わります。支給されるタイプの奨学金が欲しい場合には書類が増えますが、それでもそこまで大変ではありません。4年の4,5月くらいまでに大学院に進学する意思を決めておけば大丈夫です。

大学院の講義

学部のときの講義に比べれば、座学だけではなく実際に手を動かす講義も多いのがいいところです。ソースコードをある程度書くような講義も多いのがいいところですね。悪い所としては、必要な単位数に対して全体の講義数はそこまで多くないので、ある程度は好きでもない講義を取る必要があるところです。大学院に進学してるくらいなのである程度専門に寄らせてほしい気持ちはありますね。

広義の意味で捉えるのであれば、人工知能に関する講義は多かったかもしれません。機械学習の授業、ニューラルネットワークの授業、統計などの授業、Rを用いた分析の授業などがあります。

大学院生の生活

これは完全に人によりけりです。ばりばり研究をしてるような人もいれば、開発をしてるような人もいるでしょうし、それ以外の活動に勤しんでいる人もいます。授業を大方取り終えてしまえば、4年生くらいの授業の少なさにはなるので、研究室に来る人も来ない人もいます。その関係か夜型の人が大半です。

大学院生の人数

うちの専攻はとても少なくて、同学年には30人くらいしかいません。同じ研究室に院生がいればラッキーくらいの感覚です。いない人はいい感じに後輩と仲良くするか、他の研究室の院生と仲良くしましょう。

大学院の卒業要件

学部のときと同じ部分として、一定単位数を取る必要があります。異なるところとしては、学会での発表が原則として必要になります。人気なのは情報処理学会ですね。

TAについて

SAは時給1000円ですが、TAは時給1600円、一コマ90分で3500円貰えます。実験は3コマあるので、1日実験のTAをすることで1万円がもらえることになります。

大学院進学の動機など

もともと大学院に行くことに決めていた、学部である程度就活がうまくいったので、院ならもっといいところにいけると思った、もっと研究がしたかったなど動機は様々です。大体どの人も直接聞けば教えてくれるので、大学院に興味がある人は聞いてみるといいと思います。

大学院に行くか迷っている人

内部進学であれば、5月くらいまでは何も考えずに就活をすることができるので、就活をしながら考えてみるといいと思います。企業で働いている人に相談してみたり、院生に相談してみるのもありだと思います。院には行きたいけど、お金がないから行かない、というのは少しもったいないのかもしれません。逆に、そこまで院に行きたくはないけどなんとなくでいくというのはそこそこ地獄かもしれません。

要注意事項

院に行くに従って、基本的に学部と同じ研究室に所属し続けることとなると思います。その際に、自分の卒業までその先生がいるのか、ちゃんと面倒を見てくれる人なのか、というのは重要な要素となると思います。院進学を考える4,5月くらいでは、まだ先生からきちんと指導をしてもらってないのでどんな人かはわからないと思います。3年生のうちから4年生や院生にどのような指導をしているか見ておけば参考になるかと思います。

まとめ

本学では進学は1割に満たない珍しい選択なので、家族や先輩、色んな人に相談した末に決めたほうがいいと思います。行くこと自体は全く悪いことではないですし、来てほしいですが、何らかの目的はあったほうがいいと思います。

よく使うコマンドについて

アドベントカレンダー23日目です。

adventar.org

今日はよく使うコマンドについて書いていきたいと思います。

よく使うコマンド

  • ls
    ディレクトリに何のファイルがあるか見れます。常に打ちます。

  • clear
    ターミナルのスクリーンを一度きれいにします。これも常に打ちます。

  • last
    ログイン履歴が見れます。使うサーバーに普段誰かログインしているのか確認するときなど。

  • who
    現在ログインしてる人を確認できます。作業前に大体使います。

  • nvidia-smi
    GPUの使用率などを確認できます。学習前や学習してる間に適宜確認します。

  • ps aux
    誰がどういうプロセスを動かしてるか確認できます。nvidia-smiで学習が回ってるのを確認したときに、誰が動かしてるか調べるのに使ったりします。

  • top
    CPU使用率やメモリ使用率を見れます。明らかに重いときに使います。

  • free -h
    メモリ使用率を比較的見やすい形で見れます。明らかにメモリを確保するプログラムを動かすときに使ってます。

  • dstat
    かっこいい形でCPU率などのデータが見れます。CPU使ってそうなときに使います。

  • du -m --max-depth=1
    容量確認ができます。モデルサイズが大きくて心配なときなど。

まとめ

サーバーの使用率を確認するようなコマンドばかりでしたね。ブラウザとかで統合して見れれば良さそうですが、サーバーには導入されてなくて使えないのが悲しいところです。