豊洲にマグロを運ぶ仕事

去年、人工知能に仕事を奪われて無職となった私ですが、 なんせ東北で農業始めた時の借金が多すぎた。

そのため、強面のお兄さん達に仕事を紹介してもらって今はマグロ漁船に乗ってる。 命がけの仕事な上に、給料のほとんどが借金返済に充てられるから実質時給300円くらいだと思う。

でも、仕事っていうのはお金だけじゃない! 私が釣り上げたマグロでみんなに家族団欒の時と笑顔をお届けする事ができる、とても やりがいのある 仕事です! みなさんも一緒にどうでしょう?

ところで話は変わる。 本当は口止めされているのだが、こっそりとならこのブログに書いてしまってもいいだろう。

実は今回我々がマグロを運ぶのは最初から築地じゃなくて豊洲でって言われてたんだよね。 多分要するに、そういうことなんじゃないかな?

※ このブログは4/1に記載されたものになります

人工知能に仕事を奪われてクビになった日本死ね!!

タイトルの通り。

いやもうマジで意味がわからん。
Excel方眼紙いじくるだけなら人工知能でもできるって?

そりゃ確かにそうかもしれないけどさ

こちとら人間様だぞゴルァ

一昨年にSIerを辞めて農業はじめて、去年には後悔してたから、またこの業界にもどってきたんだから、 まぁ確かにそんな人間は下っ端だけどさ。。

単純作業ばかりやらせてたのはてめぇらだろうが!

もうほんと日本死ね!

※この記事は4/1に書かれたものであり実在する個人・団体・その他とはなんら関係ありません
※毎年時事ネタ混ぜつつストーリー化するのもそろそろ大変ですわ

今更マイナンバーについてでも語っとくか

2016年はブログをいっぱい書くというのを2015年の目標にしたので、今年のうちに数を増やしておく。 何を言ってるかわからないと思うが俺にもわからない。

はじめに言っておくが、年末で暇なので暇つぶしに書いているものであり、中身は無い。

さて、実は11月に財布をなくしたのだが、その時にちょうどマイナンバーが盛り上がっていたので、 その経験も踏まえて思うことを書いておくことにする。

事前知識

事前知識として、財布をなくしたときの復旧の困難さについて語っておこう。

通常財布の中身で復旧が必要になることが想定されるものは

  • キャッシュカード
  • クレジットカード
  • 免許証
  • 保険証

などが考えられる。その他にも人によって再発行が必要になるものは様々だろう。

ここで、再発行には本人確認ができるものが必要なわけだが、多くの場合 公的機関 の発行するものが必要となる。
具体的には免許証や保険証、住民票などである。

ええ、上記失うものを見て分かる通りこりゃ大変ですね。
さらには免許証なんかも再発行には本人確認できる書類が必要である。

私の場合パスポートがあったのと、保険証は会社に申請だったのでなんとかなった。

マイナンバー?

この時ふと思ったのが、こういう時にこそマイナンバーが使えると便利ではないだろうか? ということである。
マイナンバーで何ができるか詳しくは知らない私だが、 ICカード入りのを作っておけばコンビニなどで書類発行できる的なことが書いてあった。

違う、違うんだ!そんなことできるんならそれ自体が本人確認使えていいはずだろ!

ガバガバな仕組みのせいで出来ないこと。。

そう、番号さえ提示すればいい時代が来て欲しい。
番号から参照できるデータに適切な権限が設定されていれば最低限の情報のみを確認できるようになるはずなんだ。

しかし、どうやらこのマイナンバーは人に見せると問題があるようである。
それにもかかわらず会社とかには提出しないとダメらしい。

ふむ、これって要するにID=パスワードな仕組みかつ、必要な人とはアカウントを共有することって話じゃないかな?
しかも目的なく第三者に見せるのが違法とはいえ、データベースの中身を売りさばく社員がいるようなご時世ですよ。

私はセキュリティの専門家ではないので、この辺に関してはあまり言及しないようにしておくが、少なくともこの仕組みのせいで出来ることが少なすぎる(出来ちゃいけないことが多すぎる)ように思うのだよ。

少なくとも、

  • 番号を提示すれば適切な権限で限られた必要な情報のみを国から取得できる
  • 本人は番号の他にパスワードなど認証を使って全情報にアクセスや編集(住所変更、公開設定など)

