いっきのblog

技術とか色々

Jupyter Notebookの後継?Jupyter Labをつかってみた

f:id:kzkohashi:20180730231213p:plain自然言語の処理をする際に、JupyterNotebookと言われるノートブック形式のWebツールを使っている。

jupyter.org

以下のようにPythonのコードを書きながらメモもとれ分析の実行結果(勿論グラフも)もみれるというすぐれものだ。このツールが最初に出たかはわらかないが、Spark(Scala)を動かすためのツールなどもオマージュして作られている。

f:id:kzkohashi:20180726215431p:plain

また、GoogleColaboratoryAWSSageMakerIBMIBM Data Science Experience、MSのMicrosoft Azure Notebooksなどがある。みんな大好きなツールというのはおわかりだろう。

そんなJupyterNotebookに後継っぽいのが出てると聞いて今回は使ってみる。

JuyputerLabについて調べてみる

あまり英語はわからないが、next-generationという単語があるのでおそらく次世代のJupyterなんだろうなと見て取れる。

github.com

開発自体は、2015年ごろから行われていて、今でも割と活発に行われてるっぽい。

f:id:kzkohashi:20180726221140p:plain

JupyterLabをインストールする

さっそくReadme通りにインストールしてみる。

$ pip install jupyterlab
Requirement already satisfied: jupyterlab in /usr/local/anaconda3/lib/python3.6/site-packages
Requirement already satisfied: notebook>=4.3.1 in /usr/local/anaconda3/lib/python3.6/site-packages (from jupyterlab)
Requirement already satisfied: jupyterlab_launcher>=0.4.0 in /usr/local/anaconda3/lib/python3.6/site-packages (from jupyterlab)

よっしゃ!インストールや!ともったら、anacondaPythonをインストールした際にすでに入ってたっぽい。。

If you are using a version of Jupyter Notebook earlier than 5.3, then you must also run the following command after installation to enable the JupyterLab server extension:

jupyterのバージョンが5.3以前の人は引き継がせるためにはコマンドを打つ必要があるらしい。

jupyter --version
4.3.0

4.3なので打つ。

$ jupyter serverextension enable --py jupyterlab --sys-prefix
Enabling: jupyterlab
- Writing config: /usr/local/anaconda3/etc/jupyter
    - Validating...
      jupyterlab  OK

JupyterLabの起動

インストールもおわったので、早速起動してみる。

