2017/07/10-07/16

進捗だめですって感じの一週間だった。

クラッチで深層学習書くのに疲れたので、chainerを使ってみることにした。
気になってたんだけどお金がなくて買えなかった二冊を購入し、読みふける一週間。
こういう週があってもいいよなと、自分に言い聞かせる。

Chainerによる実践深層学習

Chainerによる実践深層学習

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

久しぶりに技術書を真面目に読みふけったけど、やっぱり楽しいよね。
論文と違って伝えようとしてくれてるので読みやすいし、こういう技術書を書けるようになりたいなと思った。

というのもあって、このブログにそんな感じの記事を投稿した。
koguma-goya.hatenablog.com

この週の後半は、ほとんどこれを書くために使ってた気がする。
研究室の勉強会で簡単なbotを作って見せる機会があって、それの流用だけどね。
こうやって噛み砕いて説明する練習は、すればするほど説明がうまくなっていくと信じてる。

結果的にプレゼン能力の向上にもつながるだろうし、今後も続けていきたい。



8月に東京に戻るので、新幹線の切符を取りに行った。
多少は覚悟してたけど、奈良駅まで行かないとみどりの窓口が無いってのはかなり厳しい。
片道1時間以上かかるので、なんで新幹線の切符買うだけなのにこんなに遠出しないといけないんだ。。。とつらい気持ちになる。

JRのウェブ予約サービスを使ってみようとしたら、なんか新しくクレジットを作らないといけないとか言う謎仕様だったのであきらめた所存。
僕がちゃんと読んでないだけでクレジット登録でもできたのかなあ。

でも、予約したいときにすぐ予約できないあのシステムはちょっと微妙だと思う。
「あ、新幹線予約しないと」ってウェブ見たら「クレカの審査に一週間、電子切符の発行に三週間かかります!」とか書いててさすがに頭弱いんじゃないかって思った。
どんな人が新幹線の予約サイトを探すのかをもうちょっと考えた方がいいのでは、という感じ。


夏のインターン先の担当さんとお話させてもらう。
単語分割をやりたいんだ!と面接で我がまま言っていたが、なんと単語分割のタスクで勉強させてもらえることになった。
非常にモチベーションが上がったので、頑張りたい。



研究室ではプロコン勉強会が週に一回ある。
最近、毎週主催してた方が某大企業にインターンに行ってしまったので消滅しかけてたんだけど、強い中国人の先輩が引き継いでくれたおかげで無事勉強会が存続した。
動的計画法に強くなる、というコンセプトでやるらしく、とてもありがたい。
といっても、今週はすこしやってあとは3時間くらい「しにてえなぁー」って愚痴るだけの会だったけど。

その先輩によると、中国に旅行に行くなら今のうちだよ、とのこと。
政治的に色々あるらしくって、どこの国も大変だなあと思った。


今週、また言語の広がりシミュレータの動画がランキングに載ったらしい。
いまだにニコニコ動画のフォロー通知が来てすごいなとおもう。
我ながらニッチな動画だと思うんだけど、想像以上の人数に楽しんでもらえてうれしい。
より多くの人に言語学とか、そのへんの学問を楽しいと感じてもらえれば本望。

自然言語処理入門としての「botの作り方」


この前の記事とかツイートででぼやいてたことを、記事にして供養します。
本当は中学生くらいを対象にした教育動画として公開したかったんだけど、ちょっと作ってる余裕が無いのでとりあえず記事にします。

本記事は以下の内容で構成されています。


使用する言語はpythonです。
もしpythonを触ったことが無い、という方は以下のサイトを参考にすこしだけ勉強するとストレスなく読めると思います。

Python入門

0. 自己紹介

山奥にある研究室で自然言語処理学の勉強をしている熊です。
研究室の名前が偉大すぎて最近能力を過大評価されがちだけど、ぶっちゃけただの文系のポンコツ
学部では理論言語学を勉強していました。専門は統語論でした。英語の教員免許を一応持っています。
数学は苦手です。よろしくお願いします。


1. はじめに

この記事ではtwitterで散見されるbotを作ってみることで、言語処理の面白さを体験することを目的としています。

主に文系プログラマの卵をターゲットとしており、特に

・数学がちょっとよくわからない
・プログラミングが少しだけできる
・最近言語処理に興味を持って色々記事とか読んでる
・でも数式ばっかりでよくわからねえよ!!!

という方を対象にしています。そう、そこで頷いてるあなたです!

