アヒル本でわかったこと、考えたこと。
ヒヨコ本アヒル本(Pythonエンジニアファーストブック)が最後まで終わりました。2017年はいっぱい技術書を買ったけれども、ほとんど積ん読になってしまっています。その中で、ヒヨコ本アヒル本は最後まで脱落せずに読破できたのは、いま自分に足りてないところがちょうどいいレベルで埋められたからなのかな。学んだことを振り返りつつ、今後はどっちに進んでいこうかなーと少し考えてみました。
(ずーっとヒヨコだと思っていたらアヒルだった...)
第1章 Pythonの動向 その特徴、歴史とコミュニティの紹介
- Zen of Python
オランダ人の気持ちが前よりちょっとわかった気になった。
- Pyconと日本のコミュニティ
非技術職の自分にとって、エンジニアのコミュニティとかOSSマインドってのは昨年まで全然知らなかった世界で、今でもほんと興味深い。色々な人の色々なモチベーションが有機的にうまく絡み合っていいコミュニティが形成されていたり、そうでなかったり。自分のいまの技術力ではテイクするばかりだけれど、そのうちにはギブしてコミュニティに恩返しすることが何かできればいいな。
第2章 最低限知っておきたいPython言語の基本
ここは省略。最低限知っておきたい基本はすでに知っていたようでよかった。
第3章 開発環境とチーム開発
- GitとGitHub
Gitが使えるようになって、ファイル名の後ろに日付けを入れて名前をつけて保存
というローテクなヴァージョン管理から進化することができた。チームじゃなくてもGit重要。GitHubも作った!
github.com
- venv
最初の頃は、仮想環境は個人開発だしいらないわー。そんな高レベルなことしてないし。と思ってグローバルにがんがんインストールしてたところ、pythonを3.5から3.6に上げた時に見事に動かなくなった。それからちゃんと仮想環境使っている。仮想環境って名前はいかつくて難しそうだけれど、そんな難しくなかった。もっと早く使って入ればよかった。 動かなくなった原因はなんだったか結局わからないし別にあったのかもしれない。でも、初心者でもちゃんとvenv使っていると、動かなくなった原因がちょっと前にインストールしたものなのか、それ以外なのかがわかるので、詰みにくいと思う。
SphinxってなんでSphinxって名前なのかなーとなんとなく疑問に思っていた。Python的な要素ないし。この章で、そうか、PyramidだからSphinxなのね!!と気づいてすごいうれしかった。
- PyCharm
Pycharmは半年くらい頑張って使っていたけれど、自分には機能が多すぎてつらかったので、今はAtom使ってる。
第4章 スクレイピング
- Scrapy
Scrapy、超便利。ヒヨコ本の内容と、Qiitaあたりでちょこっと調べただけで使えるようになった。丸々一冊スクレイピングの本も前に買っていたけれど、スクレイピングなんてスクレイピングできれば十分なのだ。
第5章 PyData入門ガイド
- Jupyter notebook
自然言語処理始めたころ、csvが大きすぎてExcelで開けなくてつらかったので、いま思えばJupyter notebook知っていたらよかった。いま思えば、仕事でExcelでゴリゴリ関数書いていた頃、Jupyter notebook知っていたらよかった。ExcelやめてJupyter notebookにしたら幸せになる人がきっといっぱいいると思う。
- Matplotlib
Matplotlibってなんかグラフのビジュアルしょぼいよなー。種類も少ないし。D3.jsくらい欲しいなー。と思ってたけれど、自分でやってみたら十分きれいに見えた。Data visualizationってのは、自分で手を動かすと、うまく表示できたって達成感がプラスされるので綺麗に見えるんでしょうか。不思議。
- Data Visualization
Data visualizationはきれいだし、ワクワクするし、思い入れもあるので、これからはこっちを頑張って勉強していきたい気持ちがある。ただのツールの使い方ってことではなくて。Data vizは見えていないものを見つけだして、わかりやすく人に伝えられて、人を動かす力があると信じている。自分はたぶん、観察能力とか分析能力は平均より優れているんだろうけれど、特にオーラルでの言語コミュニケーションが苦手なので、Data visualizationに惹かれるのかと思う。
第6章 Webアプリケーション開発
Django。恥ずかしながら、この章の途中まで、Djangoってウェブサイト作るホームページビルダーみたいなもんだって思ってた。admin
とかsuperuser
とかでてきて、あれ、管理者と一般ユーザーが最初からいるのが前提なんだ??って考えてたら、職業エンジニアの人たちがDjangoを使って何をしているかがちょっとだけわかった。
思えば、自分はpythonを使って、自分がアナログでやるにはちょっと面倒な作業を代わりにやらせる、って視点でしかなかったんだな。洒落自動生成も辞書めくるのが面倒なのでPythonにやらせているだけだし、あとは仕事でしょうもない単純作業をこっそり自動化したり。
ユーザーにサービスを提供する、ってところまで考えると、Djangoはとっても難しい。もう少し深くやってみたい気もする。趣味で細々やっているだけだと到底使いものにならないだろうけれど、Webアプリケーションの設計思想的な?ものはおもしろそう。
word2vecはじめました。
はじめに
趣味の開発にword2vecが使えそうなので、word2vecチュートリアル行ってきた。これです。
Python+Janome+gensim で学ぶ自然言語処理入門 - connpass
環境構築
Mac新しくしたので、janome、gensim、scikit-learn、その他もろもろをまずインストール。
仮想環境作る
$ python3.6 -m venv nlp
$ source nlp/bin/activate
pipのアップグレード
$ python -m pip install --upgrade pip
janomeのインストール
いままでMeCab使っていたけれど、janome入れてみた。MeCabがパフォーマンスが良いのだけれど、インストールで詰みがちでつらい。janomeなら
$ pip install janome
で簡単にインストールできちゃうし、何よりもpythonなので読みやすい。機械学習はMeCabがよいのだろうけれど、ちょっと分ち書きしたい程度だったらjanomeの方が使いやすい。もっと早く入れておけばよかった!
gensimのインストール
https://radimrehurek.com/gensim/install.html
$ pip install --upgrade gensim
Spicy stackのインストール
Scipy.orgで"Scipy stack" のインストールを推奨してたので、以下をまとめてインストール。 https://www.scipy.org/install.html
$ pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
Scikit-learnのインストール
http://scikit-learn.org/stable/install.html
$ pip install -U scikit-learn
Jupyter notebookのインストール
http://jupyter.org/install.html
$ python3 -m pip install jupyter
チュートリアル
このjupyter notebookのLevel 1 - 3 やった。
というか、Shift + Enterを叩いただけだった・・・。まぁ、2時間のチュートリアルってそうなるよね。
TFIDF
TFIDF = 特徴語抽出の手法 TF * IDF
TF: ある単語がその文で何回出てきたか
IDF: log( ( 全体の文書数 + 1 ) / ( ある単語の含まれる文書数 + 1 ) )
word2vec
word2vecはあまり収穫なかった。tensorflowのページとMikorovさんの論文読むのつらいから、おかねで解決しようとチュートリアルに参加してみたけれど、あきらめてちゃんと自分で勉強しようという気持ちになることができたのが収穫、かな。。。
Vector Representations of Words | TensorFlow
参考
Scrapyで辞書をスクレイピングしてみた
はじめに
趣味でやってる自然言語処理で、勉強したこととか、進捗があったところとか、メモに残しておくためにブログ始めてみた。内容はしょぼいし説明も足りないと思うけど、公開しておいてひょっとして誰かの役に立ったらいいな。
スクレイピングの目的
機械学習の学習用データです。weblioはことわざだけでなくて、「成句」として、故事成句、ことわざ、慣用句などなどが揃っているので素晴らしいです。三省堂さん、ありがとうございます。
http://www.weblio.jp/robots.txt はこうなってます。和英・英和辞書はダメみたい。
User-agent: *
Disallow: /ejje/content/
Disallow: /feedback/
Disallow: /postal/content/
Disallow: /shuwa/content/
Disallow: /thesaurus/content/
Disallow: /cjjc/content/
Scrapyの底本
Pythonエンジニアファーストブック見ながらやったらだいたいできた。スクレイピング専門の本とかもあるのに、たった30ページくらいで必要なこと9割くらいカバーしててすごい。
仮想環境とインストール
趣味で自然言語処理してるだけなので、以前は仮想環境いらないっておもってた。でも、pythonのversion上げた時に今まで作ってたプログラムが動かなくなってから、使うようにしている。特に、自分みたいに何が起きているか分析できない弱者は、バグの可能性を減らせるので安心。scrp
って仮想環境に、beautiful soupとかscrapyとか入れている。
最初から仮想環境作る場合のコマンドはこれ。
$ python3.6 -m venv scrp
$ scrp/bin/activate
(scrp) pip install scrape
SHELLの使い方
shellでうまく取り出せるか試してみる。
http://www.weblio.jp/phrase/ことわざ_1 のページから、子カテゴリーのURLを取得する場合はこんな感じ。
$ scrape shell http://www.weblio.jp/phrase/ことわざ_1
>>> response.css('div.subCatChildNxt a::attr("href")').extract()
プロジェクトの作成
(scrp) $ scrappy startproject weblio_scraper
プロジェクトが作成されたら、settings.py
を編集する。インターバル秒を設定して、キャッシュを有効にする。この後、spiderがうまく動いてくれなくて何十回と同じところをスクレイピングしていたけれど、キャッシュがあればすぐ処理終わって(うまくいかなかったという)結果がすぐわかる。
DOWNLOAD_DELAY = 3:
HTTPCACHE_ENABLED = True
Spiderを作る
まず、Spiderを作成。
$ cd weblio_scraper
$ scrappy genspider
スクレイピングしたいページがtree状のリンクを辿らなければならないので、3日くらいあれやこれや戦ってた。 http://www.weblio.jp/phrase/ことわざ_1 のページはこんな構造。
ことわざ top page
├── 藁で束ねても男は男──ことわざの意味
├── 色男金と力は無かりけり──ことわざの意味
├── 男子家を出れば七人の敵あり──ことわざの意味
├── 据え膳食わぬは男の恥──ことわざの意味
├── 男は閾を跨げば七人の敵あり──ことわざの意味
├── 「男」のことわざ一覧
│ ├── 藁で束ねても男は男──ことわざの意味
│ ├── 色男金と力は無かりけり──ことわざの意味
│ ├── 男子家を出れば七人の敵あり──ことわざの意味
│ ├── 据え膳食わぬは男の恥──ことわざの意味
│ ├── 男は閾を跨げば七人の敵あり──ことわざの意味
│ ├── 男子の一言金鉄の如し──ことわざの意味
│ ├── ...
│ └── 英雄色を好む──ことわざの意味
├── 七人の子は生すとも女に心許すな──ことわざの意味
├── 大蛇を見るとも女を見るな──ことわざの意味
├── 女の一念岩をも通す──ことわざの意味
├── 女の足駄にて造れる笛には秋の鹿寄る──ことわざの意味
├── 女氏無くして玉の輿に乗る──ことわざの意味
├── 「女」のことわざ一覧
│ ├── 七人の子は生すとも女に心 許すな──ことわざの意味
│ ├── 大蛇を見るとも女を見るな──ことわざの意味
│ ├── ...
うまく、親カテゴリ→子カテゴリ→ことわざの意味、とSpiderが移動してくれなくて苦労した。
結局、shellでchild categoryのURLを取得して、start_urls
に入れることで解決。top pageとchild categoryで重複してスクレイピングしちゃうかと思ったけど、同じURLはスクレイピングしないようにできているみたい。
# -*- coding: utf-8 -*-
import scrapy
class WeblioSpider(scrapy.Spider):
name = 'weblio_spider'
allowed_domains = ['www.weblio.jp']
# 故事成語、ことわざ、慣用句のどれかのトップページのURLと、
# Child categoryのURL合わせてstart_urlsにする。とりあえず3つ載せてます。
start_urls = ['http://www.weblio.jp/phrase/%E6%95%85%E4%BA%8B%E6%88%90%E8%AA%9E_1',
'http://www.weblio.jp/phrase/%E9%B3%A5_1',
'http://www.weblio.jp/phrase/%E7%83%8F%28%E3%81%8B%E3%82%89%E3%81%99%29_1'
]
def parse(self, response):
metas = response.css('meta').extract()
yield {
'description': metas[1]
}
urls = response.css('div.subCatWordsB a::attr("href")').extract()
counts = 0
next_url = urls[ counts ]
while next_url: # 各フレーズのデータをscrapingする。
yield scrapy.Request(next_url)
counts += 1
next_url = urls[ counts ]
metas = response.css('meta').extract()
yield {
'description': metas[1]
}
Spiderの実行
準備ができたらSpiderを実行。
$ scrappy crawl weblio_spider -o kotozaka.json