$ jupyter lab
[I 22:17:21.036 LabApp] JupyterLab alpha preview extension loaded from /usr/local/anaconda3/lib/python3.6/site-packages/jupyterlab
JupyterLab v0.27.0
Known labextensions:
[I 22:17:21.039 LabApp] Running the core application with no additional extensions or settings
[I 22:17:21.046 LabApp] Serving notebooks from local directory: /Users/SayKicho/develop/analysis-practice/word2vec/jupyter
[I 22:17:21.046 LabApp] 0 active kernels
[I 22:17:21.046 LabApp] The Jupyter Notebook is running at: http://localhost:8888/?token=d061cb4b3067b85e8ca007f1ac4cc6130b2cfb908b07a6d5
[I 22:17:21.046 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 22:17:21.049 LabApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=d061cb4b3067b85e8ca007f1ac4cc6130b2cfb908b07a6d5

最初のログインがアニメーションになってて、、次世代を感じる。

f:id:kzkohashi:20180726222139p:plain

Notebookを押してみるといつも通りのJupyterNotebookがでるんだけど、なんと・・同じ画面で複数(Tab)開ける!!!以前だと、複数のノートを開くためにはブラウザ自体で新しいタブを開く必要があったのに、もうすでに次世代を感じている。

f:id:kzkohashi:20180726222233p:plain

ConsoleではPythonの実行がコンソール画面でできるのだが、Notebookでいいじゃんと思ったり思わなかったり・・・。

f:id:kzkohashi:20180726225654j:plain

一番次世代感を感じたのは、ドラッグ&ドロップによるセルの移動だ。こいつは便利だ・・・。使い始めたばかりの時からこの機能はホスィと思っていたので嬉しい。

f:id:kzkohashi:20180726224356j:plain

他にデータファイル(CSVなど)をテーブル表示してくれるなどの便利機能があるっぽいが、そもそもJupyterNotebookですらあまり使い込んでないので、便利そうだなーというくらいにしかまだわからない。

終わりに

分析の作業量が少なくJupyterLabの魅力が伝えきれてないし、悪いところもわかってないが、自分がいいなと思う機能を紹介した。もっと分析の作業が増えた時に良いとこ悪いところに気づくと思うので、その際にはまた追加して書く。

vim Extensionも試してみた。 kzkohashi.hatenablog.com

TF-IDFの理論をざっくり理解する①

最近、自社のプロダクトで自然言語処理がよく使われるようになってきたので、勉強も兼ねてまとめてみる。

TF-IDFとは?

tf-idfは、文書中に含まれる単語の重要度を評価する手法の1つであり、主に情報検索やトピック分析などの分野で用いられている。 tf-idfは、tf(英: Term Frequency、単語の出現頻度)とidf(英: Inverse Document Frequency、逆文書頻度)の二つの指標に基づいて計算される。

tf-idf - Wikipedia

Wikipediaだと少し難しい言葉でかいてあるので噛み砕いていくと、ある人のブログから重要度の高い言葉(特徴量)を抽出したいとする。
tfはある人のブログ内の言葉を分解し「頻度」を計算し、
idfはある人のブログ内の言葉がWikipediaの全ての言葉と比べた中での「希少性」を計算する。

どこの言葉と比較してidf(希少性)を計算するかは重要で、本来は他人を含めた全てのブログの言葉を使ったほうがいいと考えられるけど、今回はテストするので取れるデータということでWikipediaにしてある。
図にすると、

f:id:kzkohashi:20180721143506p:plain

こんな感じ・・・なのかな。今はこれくらいの理解にしておこう。
論よりなんたらっていうので、早速Pythonで試してみる。

下準備

自分のブログを元にやってみる。下準備が多めなので別の記事に書いた。

kzkohashi.hatenablog.com

kzkohashi.hatenablog.com

今回は、tf値を測るのを過去に書いた自分のブログをまずは分かち書きにする。

kzkohashi.hatenablog.com

mecab -d /usr/local/mecab/lib/mecab/dic/mecab-ipadic-neologd/ -Owakati blog.txt -o blog_wakati_neo.txt -b 16384

別記事にある wiki_wakati_neo.txtを使おうとしたが2000万行あって処理が遅すぎるのでとりあえず適当に100万行くらいにしておく。

head -n 1000000 wiki_wakati_neo.txt > wiki_wakati_neo_head.txt

wiki_wakati_neo_headと先ほど作った blog_wakati_neo.txtを使って色々計算してみる。

ブログのTF値を計算

Pythonもよくわからないのとコードは汚いのでそこはお気にせずに。。
TF値を計算するには、 sklearnにある CountVectorizerを使えばできるぽい

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.preprocessing import Normalizer
import numpy as np
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)


count_vectorizer = CountVectorizer(input='filename', token_pattern=u'(?u)\\b\\w+\\b')

CountVectorizerはデフォルトで一文字の物を消してしまうため、その対策でtoken_patten設定すると良いみたい。

bag_of_words = count_vectorizer.fit_transform(['../data/blog_wakati_neo.txt'])

fit_transformはBag of Words(単語の袋)と言われる、ある文章における単語の出現回数を表したものに変換する。
以下のように、すすも1回、も2回、もも2回...のように数えてくれる。

[~]mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

あとはソートして頻度順にだしたいなーと思って調べてみたらぴったりやりたいことをやってくれてる方がいたのでそちらのを真似させていただく。

medium.com

sum_words = tf.sum(axis=0)
words_freq = [(word, sum_words[0, idx]) for word, idx in count_vectorizer.vocabulary_.items()]
words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
words_freq