僕自身、学部2年のころに言語処理に興味を持ち、プログラミングを始めました。
でも言語処理系の記事の数式って謎なんですよね。最初の一年はつらい思いをしてました。
なにかとっかかりがあれば数式もイメージがしやすいのですが、最初のとっかかりってのは中々訪れません。
この記事が「よくわからないけどわかりたい」という人の役に立てばと思います。

数式や証明の類は一切載せませんので、数式のほうがわかりやすい!という方にはお勧めできない記事となっています。
上でも述べた通り、実装はpythonで行います。
4節まではプログラミングの話題に触れないので、もしプログラミング未経験の方は3節までを読み、あとは結果だけ見てもいいと思います。

ソースコードgithubに載せておいたので、みながら動かしてみてください。
https://github.com/mentaikoguma/bot_tutorial


なお、この記事ではツイッターとの連携部分については説明しません。
あくまでも、文生成についてのみ説明します。


2. botの分類

最初に、ここでいうbotとは何か、どのようなものがあるのかをまとめておきます。

ここでのbotとは、文章を出力するプログラムの事を指します。
例えばボタンを押すたびに何かしらの文が表示される、twitterで00分になると自動で文がツイートされるものなどをbotと呼ぶことにします。
そのうえで、botを二種類に分類します。

a. 記述型

作者があらかじめ用意した複数の文から、ランダム(あるいはルールに基づいて)ひとつを出力するものを、このように呼ぶことにします。
具体的には以下のbotなどが参考になります。

ワイト (@waightthinksso) | Twitter

リラックマfakebot (@rilakkuma_bot) | Twitter

これらは事前にセリフなどを用意しておき、それをランダムにひとつ選ぶことでツイートを行っています。
@waightthinkssoはテキストが一つしかない例、@rilakkuma_botリラックマの絵本の中のセリフを用意しているようです。
リラックマbot、いつまで生き延びるのかな)

また、記述型を応用することで対話っぽい事が出来ます。
「おはよう」「ねむいね」などのテキストを用意しておき、「おはよう」を含む文には「おはよう」と返すようプログラミングすれば、なんとなく会話をしている気分になります。
興味がある方は作ってみるといいと思います。テキストの用意がすごくつらいです。*1

ちなみに、記述型のtwitter botwebサービスを用いて簡単に作ることができます。
もしプログラミングなんてしたくないわ!って方は以下のサービスを利用してみてください。
(詳細な使い方はここでは行いません。)

twittbot - enjoy


b. 生成型

記述型と違い、作者が事前に文を用意しません。
例えばtwitterのタイムラインを1時間分溜めておき、それをもとに学習・文生成を行うものが挙げられます。
事前に文を用意しないので、同じ文が出力されることはほとんどありません。
「どのような文が生成されるのか」という点で非常に見ていて面白いbotとなります。

しゅうまい君 (@shuumai) | Twitter

最も有名なこの手のbotはしゅうまい君でしょう。
しゅうまい君はある一定時間のあいだ、フォローしているユーザーのツイートを分析、学習し、それをもとに文を作っています。
ご存知の方も多いと思いますが、非常に人間らしい文が生成されます。
この記事では、しゅうまい君と同じ挙動をするbotを作ることを目標とします。
詳細は次の節からお話します。


3. 文の生成

この節は、2節で紹介した生成型botがいかにして文を生成しているのかについて理解してもらうことを目標としています。
まず、しゅうまい君のホームページに書いてある挙動について紹介します。

しくみ
1.フォローしている人の発言を拾って形態素にばらして溜める
2.マルコフ連鎖で複数の短文を自動生成
3.適当な短文を選んでTwitterにつぶやく
(略)

…どうでしょうか。
この記事では自然言語処理の知識がほぼゼロ、という方を対象にしているので用語の説明をしっかりと行います。
(引用部分を見ただけで何を作ればいいのかわかったぜ!という方はもう読まなくて大丈夫です。)


形態素

言語の意味を持つ最小単位を形態素と呼びます。
例えば、「形態素」「と」「呼び」「ます」「。」などが形態素になります。
形態素にばらす」とは、単語分割を指しています。*2
というのも、日本語は英語と違って単語の切れ目がスペースによって明示されていないので、機械が処理するには少し不便なのです。
分割の例を以下に示します。

神様、僕は気づいてしまった*3
  ↓
「神様/、/僕/は/気づい/て/しまっ/た」

/によって形態素が区切られ、どれが単語なのかが分かるようになりました*4
これを単位として、言語処理を行います。
ちなみに、分割はpythonのパッケージをもちいて簡単に行えます。


マルコフ連鎖

