Pythonと数学と音楽とetcの落書き帳

かなりテキトーに、断片的に離散的にプログラミングや、音楽やいろいろなことを書いていく。洋楽のレビューのついでにPythonその他のブログや本のノート、備忘録を書いていきます。

自然言語処理100本ノック!!(10~19)をただ動かして感想を述べる。

最近週刊スピリッツで連載中のジャガーンという漫画にハマっています。

ジャガーン 1巻 :無料・試し読みも!コミック 漫画(まんが)・電子書籍のコミックシーモア

 

東京グールや、寄生獣と同じダークファンタジーに入る(と思われる)作品で、グロ、エロ、ラブロマンス、正義や芸術といった哲学主張が詰まっている作品で、やっぱ僕はこういうのが好きなんだなと

グロ描写で人間の生と死を身近に感じ、エロ描写で人間の本能とか、欲とかを認識して、ラブロマンスや、哲学的描写で人間の正義とかきれいごととかそういうものに浸る快楽とかも認識できる良い作品だと思います。

 

僕はやっぱり男の子でかっこいいもの好きなのと、動物としての人間らしさが描かれいるものがとても好きです。

 

そう、人間にはやはりエロを求めるところや、過度に自分が関わる汚いものから目をそむけ、きれいごとにいきるところとか、そういうとこから目をそむけず考えていくのって大事なんだなって(もう言葉がぐちゃぐちゃですが、)

 

ドラゴン桜の国語の芥川先生も言っていましたが、人間は毒を求めるし、それが人間なのだって感じですね。

 

僕が営業といか部活とかやってた経験上、自分の毒々しい部分、人間らしい性欲とか弱さを人に見せない人ほど、何かちょっと信用できない、壊れやすい人な気もします。(僕自身もきれいきれいな言葉、哲学とかばかりの生き方に長い間身を焦がした人間として)

 

人間って面白いですよね。機械学習の勉強はそういったことと関わりが深いところもあり、勉強するモチベーションの一つにもなります。

 

学問の最終ゴールは人間の再現って友達が言ってたな、とか思い出しつつ、

今日は人間の言語の解析の勉強をしていきます。

自然言語処理の勉強をしていきまし。

旅行でできなかったトレーニングを午後にあるミーティングの前にしたいので、時間を2時間半と決めて、やっていきます。

 

 

今日聞く音楽

今日も例のごとく、The Chain Smorkersを聴いていきます。

Chain Smorkersいいですね。なんか他のEDM(僕がEDMと認識してるのは、The Chemical Brothersとか、Avicciとか、Zeddとか、)と違ってちょっとエモいというか、(落合先生がエモいってよくTwitterで使うのでなんとなくエモいって言ったけどよく意味がわからないまま使う)

上品な感じがとても良いです。

今日聞くのは、僕が思うThe Chain Smorkersのエモい曲


The Chainsmokers - Honest (Audio)


The Chainsmokers – Paris (Lyrics)


The Chainsmokers - Young (Audio)

このジャケット?グラフィックもどことなく温かみというか、落合先生が表現していたぼんやりとくっきりという日本人的感性に近いというかそんな感じがしますね。

今日の勉強主題

今日もバイト先は一人でガリガリ勉強できそうな朝なので、

www.cl.ecei.tohoku.ac.jp

三年前のものですが、こちらをガリガリとやっていきたいと思います。

環境としては

Python 3.6.3, Jupyter notebook, Windows10 Bash on Ubuntu

で0番から順に解いていきます。

 

 Markdown記法にしてコピペすればipynbファイル貼れるみたいなんですが、書いてから気づいて記法の変更ができないので、次のポストでJupyter notebookをはてなブログに載せる方法を調べます。

100本ノックの0~9までの準備運動は既にやっていたので次のポストでそれをはてなブログに乗せます。(多分そこだけは独力で解いたから著作権的にもNo Problemなはず。)

 ここでは、10~下記サイトを読みながら、Importantなところ(よくわかんなかったところ、参考サイト)だけ書いていきます。

素人の言語処理100本ノック:まとめ - Qiita

この人は全部独力でやって8ヶ月で解き切ったらしいけど、僕はまあ全体の概要なめなめして、使う時に理解に労力さけばいいっていうスタンスで、ほぼコピペで検証して、動くか動かないか、動かなかったらどういうものをして動くか、てことに重点を置いていきます。

 

10:テキストファイルの行数カウント

・概要

なんかPythonでやったのと、Bash on ubuntuのwcコマンドでやったのおんなじ行数にならねえ。encodingを指定する必要があった。

・参考

素人の言語処理100本ノック:10 - Qiita

ファイル読み書き | Python-izm

 

11:タブをスペースに置換

・概要

Python .replace(x,y)メソッド(xをyに置換)

Ubuntu tr expand sedコマンドを使う

・よくわからなかった

UNIXコマンドラインの計算のところで正規表現の理解が必要になりそうだけど、この先で詳しく触れそうなので今のところ放置

・参考

素人の言語処理100本ノック:11 - Qiita

 

 

12:1行目をcol1.txt 2行目をcol2.txt