結果以下になるが、いろんな記事に書かれてたけど単語分割する前にノイズを除去しなきゃいけないと思わせるいい例になってしまった。
助詞などが多くなるのは当たり前か・・。名詞だけにしたいが、idfにおける希少性を利用するとこう行った一般用語は消えると思うので、このまま続けて見る。

[('た', 32),
 ('の', 27),
 ('に', 26),
 ('を', 19),
 ('と', 15),
 ('し', 13),
 ('て', 12),
 ('ない', 10),
 ('から', 10),
 ('な', 10),
 ('も', 8),
 ('こと', 8),
 ('サービス', 8),
 ('が', 6),
 ('は', 6),
省略

------追記------
よくよく計算式を確認したら、単語数数えるだけなのはTF値ではないので、単語ごとにカウントした値を文章全体の単語数で割る必要がある。
たとえば、文章全体の単語数が560で、「た」の場合、
32/560 = 0.05714285714
となる。
-------追記終わり----

ただ、以下のようにCountVectorizerを呼び出す際に低すぎる・高すぎる頻度の単語は除去できるっぽい。
全文章における出現割合なので、小数点になるのかな?

count_vectorizer = CountVectorizer(min_df=0.24, max_df=0.85, input='filename', token_pattern=u'(?u)\\b\\w+\\b')

TF-IDFの計算

TF-IDFの計算はTfidfVectorizerを使えば良い。

vectorizer = TfidfVectorizer(input='filename', token_pattern=u'(?u)\\b\\w+\\b', use_idf=True)
features = vectorizer.fit_transform(['../data/blog_wakati_neo.txt','../data/wiki_wakati_neo_head.txt'])
terms = vectorizer.get_feature_names()
tfidfs = features.toarray()
tfidfs

結果は以下のようにそれっぽさそうな数値になった。

array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
       [7.10477245e-03, 1.31955447e-03, 2.44020240e-03, ...,
        5.92487576e-06, 1.69282165e-06, 1.69282165e-06]])

実際に上位の10単語を抽出して見る。

def extract_feature_words(terms, tfidfs, i, n):
    tfidf_array = tfidfs[i]
    top_n_idx = tfidf_array.argsort()[-n:][::-1]
    words = [terms[idx] for idx in top_n_idx]
    return words

for x in  extract_feature_words(terms, tfidfs, 0, 10):
        print(x,)

結果はTF値と一緒になってしまった。。。fit_transformあたりでミスってしまったのだろうか・・。長くなりそうなので次回に持ち越し。

た
の
に
を
と
し
て
から
な
ない

終わりに

歯切れは若干わるかったが、理論を理解するという意味だと理解はできたかなと思う。
このままだと悔しいので、次回はTF-IDFの正確な値にチャレンジして見る。

Wikipediaからコーパスを作る

前回、文章を単語分割するためにMeCabをインストースルしたが、大元となるデータ(コーパス)も欲しい。Wikipediaでは全文データをダウンロードすることができるので、それを利用する方法について書いていきたいと思う。

kzkohashi.hatenablog.com

コーパスとは

Wikipediaからの引用によると、

コーパス(英: corpus)は、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。構造化し、言語的な情報(品詞、統語構造など)を付与している。言語学以外では「全集」を意味することもあり、言語学でも日本語を扱う場合には、「言語全集」「名詞全集」「動詞全集」などと呼ぶとよい[1]。コンピュータ利用が進み、電子化データとして提供している[2]。

引用: コーパス - Wikipedia

何を分析するかで変わるが、整形された元となるデータをコーパスというっぽい。

日本版Wikipediaのデータをダウンロード

Wikipediaクローラーしないで欲しい代わりに、以下のURLで全文データを提供している。

Index of /jawiki/

基本的に最新の方のデータが良いのでlatestディレクトリからダウンロードする。
今回使用するデータは本文データが欲しいので、そちらを使う。

 curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