ができるようになってるだけでも今まで面倒だった手続きで簡略化できるものが増えて便利になったんだろうなぁ・・・と思う次第であります。

少なくとも私にとって現状は、取り立ててメリットは無いが、 財布を無くすのと同様に誰かにカードを盗まれるリスクのみを一方的に国から背負わされた感しかない。

などなど考えていたら、外もすっかり暗くなってきた。
冬の日は短いものだ

おまけ

各種再発行には公的機関が発行する証明書が必要ですが、逆にそれさえあれば誰でもその人になりすませる可能性が実はあります。

キャッシュカードやクレジットカードは電話一本で止めることができましたが、免許証や保険証には無効化する手段がありません。
おそらくマイナンバーもそうなので皆さんくれぐれもお気をつけください。(人が気をつけないとダメな仕組みになってるのが問題な気がしますがね)

wikipediaのタイトルの読み仮名を取得する

どうも、クソアプリ Advent Calendar 2015の25日目を酔った勢いだけでとったじょんすみすです。

アプリとか作れないので昨日まで何を書くか悩んでいた

さて、最近は人工知能とか機械学習とかが流行ってますね。 みなさん魔法の杖かのように「機械学習でやりましょう!」とか「人工知能で職がなくなる」とか言っております。

ところで、有名な言葉に「データサイエンティストは21世紀で最もセクシーな職業」というものがあり、 どうやらデータサイエンティストになるにはセクシーな魔法使いである必要があるようです。

魔法使いになるには30歳まで童貞でいる必要があるので、セクシーな30歳童貞とかまさにユニコーンですね。 なお、私はユニコーンになる条件を満たしておりません(セクシー、30歳以上、童貞のどれを満たしていないかは想像にお任せします)

そんなわけで、本題に入りたいのですが、 機械学習やAIのような難解な数式を持ち出さなくても人間の経験則だけでこんなことが簡単にできちゃう事例を紹介します。

勘と経験だけで人は30万単語の読みを把握できる

エンジニアたるものコードで語りましょう。

# -*- coding: utf-8 -*-                                                                                                           
require 'rexml/document'

data = ''
File.open('jawiki-latest-abstract.xml').each do |line|
  # ファイル全体を読み込んでxmlとして処理するにはデータが大き過ぎるので                                                           
  # 一行ずつ読み込んでdocタグ単位で処理                                                                                           
  data = '' if line.include?("<doc>")
  data += line
  if line.include?("</doc>")
    doc = REXML::Document.new(data)

    # タイトルから前後の余計な文字列を取る                                                                                        
    # 末尾は「(曖昧回避)」などが含まれている場合がある                                                                            
    title =  doc.elements['doc/title'].text.gsub("Wikipedia: ", "").gsub(/\(.+\)$/, '').strip

    abstract = doc.elements['doc/abstract'].text
    next if abstract.nil?

    # 最初の括弧内が読み仮名、英語表記、略語である可能性が高い                                                                    
    kana = abstract.scan(/(.*?)/)
    if !kana.empty?
      # 読み仮名、英語表記、略語が複数ある場合によく使われる区切り文字                                                            
      kana = kana[0].slice(1...-1).split(/[,:、]/)

      kana.each do |i|
        # 仮名表記のみを取り出すことで読み仮名のみに限定                                                                          
        if !i.empty? && /^[ぁ-んァ-ン・ \-]+$/.match(i)
          # 一部いらんもじ削除                                                                                                    
          i = i.strip.gsub(/([・-]|\s)/, '')
          # カタカナをひらがなに統一                                                                                              
          hira = i.tr('ァ-ン', 'ぁ-ん')
          puts "#{title}\t#{hira}" if !hira.empty?
        end
      end
    end
  end
end

なんと、このコードはすべてemacsで書かれています!vimは一度も起動してません!

これはwikipediaのダンプデータにあるアブストラクト(※リンクをクリックすると1.7GBのxmlを取得します)を利用して簡単なルールだけでタイトルに対応する読み仮名を抽出するものです。

みなさまにおかれましては寄付をされているかは存知あげませんが普段からよくwikipediaをお使いのことと思われます。で、このwikipediaでは

例えば「近藤うどん子」に関する内容の場合、

近藤うどん子(こんどううどんこ)とは〜〜である。

のような形式で始まっているものの多いこと!おそらく人間のサガというやつでしょう。