これが生成部分を指す用語になります。自然言語処理では特に言語モデルとか、n-gramとかって言われることが多いです。
情報系であればよくご存じの単語だと思いますが、簡単に言うと

直前の数単語から次の単語を予測するという生成方法です。

この記事ではこの部分に重点を置いてしっかり解説したいと思います。
下線部の説明でもうわかったぜ!という方は、このまま実装の節まで進みましょう。


マルコフ連鎖(あるいはn-gram言語モデル)を体験してもらいます。
(数式を一切用いず説明するため、ここからの説明は冗長になります。)

Q. 以下の空欄を適当な形態素(単語)で埋めよ。ただし空欄以降も文が続く可能性がある。

私は(  )

空欄にはいろいろ入ると思います。
例えば「私は太郎」「私はペン」「私は食べ」などがあり得ますよね。
それぞれ、「私は太郎です」「私はペンを持っている」「私は食べることが好きです」のように派生する可能性があります。
ここでは「太郎」を入れたことにしてもう一度同じ問題を考えてもらいます。

Q. 以下の空欄を適当な形態素(単語)で埋めよ。ただし空欄以降も文が続く可能性がある。

私は太郎(  )

ここでの解答例は「私は太郎を」「私は太郎が」「私は太郎の」「私は太郎を」などになるでしょう。
間違っても「私は太郎ペン」や「私は太郎食べ」とはしませんよね。

カッコ内にどのような単語を入れるべきかは、直前の数単語に強く依存していることが分かると思います。
より一般化して、「次の状態は、直前の状態によって決定される」という状況をマルコフ性と呼びます。
これを繰り返すことで、一つの状態の遷移(ここでは単語列)が生成されます。この連鎖の事をマルコフ連鎖と呼びます。


実際に実装する際には、「ある数単語の後にどの単語が出現したか」の頻度辞書を作り、生成を行います。
上の形態素の例だと、以下のような辞書ができあがります。

「神様/、/僕/は/気づい/て/しまっ/た」

<BOS><BOS> 神様:1
<BOS>神様  、:1
神様、   僕:1
、僕    は:1
僕は    気づい:1
は気づい  て:1
気づいて  しまっ:1
てしまっ  た:1
しまった  <EOS>:1

ここで、<BOS>と<EOS>はbegin/end of sentenceで、文頭と文末を表す特殊記号として扱われるものです。
また:1はそれぞれの単語が、直前の二単語の次に1回現れたことを表しています。
すなわちこの辞書は、
文頭として「神様」が1回
「(文頭)-神様」に続いて「、」が一回、
「神様-、」に続いて「僕」が一回
...
という情報を表していることになります。

このように、直前の二単語の次にどの単語が来るかを数え上げるものを3-gram(tri-gram)言語モデルと呼びます。
(直前のn-1単語から次の語を予想する。)

少しはしっくり来たでしょうか。
次の節ではこれらを実際に実装してみましょう。


4. 実装

言語はpythonを用います。
記事の最初にある通り、一応ざーっと基本的な動作を確認してから実装してみることをお勧めします。
命名規則Java臭がありますが、大目に見てください。
また、エンジニアとしてのお作法が成ってないってのも見逃してください。

データセット

本当はツイートデータを使って実装できればいいのですが、ツイートのデータは二次配布ができないので青空文庫で我慢しましょう。
この記事の内容を実装してみて、さらにツイートでも同じことをやってみたいという方は、twitter developerとか使ってクロールしてください。
(詳細の説明は今回はしません。)

Welcome — Twitter Developers


今回使うデータセットは、夏目漱石の以下の文献にします。
・それから
吾輩は猫である
・こころ

上のテキストをすべてまとめたsoseki.txtをこちらからダウンロードして使ってください。
bot_tutorial/soseki.txt at master · mentaikoguma/bot_tutorial · GitHub

これを使って、今回は実装します。

Janome形態素解析ライブラリ)

前の節で単語分割についてお話しました。
pythonで単語分割をするにはJanomeというパッケージが必要です。

公式
Welcome to janome’s documentation! (Japanese) — Janome v0.3 documentation (ja)

解説
python で形態素解析。Janome が簡単。pip 一発でインストール | コード7区


基本的にはpipで入ります。

pip -install janome

windowsの場合はpipが使えないことがあるので、以下の記事を参照して頑張ってみてください。
windows環境のPython3.4でpipをつかってパッケージをインストールする - 意味悲鳴


学習部分を作る

これで準備が整いました。
あとはゴリゴリ書いていきましょう。
再掲しますが、githubにコードを載せてあります。
これを上から順になぞっていきます。
一応メソッドごとに区切って載せていきます。