ダウンロードしたデータはXML構造になっているため、XMLをパースするためのWikiextractorを利用する。(作成者様ありがとう)

github.com

git clone git@github.com:attardi/wikiextractor.git
python setup.py install
# ダウンロードしたファイルは人よって場所違うので注意
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

上記のコマンドを行うと、textディレクトリ配下にたくさんのデータがばらけてしまうため集約させておく。

find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'

これでWikipediaの本文データがwiki.txtに出力される。中身を少しだけ見ると

[data]head wiki.txt                                                                                              12:01:28  ☁  master ☂ ⚡
<doc id="3216890" url="https://ja.wikipedia.org/wiki?curid=3216890" title="2015年アムトラック脱線事故">
2015年アムトラック脱線事故

2015年アムトラック脱線事故(2015ねんアムトラックだっせんじこ)は、現地時間で2015512日夜にアメリカ合衆国ペンシルベニア州フィラデルフィ アの付近で、全米鉄道旅客公社(アムトラック)が運行するワシントンD.C.からニューヨークに向かう列車が脱線した鉄道事故である

事故当時、この列車にはおよそ240人が乗っていた。

2015512日の午後910分ごろ、アムトラック北東回廊を運行する北行きの「ノースイースト・リージョナル」 188(ユニオン駅 (ワシントンD.C.)発 ペンシルベニア駅 (ニューヨーク)行き)はフィラデルフィアの30丁目駅を発車した。列車は7両の客車を1年前製造のACS-64型電気機関車 (No. 601) がけん引するものであった。

約11分後、列車はから南東にある複々線の本線を走行しており、ポート・リッチモンド地区にあるフランクフォード・アベニューとウィートシーフ・レーンの交差点の近く、にある4度(半径約440m)の左カーブに進入した。

<doc>タグには記事のURLとタイトルがはいり、その下からは本文となっている。

MeCabを使って分かち書きを出力する

このままだと人間は単語と単語の違いを認識できるが、機械ではできないため単語に分割する。この時に、単語間を空白で区切ることを「分かち書き」という。

MeCabがまだの人はこちらでインスールのやり方を紹介している。 kzkohashi.hatenablog.com

さっそくMeCabを使って先ほどの「wiki.txt」を分かち書きする。

mecab -Owakati wiki.txt -o wiki_wakati.txt -b 16384

だいたい1時間かからずに終わる。
「-b」はメモリサイズを決めるオプションで、以下のようなエラーがでてしまったため付与してある。

input-buffer overflow. The line is split. use -b #SIZE option.

utf8対策やスペースがうまく区切られてないケースがあるらしいのでおまじないで以下のコマンドも打っておく。
nkfのインスールについては省略)

nkf -w --overwrite wiki_wakati.txt

結果はこんな感じ

[data]head wiki_wakati.txt                                                                                       12:01:31  ☁  master ☂ ⚡
< doc id =" 3216890 " url =" https :// ja . wikipedia . org / wiki ? curid = 3216890 " title =" 2015 年 アムトラック 脱線 事故 ">
2015 年 アムトラック 脱線 事故

2015 年 アムトラック 脱線 事故 ( 2015 ねん アムトラック だっ せんじ こ ) は 、 現地 時間 で 2015512 日 夜 に アメリカ合衆国 ペンシルベニア 州 フィラデルフィア の 付近 で 、 全米 鉄道 旅客 公社 ( アムトラック ) が 運行 する ワシントン D . C . から ニューヨーク に  向かう 列車 が 脱線 し た 鉄道 事故 で ある

事故 当時 、 この 列車 に は およそ 240 人 が 乗っ て い た 。

2015512 日 の 午後 910 分 ごろ 、 アムトラック 北東 回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 188 ( ユ ニオン 駅 ( ワシントン D . C .) 発 ペンシルベニア 駅 ( ニューヨーク ) 行き ) は フィラデルフィア の 30 丁目 駅 を 発車 し た 。 列車 は 7 両 の 客車 を 1 年 前 製造 の ACS - 64 型 電気 機関 車 ( No . 601 ) が けん引 する もの で あっ た 。