・概要

Python: with openでテキストを開く、新規に作って、Read とWrite

Ubuntu:cut > でt食って、 diffで2つのファイルの差を確認してくれう

参考サイドの全Pythonコードに僕のPC(Windows10)だとencodingでutf-8を指定しないとテキストファイルopenできなかった

(ちなみに元のテキストファイルが文字化けしているので僕はコマンドの検証は文字化けしたまま行っています(クソ)

・よくわからなかった

cut コマンドと diffコマンドの詳細は不明

--fieldsでテキストファイルの列()columを指定って感じかな

・参考

素人の言語処理100本ノック:12 - Qiita

 

13:12の2つをMerge

・概要

Python:上記と同じ、テキスト参照とファイル作成して、

空白(Space)削除、\t(タブ)挿入してマージ

Ubuntu:pasteコマンドで2つのテキストファイルのMerge、diffでCheck

・よくわからなかった

参考サイトにはPthonのスペース、タブ、改行などの文字コード、文字列リテラル("\t","\n",etc)のことが詳細書いてあるけど、C言語のprintfの中にあるやつと同じ感じだろうで放置

・参考

素人の言語処理100本ノック:13 - Qiita

 

14:先頭N行を出力する(NはInput)

・概要

Python:inputをnにSubstractして、iをダミーにforループ、i ==nになったらBreak

Ubuntu:参考サイトはシェルスクリプトを使って、echo readでインプットを受け取ってる。

僕はシェルスクリプトを作るのが面倒なので(えぇ)普通にbash

read n
head --lines=$n hightemp.txt

 

で先頭n行カット、出力成功を確認。

・よくわからなかった

せめてシェルスクリプトくらい作りたいけど、vimがバグってる+vimの使い方わからない。emacsを使う手もありが、インストールしてないし今のところはそこまで優先順位を感じないので放置

・参考

素人の言語処理100本ノック:14 - Qiita

 

15:末尾N行の出力

・概要

Python: readlinesで各行をリスト化して、スライスで-nを使って末尾から取得、forループで出力

Ubuntu:tailコマンドで14と同様、readした後出力

・よくわからなかった

14と同じ感じ

・参考

素人の言語処理100本ノック:15 - Qiita

 

16:ファイルのN等分

・概要

Python:rangeを上手く使って、分割の数だけ新規ファイルをopenで作成、書き込み、

Ubuntu:if then文などが出てきたのでBash上だけでできない。(と思った。)

・よくわからなかった

シェルスクリプト書ける環境は作ろうかー。

・参考

素人の言語処理100本ノック:16 - Qiita

 

17:1列目の文字列の種類を出力

・概要

Python:set()で集合型を使うことによって、要素の重複をキャンセル

要素の追加はaddで、forループで回して行う。

Ubuntu:cutコマンドで、先頭columnを抽出、ソート、重複除外

上記のプログラムをpyファイルに保存して、それもbashで動かして、新しいテキストに出力を保存

diffで比較

cut --fields=1 hightemp.txt | sort | uniq > result_test.txt
python3 main.py | sort > result.txt
diff --report-identical-files result.txt result_test.txt

Files result.txt and result_test.txt are identical

って初めて言ってくれた。

・よくわからなかった

bashコマンドのsort uniqの使い方の詳細は放置

・参考

素人の言語処理100本ノック:17 - Qiita

 

18:各業を3列目の数値の降順でソート

・概要

Python:lines = open(fname,encoding = "utf-8").readlines()と、エンコード方式を指定する必要があった、modeは、rにすると動かなかったが原因は不明。

Python リストの.sort()メソッドで2番目の値を降順reverse=Trueで

Ubuntu:

sort hightemp.txt --key=3,3 --numeric-sort --reverse > result_test.txt
python3 main.py > result.txt
diff --report-identical-files result.txt result_test.txt

 No newline at end of fileと出力されたが、他は一致してる。

・よくわからなかった

・参考

素人の言語処理100本ノック:18 - Qiita

 

19:1列目の文字列の出現頻度の降順でソート、出現頻度も出力する。

・概要

Python:18同様encodingの調整で動いた。

sort()引数なしで、0カラム(名前)の重複でソートして、

itertoolsのgroupbyでカウント、[("NAME",count)....]て感じのタプルのリストで出力してくれるので、再度sort()でindex[1]の要素(count)の降順でソート

出力

Ubuntu:

cut --fields=1 hightemp.txt | sort | uniq --count | sort --reverse

・よくわからなかった

・参考

素人の言語処理100本ノック:19 - Qiita

 

完走した感想

とりあえず思考停止で動いて、ロジックの理解に努めた。

まあ、こんなツールもあるんだなって感じ、必要になった時に、過去のポストを見て、参照して使えるようにブログでまとめとけばいっかーって感じ。

引き続きノックを進めて、自然言語処理Userになるぞー!

参考

言語処理100本ノック 2015

はてなブログに Jupyter notebook を載せるテスト - バイオ系だけどプログラミング始めました

素人の言語処理100本ノック:まとめ - Qiita