※2015/12/25現在、wikipediaに近藤うどん子に関する記事はございません。

その性質を使うだけでおよそ30万語の読み仮名データを取得できました。一例を見てみましょう。

形式言語        けいしきげんご
文脈自由言語    ぶんみゃくじゆうげんご
正規言語        せいきげんご
自然言語処理    しぜんげんごしょり

のようなものや、

イスラエルの失われた10支族      いすらえるのうしなわれたじゅうしぞく
グラム・シュミットの正規直交化法        ぐらむしゅみっとのせいきちょっこうかほう
商法中署名スヘキ場合ニ関スル法律        しょうほうちゅうしょめいすべきばあいにかんするほうりつ
NHKデジタル衛星ハイビジョン     えぬえいちけいでじたるえいせいはいびじょん
日本国政府と中華人民共和国政府の共同声明        にほんこくせいふとちゅうかじんみんきょうわこくせいふのきょうどうせいめい

のような長いもの、

7       しち
7       ひち
7       ち
7       なな

のような同じ文字で別な読みがあるものなどとれています。

中には

SUZUKIハッピーモーニング・いってらっしゃいシリーズ      すずき
ハーディ・ガーディ      より

のような、「いや、おい!」とい言いたくなるものもありますが、まぁ仕方ないでしょう。

ちなみに、はてなキーワードのデータだと最初からキーワードと読みがセットになっているものがおよそ40万語、 ニコニコデータセットの大百科だと18万語ほど取得できます。

この処理には1.7GBあるデータをダウンロードする必要があるのと、1時間以上の処理時間が必要なので、 やってみた割にはあまり効果がないと言えるでしょう

なお、欲しい方がいるかはわかりませんが、こちらにあげておきました。 13MBあります。

で、何に使えるか?

クソアプリアドベントカレンダーのネタなのにこれを考えるのは少々無粋です。

wikipediaのタイトル自体は形態素解析の辞書に追加される例などが見受けられますが、 これに読み仮名も付与できるわけですね。

しかし、はてなキーワードより語数が少なく、ooの一覧なども抽出されている上に、 最近ではmecab-neologdというものもあります。

また、辞書の追加においては解析対象のドメインに特化したものが必要となることが多いので、その点ニコニコ大百科の方が利用シーンが多いと言えるでしょう。

そもそも世の中には便利なルビ振りAPIとかありますね。 例えばYahooのとか

なので、皆さんで勝手に御考え下さい。
ちなみにこの程度の内容であれば過去既にだれかやっていると思いますよ。

あとがき

実は他にもネタがあったんですが。。

今年は凛ちゃんの年だったので、何度かやっていた「星空凛」、「渋谷凛」、「遠坂凛」、「松岡凛」の四方に対する2chでの個別キャラスレの会話内容から、どの凛ちゃんに対する話かを予測するとかよくやってました。

こちらはslideshareに上がってるので興味がある人は頑張って探してみてくださいw(半年以上ぶりのブログ更新のためこれらに関する記事を書いていないかった)

ついでに来年やりたいネタメモ

CNNでアニメキャラの顔認識とRNNを利用したキャプションをつけるやつを使って、
キャラの画像とそのシーンでのセリフを学習させれば、キャラの性格や口癖を反映させた文章が生成できないだろうか?

というのがありますので、恵まれない私にクリスマスプレゼントとしてGPUを買ってくれる人を募集しています。 これが今回一番主張したかったことです!(というか必要なデータどうやって集めるんだこれ・・・)

RNNこれくしょんでLSTM使おうと思って失敗した話をMLCTでした

RNNこれくしょんを早速人柱になろうじゃないかと使ってみた

本来であれば結果や内部でどんな表現を獲得してるのかを話したかったが、 動くまでがものすごくツラく、しかもまだ間違ってるっぽい

しかし、後世の人たちの為にセグフォで落ちないところまでどうやったかをまとめておく
ただし、全てのデータが必ずこのやり方で落ちないとはかぎらない
公式のwikiに書かれているMLPのレイヤー数を変更したりしても落ちるので注意

入力データについて

※LSTMは自然言語処理なところで流行っているのでfeatureの日本語は「素性」とします

サンプルにあるrecall.jsonで動かす場合入力データはpythonのstructでpackされている(gen_recall.pyのwrite_binay参照)
素性が01の二値である場合(jsonの設定のdata/typeにserise_int_binaryを指定した)これでいいようだ