約 11 分 後 、 列車 は から 南東 に ある 複々線 の 本線 を 走行 し て おり 、 ポート ・ リッチモンド 地区 に ある フランク フォード ・ ア ベニュー と ウィートシーフ・レーン の 交差点 の 近く 、 に ある 4 度 ( 半径 約 440 m ) の 左 カーブ に 進入 し た 。

無事分かち書きできてるっぽい。ただ「現地時間」が「現地」と「時間」になっているなど、最新の単語に対応していないため比較用に「mecab-ipadic-NEologd」で分かち書きしたものも用意しておく。

mecab -d /usr/local/mecab/lib/mecab/dic/mecab-ipadic-neologd/ -Owakati wiki.txt -o wiki_wakati_neo.txt -b 16384
nkf -w --overwrite wiki_wakati_neo.txt

結果も見とく

[data]head wiki_wakati_neo.txt                                                                                   21:18:06  ☁  master ☂ ⚡
< doc id =" 3216890 " url =" https :// ja . wikipedia . org / wiki ? curid = 3216890 " title =" 2015年アムトラック脱線事故 ">
2015年アムトラック脱線事故

2015年アムトラック脱線事故 ( 2015 ねん アムトラック だっ せんじ こ ) は 、 現地時間 で 2015512日 夜 に アメリカ合衆国 ペンシルベニ ア州 フィラデルフィア の 付近 で 、 全米鉄道旅客公社 ( アムトラック ) が 運行 する ワシントンD.C. から ニューヨーク に 向かう 列車 が 脱線 し た 鉄道事故 で ある

事故 当時 、 この 列車 に は およそ 240人 が 乗っ て い た 。

2015512日 の 午後910分 ごろ 、 アムトラック 北東回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 188 ( ユニオン駅 ( ワシントンD.C. ) 発 ペンシルベニア 駅 ( ニューヨーク ) 行き ) は フィラデルフィア の 30 丁目 駅 を 発車 し た 。 列車 は 7 両 の 客車  を 1年前 製造 の ACS - 64 型 電気機関車 ( No. 601 ) が けん引 する もの で あっ た 。

約 11分 後 、 列車 は から 南東 に ある 複々線 の 本線 を 走行 し て おり 、 ポート ・ リッチモンド 地区 に ある フランクフォード ・ アベ ニュー と ウィートシーフ・レーン の 交差点 の 近く 、 に ある 4度 ( 半径 約 440m ) の 左 カーブ に 進入 し た 。

「2015年アムトラック脱線事故」は一つの固有名詞になってしまうのか・・・。正しい気はするが、利用方法によっては扱いづらくなりそう。「現地時間」はしっかりと「現地時間」と単語に分割されたのでこちらのほうがあってそうな感はある。

終わりに

MeCabのインストールとWikipediaからコーパスを生成することができたのでこれで下準備が整った。
次回はTF-IDFの説明でも書こう。

文章の単語分割を行うためにMeCabをインストールする

日本語の自然言語処理をやっていく上で、よく使われているであろうMeCabのインストールを行う。
そもそも前処理はなんぞやというと、いい例があったので引用させていただく。

f:id:kzkohashi:20180721212312p:plain 引用:自然言語処理における前処理の種類とその威力

初心者の自分にとってはこんなに前処理あったのか・・・と思いつつ、MeCabは「文章の単語分割」でよく使われている。
例えば以下のように、ある文章の内容を名詞/助詞/動詞などに分割してくれる。このようなことを「形態素解析」とも呼ぶ。

[~] mecab                                                                                                                                                                                                                                                                  
私は神になったかもしれない。
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
神 名詞,一般,*,*,*,*,神,カミ,カミ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ  動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
かも  助詞,副助詞,*,*,*,*,かも,カモ,カモ
しれ  動詞,自立,*,*,一段,未然形,しれる,シレ,シレ
ない  助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。 記号,句点,*,*,*,*,。,。,。
EOS