import random
from collections import defaultdict
import janome
from janome.tokenizer import Tokenizer

インポートは上の通りです。ほかは使いません。
janomeは単語分割、defaultdictは辞書の初期化、randomは生成部分で使います。



●テキスト読み込み部分

def read(path):
  f = open(path, 'r')
  arr = []
  for line in f:
    arr.append(line.strip()) #改行文字を削除して配列に入れていく
  return arr

先ほど作ったsoseki.txtや、あとで作られる辞書ファイルを行ごとに読み込みます。
strip()では改行文字を削除しています。


●辞書作成部分

#readで読み込んだarrをdataとして受け取り、n-gram辞書を作る
def getDictOf(data, n):
  ngramDict = defaultdict(lambda:defaultdict(lambda:0)) #辞書の辞書を初期値0で設定
  t = Tokenizer() #Janomeをセット
  for sentence in data: #各文ごとに
    words = t.tokenize(sentence, wakati=True) #文を単語のリストにする
    for i in range(n-1): #<BOS> <EOS>を追加
      words.insert(0, '<BOS>')
    words.append('<EOS>')
      
    for indice in range((n-1), len(words)):
      biginOfPrev = indice - (n-1)
      prevWords = ''.join(words[biginOfPrev:indice]) #indice番目の単語の直前n-1単語の連結
      targetWord = words[indice] #indice番目の単語
      if prevWords.strip() and targetWord.strip(): #直前の単語、indice番目の単語がともに空白じゃないとき
        ngramDict[prevWords][targetWord] += 1 #辞書の値を++
  return ngramDict

生成に使う辞書を作る部分です。
上で説明した通り、n=3(3-gram / tri-gram)の時には直前2単語から次の単語を予測します。
つまり、ある二単語の次にどの単語が何回現れたかを辞書として記録すれば、確率としてあとで使うことができます。
defaultdictは初期値を設定するもので、よく使うメソッドです。
ここでは辞書のvalueを辞書にし、そのvalueを0として設定しています。
また、<BOS>をn-1個挿入することで、文頭のtri-gram確率を計算できるようにしています。
(先ほどの"<BOS><BOS> 神様:1"を思い出してください。)


●辞書保存部分

def write(path, data):
  f = open(path, 'w')
  for key1 in data:
    line = '%s\t' % key1
    for key2 in data[key1]:
      # key1[tab]key2/:/value/,/key2/;/value という形で保存する
      line += '%s/:/%d/,/' % (key2, data[key1][key2])
    line = line[:-3]
    f.write(line+'\r\n')

作成した辞書を保存します。
今回くらいの辞書であれば、毎回作ってもそこまでストレスではありません。
しかし、テキストが大きくなる場合は辞書を作るだけで数十秒、数分かかります。
そのため、一度作った辞書は外部に保存し、あとで読み込み直した方が便利です。
writeメソッドでは、辞書の直前n-1単語部分をkey1、直前単語が直後にとりうる単語をkey2としてforを回しています。
後でsplitして読み込みやすいよう、/:/、/,/という適当な記号で区切っておきます。*5

一度プログラムを動かしてみましょう。
ここまでのメソッドの下に以下のように記述し、プログラムを動かしてみてください。

n = 3
data = read('soseki.txt')
write('%d-gram.txt'%n,getDictOf(data, n),)

'%n-gram.txt'%nは、n-3のとき"3-gram.txt"という名前になります。
出来上がった辞書は以下のようになっているはずです。
(ソートをしていないため、作成するたびに辞書の見出しの並びは変わってしまいますが、大体一緒ならうまくいってるはずです。)

がなるべく	押し/:/1
「乱暴	だ/:/1
だけ感じ	た/:/1
という大丈夫	な/:/1
ず寐	る/:/1
真面目くさって	聞く/:/1/,/述べる/:/1
...
生成部分を作る

今度は作った辞書をもとに生成部分を作っていきます。

●辞書読み込み部分

def readDict(path):
  ngramDict = defaultdict(lambda:defaultdict(lambda:0))
  data = read(path)
  for line in data:
    key1, contents = line.split('\t')
    contents = contents.split('/,/')
    for content in contents:
      key2, value = content.split('/:/')
      ngramDict[key1][key2] = int(value)
  return ngramDict	

先ほどのwriteメソッドの逆の手続きで、辞書を読み込みます。


●生成部分