今回は文中の単語や文字をword2vecを用いて分散表現にしたのち、各次元を一つの素性として与えている
このときはどうやらserise_asciiを選択するよう(任意の実数値を読み込めるのがこれだけだった)で おそらくこれでいい

正解ラベルも二値分類なら0-1でいいがn値なら正解だけを1、他を0にしたベクトル行×データセット分の列とすれば読み込めた

次に読み込ませるにはこれを各値ごとに1行割り当てる必要がある
実際に読み込んでいるscr/core/io.hppではfscanf("%f", &data[i])として読み込んだあと各値を node->x_all[0][i][j]に入れていた(nodeはsrc/core/node.hppで定義されいるmsadow/tensorのTensorContainer。余談だが、3重ループのコメントアウトやインデントのされ方的に3つ目の次元も使おうとしていたっぽい。ひょっとするとこれをシーケンスの長さに利用する予定だったのかも)

jsonの設定について

こいつもまた厄介 data/n_{train, test}で学習、テストのデータ件数を指定するが、こいつはΣn_i * l_iとなる
n_iはi番目のデータ、l_iはn_iのシーケンスの長さ
これはもちろん人力計算

learning/n_timeは公式でBPTTの逆伝播ステップ数となっている
ん?固定長なのかまさか?

というわけで再び入力データ

n_timeが固定っぽいので、短いデータはどうすんだ?となった
確かに公式wikiのサンプルはいずれも固定長だ(なんでRNNのサンプルにMNISTのデータとか使ったんだろ?)

本当はその辺の処理もどうしてるかソース読まないかんのだけど、今回はとりあえず よろしくやってくれるだろうと信じて、0のベクトルを埋めてみた

そしてその結果うまく行かなかったのでおそらくここの扱いが間違ってる
平均取る時に確実にこのゼロの部分も計算に入れられてるね。。

その他

データ件数、素性数、BPTTのステップ数など、間違えて入力データと整合性がとれないと確実にセグフォになります
人力計算が含まれているのでかなりツラいです

データと設定の整合性がとれていないと動かないのは下手に中途半端な動作をしてマズい結果を出すよりはいいと思うのですが、何処と何処の整合性がとれていないかは出して欲しいですw

さて、その後の飲み会でも話題になったDevDataですが、このRNNこれくしょんはいい感じにそれを体現してるな、と思いました
最終更新が1ヶ月前と不穏ですが、せっかくOSSとしてGithubに上がっているのだから積極的な参加でよくしていくことが求められます

研究レベルで新しいこと(LSTMは97年。忘却ゲート入れたのも00年ですが)は、優れたライブラリの登場によって応用研究やビジネス利用にも繋がっていきます

是非、数年後に「このRNNこれくしょんはワシが育てた」とか言えるにはもってこいのOSSだとおもいますよ!

実装への貢献だけじゃなく、ドキュメントの充実でも、英語化でも何でもいいと思います

ニコニコデータ研究会でLTしてきたよー

「凛ちゃん」というキャラが登場する作品は数多くあるので、 文章からどの凛ちゃんについての内容なのかを分類する話

SVMとDeep Learningを使って、 「星空凛」、「渋谷凛」、「遠坂凛」、「松岡凛」を分類

2chの各キャラについて語られてるスレを学習データに使用

という話をしてきた訳である

まぁ、Linear KernelのSVMでそこそこ精度が出てるということは ある程度線形に分離可能なので、 ぶっちゃけ、たぶんDeep Learningなんて必要なくて隠れ層なしのパーセプトロンでもよかった

うん、パラメータチューニング時の傾向から何となく想像出来てた。

ちなみにこのスライドをのせた時に H2OのDeep Learningについていろいろ書こうかと数日前までは思っていたのだが、 機械学習プロフェッショナルシリーズの「深層学習」が これ読めばいいじゃんって内容だったのでアマゾっておくことにした

www.amazon.co.jp

アフィリエイトとかしてないので気にせず押して大丈夫だよー

転職は失敗だった

一年前、SIerをやめて東北で農家をはじめた(2014-04-01参照)

完全に失敗だった。 農家は思ってるより厳しいし、風評被害で新参者の作物なんて一切売れない

まじで土下座像してでも前の会社に戻してもらいたい。

※この記事は4/1に書かれたものであり実在する個人・団体・その他とはなんら関係ありません