/var/log/study

つまり雑記

入門自然言語処理 第1章

2017年度上期目標達成プロジェクトの第1週目

方針

  • 本はpython2だがpython3で通す
  • 本を読んでpython3対応するのがめんどくさくなったら以下を読む

python2 -> python3 のマイグレーション

  • nltk.download() がさっくり動かない
    • 止まった所はちまちまダウンロードする
    • それでも1こだけダウンロードできなかったやつがある
      • 一旦無視 こまったら考える
  • nltk.text.Text の generateメソッドが使えない
  • python3の dict_keys でindexへのアクセスができなくなってる
  • nltk.probability.FreqDist でplotした時の縦軸が%ではなく単語の総数となっている
    • 英語サイトを見たら、%表示では無くなってるのでまぁよしとする
      • (が,正直, plotした時の値は%軸の方が良い気がする)
  • bigrams関数が無い
    • from nltk.util import * で使えるようになる
      • generatorなのでforで回す

雑なメモ

  • 語義曖昧性解消
    • 文章内の単語と単語をくっつけて、文章の意味を正しく解釈する
  • 代名詞解析
    • 文章の流れから代名詞(theyとか)を正しく推測する
  • 言語出力の生成
    • 問に対する答えを作る?
  • 機械翻訳
  • 音声対話システム
    • bot的なもの
    • 知っている?という問いに対してyes no ではなく, 推論して解答を返す
  • 含意関係
    • 1つの文章から, 別の文章の真偽をチェックする

雑な感想

  • たしか大学の教科書って聞いてた
    • pythonの基本的な説明が多い
    • 個人的には不要
    • 初心者にはありがたいかもしれないが、python2なので改定が必要そう
  • python3でも意外と動いたり動かなかったり
  • 言語処理100本ノック
    • 1日1問くらいで、現在30問目くらい
    • 100本ノックの際はnltkがアレばだいたいokでは?って思えた
      • 便利
        • bigrams
        • collocations
  • nltk.chat.chatbots()が面白い
    • Iesha (teen anime junky)
    • が中身はちょっとしょぼい?
  • 各章ごとに演習問題がついている
    • 2章からは取り組もうとおもう
      • 正直pythonの基礎文法をやるのは怠いので

haskellで空文字列を指定するときの方法

タイトルのまんま。

結論

“\NUL"を使うと良い

発覚までの流れ

pcre-heavy: A regexp library on top of pcre-light you can actually use.

上記のライブラリを使って正規表現でマッチさせて置換しようと思った時の話

具体的な実行したいこと

現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更 から ' を取り除き

[[スターリング・ポンド|UKポンド]] (£)UKポンド (£) にしたいとき