def generate(ngramDict, maxLength, n):
  sentence = ['<BOS>' for i in range(n-1)]  #最初の一単語を予測するためにn-1個の<BOS>で埋める
  while True:
    prevWords = ''.join(sentence[-(n-1):]) #現在の最後のn-1単語
    wordCands = [] #単語候補を入れるリスト
    for key2 in ngramDict[prevWords]:
      for i in range(ngramDict[prevWords][key2]):
        wordCands.append(key2) #辞書にある数字だけ単語候補を入れる
    if wordCands:
      random.shuffle(wordCands)		
      sentence.append(wordCands[0]) #シャッフルして一つ取り出し、文に追加
		
      if wordCands[0] == '<EOS>': #<EOS>を取り出したら文終了
        return ''.join(sentence[n-1:-1]) #<BOS><EOS>を取り除いて連結し、リターン
      elif len(sentence) > maxLength:
        return generate(ngramDict, maxLength, n) #指定した文字数を超えたら生成し直し
    else:
      return generate(ngramDict, maxLength, n) #単語候補が無い場合は生成し直し
  return none

いよいよ生成部分です。これさえかければもうbotは完成します。
上から順に追っていきましょう。
先ほど読み込んだ辞書を使って、文の生成を行います。

次に最初の一語を選ぶために、文を<BOS>で満たします。tri-gramの場合、<BOS><BOS>に続く単語が文頭になります。*6
辞書から<BOS><BOS>に続く単語を取り出し、wordCandsに追加していきます。
このとき、辞書にある出現回数ぶんだけ追加することが大切です。
文頭になりうる単語をすべてwordCandsに追加したとき、リスト内は「学習データでより多く観測された文頭の単語ほどたくさん入っている」という状態になっています。
これをシャッフルし、一つ取り出すことで、観測した出現頻度から作った確率分布のもとで抽選を行うことと等しくなります。

たとえば辞書の<BOS><BOS>の値が以下のようであったとします。

 私:4, 太郎:3, リンゴ:2, 見る:1

このとき、文頭になりうるwordCandsの中身は以下のようになります。

wordCands = [私,私,私,私,太郎,太郎,太郎,リンゴ,リンゴ,見る]

ここから、ランダムに一つ取り出すことで文頭を決めます。
必然的に、「私」を取り出す確率が高くなることは直感に従うでしょう。

これを繰り返し、文を生成していきます。
場合によっては無限に文が続いてしまうことがあるため、最大文字数は必ず設定するようにしましょう


あとは、これを適当に生成するようにプログラムを書くだけです。
例えば10個の文章を生成してほしければ、以下のように記述します。
maxLengthはツイートサイズと同じ140としました。

n = 3
maxLength = 140
ngramDict = readDict('%d-gram.txt'%n)
for i in range(10):
  print(generate(ngramDict, maxLength , n))


エンターキーを押すたびに生成するタイプならこうなります。

n = 3
maxLength = 140
ngramDict = readDict('%d-gram.txt'%n)
while True:
  s = input()
  if s == 'exit':
    break
  print(generate(ngramDict, maxLength , n))


生成結果の一例です。

「そりゃ無論さ。すると勝手の方にまだ這入って行く様に話す話さないのです。彼らは真
直に自白します。

「ええ顔を鏡で、どうだと主張する。主人は無言の感謝を改めて「さっきから云わんより
寧ろあの時の君の声で、滑稽と崇高の大差を来たした。

母は私の従妹に当る人のために」

こんな苦情をいうように読み出す。「それが唯動くものと思っていた」

私は退屈そうにもならず、真白なシャツに卸立ての四つばかりの金を貰い、三千代のいる
学校はどうしたら三寸も離れて、広い若葉の園は再び出ているようでした。

「いい積りだのかといったら、月桂寺さんは大に活動して嘆願に及んで来て、巻煙草の吸
い殻を蜂の巣のごとくにこにこと落ちつき払っているが、)父は、大分変って来ました。
私はそれを知っているとしか見えなかった。

よく分からない文ですが、前後3単語程度の範囲だけを見れば文法的になっていることが分かります。
今回はデータが夏目漱石なので硬い雰囲気になっていますが、ツイートなどで辞書を作れば当然、ツイートっぽい文を生成してくれます。


5. まとめ

この記事ではbotについて紹介し、中でも生成型のbotについて「数式を除いて」説明しました。
すこしでも理解の助けになればと思います。
もちろん、この記事でなんとなくイメージが付いたら、つぎは数式の理解のステップに進んでもらいたいと思います。
基本的な自然言語処理の用語や実装は、グラム先生のこちらのチュートリアルがとてもためになります。
Graham Neubig - チュートリアル資料