MeCabと辞書のインストール

以下のURLからソースのダウンロードをする。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

次に、ディレクトリの生成。

sudo mkdir /usr/local/mecab

MeCabのインストール。

cd $HOME/Downloads
tar xvfz mecab-0.996.tar.gz
cd mecab-0.996
./configure --enable-utf8-only --prefix=/usr/local/mecab
make
sudo make install

このままだと、名詞/助動詞などを判定するための「辞書」がないためそれもインストール。
MeCabと同じところにあるが、以下のURLから「IPA 辞書」をダウンロード。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

次にインストール。

cd $HOME/Downloads
tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --prefix=/usr/local/mecab --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8
make
sudo make install

パスを通す

export PATH=/usr/local/mecab/bin:$PATH

これでMeCabが使えるようになるのだが、シェルを再起動しなくてはいけない。毎回コマンド叩くのは面倒かと思うので、以下のようにエイリアスを貼っておくとパスを通すたびにすぐに行えるのでおすすめ。

alias relogin='exec $SHELL -l'

MeCabの実行と最新の辞書のインストール

インストールも終わったので、実際に実行してみる。

[~] relogin #もしまだやってなかったら
[~] mecab                                                                                                                                                                                                                                                                  
生まれ変わったらメロンパンになりたい。
生まれ変わっ  動詞,自立,*,*,五段・ラ行,連用タ接続,生まれ変わる,ウマレカワッ,ウマレカワッ
たら  助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
メロン   名詞,一般,*,*,*,*,メロン,メロン,メロン
パン  名詞,一般,*,*,*,*,パン,パン,パン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なり  動詞,自立,*,*,五段・ラ行,連用形,なる,ナリ,ナリ
たい  助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
。 記号,句点,*,*,*,*,。,。,。
EOS

無事にできた・・・と思いたいが、よみると「メロンパン」が「メロン」と「パン」に分割されてしまっている。これは、「IPA辞書」は詳しくはわからないが昔からある辞書で、最新の言葉に対応していないっぽい。
なので、最新の言葉に対応した辞書をインストールする。

mecab-ipadic-NEologdのインストール。

github.com

git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
./bin/install-mecab-ipadic-neologd -n

MeCabでに利用。

[~] mecab -d /usr/local/mecab/lib/mecab/dic/mecab-ipadic-neologd/                                                                                                                                                                                                          
生まれ変わったらメロンパンになりたい。
生まれ変わっ  動詞,自立,*,*,五段・ラ行,連用タ接続,生まれ変わる,ウマレカワッ,ウマレカワッ
たら  助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なり  動詞,自立,*,*,五段・ラ行,連用形,なる,ナリ,ナリ
たい  助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
。 記号,句点,*,*,*,*,。,。,。
EOS

無事「メロンパン」を正しく分割できたが、嬉しいことに更新頻度が半端ないので、ローカルと本番環境で扱う場合はバージョンの違いに気をつけないといけない。

f:id:kzkohashi:20180721215203p:plain

終わり

自然言語処理をするための一歩目として単語分割を行うためのMeCabをインスールした。次は元となるデータも手元においておいたほうがいいと思うので、Wikipediaの全文データを扱う方法について書こうと思う。

ブログが滞っていたことについての反省と2018年半期の振り返り

僕がブログを始めた理由は、去年の9月ごろカック(カカカック)氏と渋谷のゴールドラッシュでハンバーグを食べなら相談したところから始まる。
これがカック(カカカック)氏だ。

twitter.com

当時はまだ社員4人で、エンジニア一人というなかなか刺激的な会社に入って少し落ち着いた頃、エンジニアを増やすには技術的な広報も少しずつやらないとな・・・と思い、いろいろブランディングができてるイメージだったので相談しにいったという経緯がある。その時ブログメンターという言葉はなかったかもしれないが、「とりあえず技術ブログ書きなよ」の一言から、毎週競馬のムチで叩かれているような感じで半年以上続けてきた。
ブログ + LTをすることによって様々な方と知り合えたり、知見をいただけた。細かくよかったことについてはまた別途で。