抽象的にすると

  • ' を取り除く
  • [ を取り除く
  • ] を取り除く
  • [[$some_word| を取り除く

バグるパターン

gsub [re|('+|\[\[.*\||\[+|\]+)|] (""::String) x

これだと中途半端に動くのがタチの悪いところ

うまくいくパターン

gsub [re|('+|\[\[.*\||\[+|\]+)|] ("\NUL"::String) x

空文字列を指定するときは \NUL を使う必要がある模様. ただしHaskell的には常識的な話なのかもしれない.

どこかのwebサイトで, \NUL を指定しているのを見つけて試したらうまくいったのだが, どこのサイトなのかがわからなくなってしまったのが残念.

2017年度上期の目標

目標

入門 自然言語処理

入門 自然言語処理

半年かけて、上記の本を通そうと思う.

出来れば土日のどちらかで1.5hくらいを使って取り組みたい.

目標設定の基準は、現在自分がプライベートで取り組んでいること(直接業務とは関わりのないこと)で選んだ.

思ったこと

学年制と単位制 - Wikipedia

wikipediaを眺めると,大学の1単位は45時間の学習が目安らしい. とはいえ、実際には22.5時間で2単位でてる.

仕事をしつつとは言え, 業務とは関係のない話題を毎週1.5時間の学習が無理なのか?と問われると… 実際は可能な気もする.

最近の出来事として

write code everyday に感化されて, ハードルを低く*1, 1日1問プログラミングで問題を解くことをしてみている.

現在解いている問題は以下.

www.cl.ecei.tohoku.ac.jp

まだ初めて3weekしか立ってないので、この活動はもう少し続いたらまとめるつもり

*1:wirte code everyday の記事を読む限り, 毎日コードを書きましょうと言う意図より, 毎日ソフトウェアを開発しよう!って感じが読み取れた. 個人的に毎日ソフトウェアを開発し続けるのは様々な面で難しいと思ってる.

OSX上のHaskell stackでMecabを扱う方法

本文章は以下に書いてあることを抽出して纏めた記事である.

qiita.com

haru2036.hatenablog.com

github.com

問題点

自分のOSX環境では、なぜかHaskellからMecabを利用することができなかった

解決できたサンプルリポジトリ

github.com

git clone https://github.com/shouhei/mecab-sample-hs.git
cd mecab-sample-hs
stack build
stack exec mecab-sample-hs-exe

以上を叩くと

隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よく    副詞,一般,*,*,*,*,よく,ヨク,ヨク
柿      名詞,一般,*,*,*,*,柿,カキ,カキ
食う    動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS

上記の様な出力になるはず

解決方法

stack.ymlを以下を追記する

packages:
- '.'
- location:
    git: git@github.com:morishin/hsmecab.git
    commit: 2da6677fbd42bb77d3b6e61c02edfeebe248e184
extra-include-dirs:
- /usr/local/Cellar/mecab/0.996/include/
extra-lib-dirs:
- /usr/local/Cellar/mecab/0.996/lib/

次にproject.cabalに以下を追記

library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , mecab
  default-language:    Haskell2010

でもって、 stack build すると問題なく使えるようになるはず

問題を時系列に追う

  1. stack でmecabがインストールできない
Could not parse '/path/to/mecab-sample/stack.yaml':
AesonException "failed to parse field 'packages': failed to parse field 'location': when expecting a PackageLocation, encountered Null instead"
See https://github.com/commercialhaskell/stack/wiki/stack.yaml.

tanakhさんの作ったmecabバインディングではダメらしい

qiita.com

  1. githubのforkを利用する

インストールは出来るんだけど、OSX的にダメらしい

haru2036.hatenablog.com

Enter passphrase for key '/Users/shouhei/.ssh/id_rsa':
Warning: File listed in mecab-sample.cabal file does not exist: README.md
mecab-0.4.0: configure
mecab-0.4.0: build
mecab-0.4.0: install
mecab-sample-0.1.0.0: configure
mecab-sample-0.1.0.0: build
Completed all
--  While building package mecab-sample-0.1.0.0 using:
      /path/to/.stack/programs/x86_64-osx/ghc-7.10.2/bin/runhaskell -package=Cabal-1.22.4.0 -clear-package-db -global-package-db -package-db=/path/to/.stack/snapshots/x86_64-osx/lts-3.13/7.10.2/pkgdb/ /var/folders/lk/jk8fbl3s4
qgc7fzz7r3wxn300000gn/T/stack28485/Setup.hs --builddir=.stack-work/dist/x86_64-osx/Cabal-1.22.4.0/ build exe:mecab-sample-exe --ghc-options -hpcdir .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/hpc/.hpc/ -ddump-hi -ddump-to-file
    Process exited with code: ExitFailure 1
    Logs have been written to: /path/to/mecab-sample/.stack-work/logs/mecab-sample-0.1.0.0.log

    Configuring mecab-sample-0.1.0.0...
    Preprocessing library mecab-sample-0.1.0.0...
    [1 of 1] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/Lib.o )
    In-place registering mecab-sample-0.1.0.0...
    Preprocessing executable 'mecab-sample-exe' for mecab-sample-0.1.0.0...
    [1 of 1] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe-tmp/Main.o )
    Linking .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe ...
    Undefined symbols for architecture x86_64:
      "_mecab_get_all_morphs", referenced from:
          _cdn2_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_get_partial", referenced from:
          _cdly_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_get_theta", referenced from:
          _cdpg_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_all_morphs", referenced from:
          _cdSu_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_partial", referenced from:
          _cdWY_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_theta", referenced from:
          _cdVy_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
 2 action
  1. ググったらcabal install のときにパラメータを指定する必要があるとのこと 

  2. cabalのパラメータをstackで実現するには?

github.com

  1. ドキュメントをみて解決

((Pythonで) 書く(Lisp) インタプリンタ) というやつをpython3でとりあえず動かす

タイトルの通り. やってみたら以外とあっさりPython3対応できた

元ネタは以下の記事

((Pythonで) 書く (Lisp) インタプリタ)

Python3対応自体も既出のネタかもしれないが、書いてしまったので公開する

環境準備

適当にPyhton3のインタプリンタを持ってくる.

自分はDockerを使って、python3.6.0 の環境を入手した

下準備

lis.py がpython2のインタプリンタでは走るようになっていると思う.

まず、おもむろに

以下を先頭に

#! /usr/bin/env python

以下を最後尾に

if __name__ == "__main__":
    repl()

そして、lis.py に実行権限をつける

# chmod +x lis.py

手順

基本的にはpython2からpython3で変更されているものを対応をしたら良い

./lis.py

で、最初にエラーが出るのは、

if val is not None: print to_string(val)

python3では、printがステートメントから関数に変わっているエラーなので、 print() に直す

それを直すと,

AttributeError: module ‘operator’ has no attribute ‘div’

がでてくる。 divtruedivfloatdiv にわかれたらしい。 どちらが正しいとか本来はあると思うが、 ひとまず truediv を選ぶ

最後が

NameError: name ‘raw_input’ is not defined

というエラーで、標準入力を待ち受ける関数名が input に変わったとのことなので、そちらに変更する。

以上の3つのエラー対応でとりあえず再び動き始める

本来は必要な残りの作業

テストコードがあれば良いのだが、今回の元ネタにはテストコードがないので、暇があれば実装してPython3対応が正しく完了しているかを確かめたい。

DigitalOceanをざっと眺めて気になった点

クラウド事業を展開しているところに従事している都合上、他社サービスがどんな風になっているかきになるお年頃なのです。

先日、DigitalOceanを触り始めたのでそのメモ

コンパネ

  • 白を基調に水色で綺麗
  • 何が動作するのかは分かりやすい
    • ただしわかりづらいところは、本当によく分からない(後述する)
  • 料金が明示的ではないので、お金のかかり方がよく分からない

インスタンス

メモ

  • 基本10個まで
    • 上限解放できそう
  • OS
  • リージョン
    • いろいろあるが日本リージョンは無い
    • 地理的な話だと一番近いのがシンガポール
  • オプション
    • プライベートネットワーキング
      • これが本当によく分からない
      • 同じリージョン, ゾーンに属すインスタンスをつなげると書いてあったがよく分からない
      • 割り振られたプライベートIPが/16なので、リージョン間でどのVMとも共有されるIPをつけることが可能な機能?
      • コンパネをざっと眺めているだけだと、プライベートネットワークを止める方法が分からない
    • バックアップ
    • IPv6
    • User data ?
    • 監視
価格 cpu(vCPU) メモリ(GB) ディスク(GB) ネットワーク流量(TB)
5 1 512MB 20 1000GB
10 1 1 30 2
20 2 2 40 3
40 2 4 60 4
80 4 8 80 5
160 8 16 160 6
320 12 32 320 7
480 16 48 480 8
640 20 64 640 9

雑感

インスタンスの設定とローカルディスクのサイズが関連してしまっているので, 中サイズのインスタンスを後に, 小さいインスタンスにすることができなさそう.

なので「インスタンスのサイズを下げてコストを抑える」とかのクラウド的な基本テクが使いづらい.

日本リージョンが無いのは割と残念.

$10でまともなVMが借りることができるのは本当にすごい.

ネットワーキング

  • ドメイン
  • PTR
  • LB
    • 月20ドルから
    • 性能は未調査
  • フローティングIP

    • AWSで言うところのElastic IP
    • VMについてるIPをフローティングIPに昇格させる
  • ファイアーウォールが無い

    • iptablesとかFirewalldとかやらなきゃいけなくてダルい

雑感

  • LBが安いと思う

触っていないもの

  • volume
  • API
  • Image

最後に

DigitalOcean: Cloud computing designed for developers

あなたがdocker-ceをcentos7にansibleでインストールしたい時に読むべき記事

タイトルの通り。

あと2017/03/03に書かれている記事なので注意

dockerがリリースサイクルを変えて、多分リポジトリの情報の配布方法も変更した模様。

具体的に言うと、 yum-config-manager ってやつを使うようになった。

ansibleでyum-config-managerコマンドを扱ってくれるモジュールは現状なさそう。

yum_repositoryモジュールはrpmで配布するやつを扱うので今回のケースではうまくいかない?っぽいのでワークアラウンドを書く。

ワークアラウンドだと思うし、本当にyum-config-managerを扱うモジュールがいないのか?は疑問なところだが、それは後日もう少し調べる。 

以下はplaybook

- name: install yum-utils
  yum: name=yum-utils state=present
- name: add docker repo
  shell: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo"
  args:
    chdir: "/etc/yum.repos.d"
    creates: docker-ce.repo
- name: install docker-ce
  yum: name=docker-ce state=present
- name: restart docker
  systemd:
    name: docker.service
    state: restarted
    daemon_reload: yes
    enabled: yes

shell moduleでなんとかする方向でやってあげると良さそう?

ちなみに、この記事を書いてる時点でインストールされるdockerのバージョンは以下

# docker --version
Docker version 17.03.0-ce, build 3a232c8