ちなみにマルコフ連鎖には重大な問題点があります。
ツイッターのデータを集めて学習するとき、その性質上
「元のツイートと全く同じ文」が生成されてしまうことが良くあります。
これを解決するためには、また別の言語モデルを使ったり、生成方法を変えてみたりする必要があります。
もし興味のある方は、この辺も考えて手直ししてみるといいでしょう。


僕もまだまだ初学者ですが、かつて躓いてた自分に説明するような感じでまた記事を投稿すると思うので、その時はまたお願いします。
「これの概念がよくわからん」みたいなメッセをついったーとかに送ってくれたら、僕の理解の範囲で説明してみるかもしれません。

最後に、この記事を読んでいて「ここがわからなかった」という部分があったらコメントで指摘してください。
僕も伝えることの練習として記事を書いているので、改めてその部分を書き直してみます。

では、よい言語ライフを。

*1:記述型のbotで有名なものとしてELIZAが挙げられます。

*2:余談ですが、僕は単語分割のタスクで研究しています。

*3:神様、僕は気づいてしまった - CQCQ - YouTube

*4:分割方法について興味がある方は、こちらのチュートリアルを読んでみてください。

*5:ツイートなどを扱う場合は、/:/や/,/といった文字列がテキストに含まれてる場合は弾く、といった処理をしなければ、読み込みの段階でバグってしまいます。

*6:別に<BOS>に続く単語でも確率は変わりませんが…

2017/07/03-07/09

オンタイム更新。

日曜日の夜に更新しちゃえばいいのか。

 

勉強会にて、ものの伝え方について考えさせられる。

頭がいい同期の発表は、たしかに論理的な順番で物事が伝えられ、最終的にしっかりとオチが付く話し方。

だけど、聞いてる側からしたら終着点が分からないままひたすら数式を見せられ、最後にほら、オチたでしょ?みたいな話し方をされるとたまったものじゃない。

一応教員免許を持ってるので、発表について「まずゴールを伝えること。知識の葉を茂らせすぎない事」が大切だよとシェアする。

 

あまり進捗が出ないというか、手が動かない一週間だった。

何が原因なのかわからないけど、若干燃え尽きの予感があるのでしっかりオンオフのメリハリをつけていきたい。

やっぱりどこか焦りがあるので、思い切ってオフができない。

もう大人なのでその辺の管理をしっかりしたい。

 

 

研究室自体もこんな感じで、みんなマイペースなのでなおさら自分のペースをしっかり作らないと、いろんな人に流されて個性が無くなるというか、自我が保てなくなる気がする。

ただでさえ色んな意味で強い人が多いので、しっかり戦っていきたい。

 

 

最近就職した高校時代の友人が誕生日だったので、転職の本を送った。

ここ数年では一番キレがないというか、面白みに欠ける感じなのが悔しい。

自分も自分のことで精いっぱいなんだけど、ボケるところはしっかりボケたいよなあ。

あと、先延ばしになってたお礼のお酒ってことで泡盛を送る。そういう意図でした。

 

土曜日は父上が還暦を迎える。

母上からはお祝いのメッセを送るように、とくぎを刺されてたのだが、普通に忘れてよく日曜日に慌ててメールを送る。

毎年日本酒を誕生日にあげてるので、今年も奈良っぽいお酒を手配した。いつ届くんだろう。

 

 

ボイスロイドの京町セイカちゃんっていう子の生誕祭があったらしい。

全く知らなかったんだけど、モデルになってる精華町ってのがすぐ近所なので、それもあって少し反応した。

ていうか、本当にすぐ隣って感じの街なので精華町奈良県だと思ってた。

ぜんぜん京都なのね。いつの間にか京都と奈良の県境を行き来してたらしい。

 

最近研究室が寒いのか、おなかがぐるぐるしてる。

地味にいたいなあってのが続いてるのでビオフェルミン買ってみた。

ストレスじゃない?とも言われたんだけど、もし続くようなら三日くらいオフ設けて遊んで来ようかなあ。

 

ブログの記事に勢いがないのもストレスの影響なのかもしれないけど、多分さっきビール飲んだのが原因。

いつも以上にまとめる気のない文章。

 

 

 

 

そういえばこういうことをここ二年くらい考えてる。

簡単なマルコフ連鎖botをつくろう!みたいな動画はすぐに作れると思うんだけど、プログラミング言語は何にするか、どの程度のレベルでプログラミングするかとか、考えてるうちに面倒くさくなってやめてしまう。

ただ、botを自分で作ってみる、そしてつくったbotが言葉っぽい何かを吐き出しているってのは小中高生にはいい刺激になるんじゃないかなと思ってる。