本題に戻ると、ここ2ヶ月(そろそろ3ヶ月)ブログとLTが停滞しておりその原因がなんなのかといくつか考えた。

理由1: 会社の採用方針

数ヶ月続けていたが、採用に繋げられた例はまだないのとベトナムなどで採用チームを作っていこうとする方針(まだ検討中)もあって、最初のモチベーションの源泉が「採用するため」という気持ちが強かったための一度仕切り直しという風に考えてしまっていた。振り返るとブログを書くこと自体は「自分のため」になっていたため、「自分のためのブログ」というモチベーションの元、結果的に「採用につながった」があればいいだろうという考えに今はなっている。

理由2: 他の勉強での時間の問題

これはまだまだブログを公にだすことの「敷居」を考え過ぎている問題でもあるが、決算やビジネスモデルについて勉強しているのもあってそちらが楽しいというのもあるだろう。勉強会も週1で続けてきて、3ヶ月過ぎて余裕が出てきたので短い時間で敷居を考えずアウトプットしていこうと思う。

理由3: 家庭環境の変化

子供が生まれて1年経過し、妻も仕事に復帰した。妻は仕事も家事もしているのに自分はブログを書いているという気持ちが捨てきれず、それなら早く帰って家事を手伝った方が良いよねという感じなっていた。ただ、それも最近ペースがつかめてきたのと、お互いの自由の時間を取れる日を決めたのでほぼ解決したと思う。朝の時間と週末に少し時間作れれば大丈夫そう。

ということで、また続け流よう頑張りますという宣言。

ざっくりと半期の振り返り

kzkohashi.hatenablog.com

  • 最高のサービスを作る
    • セールスとのシナジーもでてきて、かなりよいサービスになってきた
    • 常に誰のための機能なんだろう、世界初なのか世界最高のサービスなのかを意識して作っている
  • スマートクリエイティブなエンジニアのチームを目指す
    • まだまだチームが作れてないので、これは残り半期の課題だ
  • Golangでサービス作る
    • 触ってすらいないです
    • 分析が強いサービスになってきたんで、使いタイミングを逃しているのかもしれない(言い訳)
  • ジム再開
    • 今は脂肪を貯める時期・・・、いやそろそろ頑張ります
  • 色々なコミュニティと関わりを持つ
    • LTやコミュニティに参加したので多少は色々と関わりは持ててきたと思う
    • でも全然足りないので、巻き返そう