言語って楽しいんだよってことを、押し付けるんじゃなくてぜひ自分で気づいてほしいなと、今更ながら教員みたいな気持ちになってる。

 

2017/06/26-07/02

デスク周りが充実してきた。

癒しを求めてぬいぐるみを一匹買ってきて、足を置くためのオットマンを買って、スケジュール管理用のホワイトボードを買って、かなりいい環境。

デスクにはモニターがあって、windowsのノーパソをこれに繋いでたんだけど、最近は支給されてるMacで大体のことが事足りるので使ってない。

モニター撤去しようかな。

 

なんだかんだ言ってコーディング環境というか、開発環境としてはMacwindowsに勝るように感じてきた。

なんでかわからないんだけど、なんかそんな気がする

bashの手軽さとかかなあ。

あとはフォントがwindows8に比べるとはるかに見やすい。

といってもコーディングする時は環境問わずRicty Diminished使ってるんだけど。

これ何度か書いてるかもしれないんだけど、コーディングする時のフォントを小さくする人が割と信じられないんだよね。

肩が凝りそう。

(全体を見渡せるって点は利点だけど、体力使うので僕としては対価がでかすぎるので却下してる。)

 

この週はインターンの面接が二件あった。

一つは本命の言語処理系ベンチャー、もう一つは名前出さないけどみんなもよく知ってる外資IT。

外資ITの方は何事も挑戦だということで申し込んで見た。

そしたら書類とコーディングで先に進めたので面接して見たってかんじ。

面接の感触としては、全く手応えなかったんだけどね。

(これを書いてる時点でもまだ結果が出てないけど、最終面接まで進めてないことがSkypeでも伝わってきたのでお察し。)

英語面接、思ってたより自分の英語力があって助かった。

でも口頭で情報工学のニッチな質問されると辛いものがあった。もっと修行しないとなあと教えられた気分。

個人的な目標なんだけど、35歳くらいでその外資で働けるような能力をつけたいと思ってる。

頑張ろう、頑張ろうと気を引き締める。

 

ちなみにベンチャーの方はありがたいことにインターンに採用していただけた。

こちらもベンチャーとはいえかなり尊敬してる方々が集まっているので、二ヶ月間修行しようと思う。

秋にはバリバリのニューラルマンになって研究室に帰ってきたい。

 

同じ研究室にいる学年が一つ上の先輩が、ばりばりコードを書くすごい人なので、そのひとを目標に手を動かせる人間になりたい。

もちろん、その人は尋常じゃないくらい研究室にこもって、やばいほどコードを書いてるんだけど。

勝てる気はさらさらないんだけど、せめて戦えるくらいにはなりたい。

 

いろいろと頑張ろうと思える一週間で実りがあった。

先週まで悩んでいた実装も解決して次のステップに進めたし、ゴリゴリ研究を頑張ろう。

 

 

 

最近授業に出てなさすぎてやばいんだけどやばいのかな。

2017/06/19-06/25

月曜日朝、弾丸東京旅行から戻ってきてそのまま授業に出る。

朝7時半に奈良駅着、そこからギターと荷物背負って電車徒歩バスと2時間、やっと自宅につく。

めっちゃ遠いよなあ。

 

相変わらず一週間も前の事なんて覚えてないのでツイッターを頼りに思い出しながら日記を書いているけど、ツイッターちゃんと更新してないので全く思い出せない。

 

奈良は梅雨でめっちゃ雨降るしめっちゃじめじめしてるし、関東との気候の違いを改めて感じる。

本当に、この湿気は嫌になる。

 

東京で買ってきたおにゅーのグラブを試したくて、毎週水曜日の野球を楽しみにしてたんだけど、この週の水曜日はあいにくの雨。

でも木曜日に野球できたので良かった。

新しいグラブ、なんか気持ちも新鮮になっていいね。

 

研究というか、研究を始める前のベースライン構築でとても苦しい思いをしているので、野球でストレス発散できるのはとてもよい。

 

デスクにちっちゃいホワイトボードを設置し、スケジュール管理に使ってる。

もともと一週間先くらいまでしか予定を入れないというか、一週間ごとにタスクを管理し直すライフスタイルなのでホワイトボードでの管理が性に合ってると思う。

2017/06/12-06/18

日々はルーティン。

論文読んで勉強する日々、最高。

 

奈良では原付で買い出しに行ってるんだけど、そこそこ交通量が多い道を通っているのでたまに怖い思いをする。

先日、対向車線のトレーラーが自転車を追い抜くために若干こちらにはみ出してて怖い思いをした。

ロードバイクに恨みはないんだけど、さすがにあの狭い道を自転車で走るのは無謀なんじゃないかなあと感じた。

といっても、僕も原付でノロいので文句言われてるかもしれない。

 

先日参加した就活イベントの後始末をしていた。

後始末というと聞こえが悪いけど、ビジネスって面倒くさいなと思いながらメールしたりしてたのであながち間違ってない気もする。

(例によって企業に見られている可能性があるので慎みつつ。)

この就活イベント最大の収穫は、「あ、僕って博士に進みたいんだ」っていうことに気付けたこと。

頑張っていこう。

 

 

土日を使って弾丸東京帰省を敢行した。

金曜日の夜の深夜バスで東京へ行き、日曜日の夜のバスで奈良に戻るというタイトなスケジュール。

正直言って22歳の若さをもってしてもきつかった。

もう二度とやらないと思う。

乗ったのは青春エコドリーム号っていうJRの深夜バスなんだけど、ネットでものすごく乗り心地が悪いと評判である。

といっても、僕としてはまあバスなんだしこんなもんじゃないのって感じで乗れた。

マスクアイマスクイヤホンで顔周辺は完全に防御してたし、基本的に眠ることはできた。

ただ、足があまり動かせないので健康的じゃないなあという感じ。

あと、ケツが痛い。これが一番困った。

尾てい骨がね、痛いんだよ。

100均で買ったエアークッションみたいなのを敷いてたんだけど、それでもケツが痛い。

これってもっと上のクラスのバスなら痛くないのかなあ。

 

移動手段は今後考える必要があるなあ、と痛感した。

土日で帰るにしても、金曜日の夕方の新幹線とかで帰った方が健康的だと思う。

日曜日の夜の深夜バスはちょっとしょうがないところがあるけど、一つくらい上のクラスにしてみようと思う。

あ、バスタ新宿に初めて行ってみた。なんかすごく感動した。

バスという移動手段をこれまであまり使っていなかったので、バスに特化した施設を見ると新鮮な気分になる。

あそこから出る多くのバスの中でも、特にクラスの低いバスに乗るってのがちょっと癪だったので、やっぱりお金を工面して快適なバスで帰りたい。

 

東京では肉食べたり、ラーメン食べたり、野球のグラブを買ったり、非常に充実してた。

これまで書いてきたように野球を最近やってるんだけど、中学生時代のグラブがついに壊れたので新しいのを買ってみた。

この年になってまたグラブを買うなんて、数か月前には思ってもいなかった。

久しぶりに入った野球専門店は、かなりワクワクしたのでいい体験ができた。

 

東京から戻るついでに、ギターを実家から回収してきた。

これで奈良でも作曲できるぞ!って感じ。

まあ、そんな時間微塵もないんだけど。

2017/06/05-06/11

相変わらずルーティンな生活をしている。

平日は起きて、研究して、たまに授業の課題をやって、帰って寝るといった感じ。

毎週木曜日と日曜日にイオンへ買い出しに行く以外は特に目立った外出もなく。

こーいうルーティンな生活が性に合ってるので、無理して変えていこうという気持ちも起きない。

 

どちらかというと就活的なことに精力的な一週間で、土曜日には就活イベントに参加した。

大阪開催だったので、人生初大阪上陸を果たす。

道行く人々がみんな大阪弁だ!って少し楽しんでた。

 

イベントでは色んな企業さんとお話させてもらう。

今まで言語処理でエンジニア的な仕事をしようなんて考えたこともなかったので、ぶっちゃけどういうことが企業的にほしい技術なのかな、と聞いて回る感じだった。

と言っても、お話するのは基本人事さんなので技術的な話をしてもあまり刺さらず、アピールの仕方が難しいなあと感じる。

イベント後にお会いした企業の方にメールを送る。

ビジネスって面倒くさいなとか、あぁー博士課程すすみてえなぁとか、色々感じられるイベントだった。

(このアカウントも知られているので慎まなければいけない)

 

授業は第二タームが始まる。

やたら必要取得単位数が多い大学院なので、秋くらいまでは授業で忙殺される。

二年しかないのであんまり圧迫しないでほしいんだけどなあ。

やっぱり分野的にもそこそこ遠いし、特に興味もない技術をひたすら勉強するのってQOLが下がる思い。

もちろん別の分野の事を知るのも大事なんだけどさ。

 

前にも書いた通り、このブログはTwitterを見ながら思い出して書いてるんだけど、最近ツイートが少なくて思い出しの手がかりもなくて困る。

もっとちゃんとTwitter使ってくれ。