付け加えてやりたいことを列挙しとこう

  • 決算勉強会やりたい
    • 初心者の時よりはかなり読めるようになったので公開したいな〜
  • 統計を深くやっていきたい(と今は自然言語

まとめ

頑張ろう。とりあえず週1のペースを戻す!

「フォロワーがどの雑誌に興味があるのか可視化してみる 」について発表した

昨日は「統計やらNight!!データマイニングMeet up #2」に参加して、発表してきた。
ウィルゲートさんの会場もとてもよく、雰囲気も懇親会の時間が多めなのもとてもよかった。

data-konekone.connpass.com

他の方々の発表はまだあげれないみたいなので、上げられたら追加する。

資料

フォロワーがどの雑誌に興味があるのか可視化してみる」というタイトルにした。統計には程遠い内容だけども、初心者ながらどういう風に分析っぽいことを行なっていくのかという過程を話せたと思う。色々課題はあるけど、jupyterで可視化しながら進めれたので、そっちもいい勉強になってよかった。

ついで

統計の勉強一緒にしてくれる人いたら連絡くだせい!

Think Stats(第2版)を読む:2章

前回の続き。

kzkohashi.hatenablog.com

2章: ヒストグラム

分析する上で、データ全体の傾向だったり、方針を決める際には必ずと言ってやると思われるデータの可視化。その中で、データの分布をみるためのヒストグラムについて書かれた章。

ヒストグラムの表現

オリジナルの関数を使って、簡単なヒストグラムを表現している。

f:id:kzkohashi:20180418202317p:plain

コードを読んで見ると、よく使われているmatplotlibで描画されている。

import matplotlib.pyplot as plt

...

plt.bar(xs, ys, **options)

少し味気ないので、最近知り合いが使っていたseabornを使って同じように描画して見る。

import seaborn as sns
import matplotlib
matplotlib.rcParams['font.family'] = 'AppleGothic'
%matplotlib inline
import matplotlib.pyplot as plt

plt.figure(figsize=(20,8))
g = sns.countplot(x=[1,2,2,3,5],order=[1,2,3,4,5])
g.set_xticklabels(g.get_xticklabels(), rotation=90)

こんな感じに綺麗な描画にできる。

f:id:kzkohashi:20180418202328p:plain

外れ値

データと見て行く際に、必ずと言っていいほど外れ値と呼ばれる他の値とは離れているものがある。まずは傾向を見るのが目的の場合は、こういうのを除外したりすることで分析をしやすくしたりする。 例えばこの例で見ると

f:id:kzkohashi:20180418202506j:plain

30週未満や50週以上あたりのデータは少しおかしいデータだったりする。どのように分析するかにもよるけど、基本的には分析しているドメイン領域の専門知識がないと判断しづらいため、自分で知識を深めるか知識がある人にこの値はどういう意味を何しているのかを答えてもらい、その上でそのデータを切るかの判断をするのがいいんじゃないかなと思う。

分布を要約する

何かと何かの値を比べる際に、標本のサイズなどを意識する必要がある。100人のデータと1000人のデータだと、当たり前だけど1000人のデータの方が値が大きくなったりする。
そういった調べたい分布を要約するときによく使われるのが以下である。

  • 中心傾向(central tendency)
    • あたいは特定の周りに集まっているか?
  • 最頻値(modes)
    • 塊は複数あるか?
  • 散らばり(spred)
    • あたいの変動はどの程度か?
  • 裾(tails)
    • 最頻値から離れると確率がどれくらい下がるか?
  • 外れ値(outliers)
    • 最頻値から離れた極値があるか?

これらの答える統計量は、要約統計量(記述統計量)と言われる。
一番よく使われるのは算術平均で、分布の中心傾向の記述をして用いられる。
meanaverageは日本語だと同じ意味だけど、わけて使われるのでメモっておく。

  • 標本の算術平均(mean)
  • 代表値(average)は中心傾向の記述に選ばれるようやく統計量のうちの一つ

参考

bellcurve.jp

分散

カボチャはばらつきが多いため算術平均に加え、分散を利用する。(カボチャの例は有名らしい) n-1で割るのは、標本を使って母集団の分散を推定する時に使う。 分散はある種の計算には使えるけど、要約統計量としては不敵な場合が多いため標準偏差を利用する。(平方週とかいう単位になってしまうため)

効果量

効果の大きさを記述する要約統計量。
例えば2グループの違いを記述するために平均の差を使うとか、そういうの。
ただ、グループ間の差をグループ全体の変動性と比較するやり方がある。それはコーエンのdと呼ばれる統計量だ。

わかったようなわかってないようなと思いつつ調べたら、みんな大好きTJO先生の記事。参考にしましょう。

tjo.hatenablog.com

結果のレポート

レポートする内容は、相手や目的にそってかわるよねという話。また、効果の重要さを強調するなら、差を強調する要約統計量を選んだり、ストーリーを明確に伝えるような統計報告と可視化を設計する。

要約統計量の選定やストーリーに関しては経験積まないとなぁと思う。以下の記事をトレースするのはよさそう。

www.analyze-world.com

感想

第一章よりは本格的に統計についての勉強に入り込んできたと思う。
演習問題も実践ぽくて、答えに困るけど面白い。別途自分なりに選んだデータで分析して見たい。