アヒル本でわかったこと、考えたこと。

ヒヨコ本ヒル本(Pythonエンジニアファーストブック)が最後まで終わりました。2017年はいっぱい技術書を買ったけれども、ほとんど積ん読になってしまっています。その中で、ヒヨコ本ヒル本は最後まで脱落せずに読破できたのは、いま自分に足りてないところがちょうどいいレベルで埋められたからなのかな。学んだことを振り返りつつ、今後はどっちに進んでいこうかなーと少し考えてみました。

gihyo.jp

(ずーっとヒヨコだと思っていたらアヒルだった...)

第1章 Pythonの動向 その特徴、歴史とコミュニティの紹介

オランダ人の気持ちが前よりちょっとわかった気になった。

  • Pyconと日本のコミュニティ

非技術職の自分にとって、エンジニアのコミュニティとかOSSマインドってのは昨年まで全然知らなかった世界で、今でもほんと興味深い。色々な人の色々なモチベーションが有機的にうまく絡み合っていいコミュニティが形成されていたり、そうでなかったり。自分のいまの技術力ではテイクするばかりだけれど、そのうちにはギブしてコミュニティに恩返しすることが何かできればいいな。

第2章 最低限知っておきたいPython言語の基本

ここは省略。最低限知っておきたい基本はすでに知っていたようでよかった。

第3章 開発環境とチーム開発

Gitが使えるようになって、ファイル名の後ろに日付けを入れて名前をつけて保存というローテクなヴァージョン管理から進化することができた。チームじゃなくてもGit重要。GitHubも作った! github.com

  • venv

最初の頃は、仮想環境は個人開発だしいらないわー。そんな高レベルなことしてないし。と思ってグローバルにがんがんインストールしてたところ、pythonを3.5から3.6に上げた時に見事に動かなくなった。それからちゃんと仮想環境使っている。仮想環境って名前はいかつくて難しそうだけれど、そんな難しくなかった。もっと早く使って入ればよかった。 動かなくなった原因はなんだったか結局わからないし別にあったのかもしれない。でも、初心者でもちゃんとvenv使っていると、動かなくなった原因がちょっと前にインストールしたものなのか、それ以外なのかがわかるので、詰みにくいと思う。

SphinxってなんでSphinxって名前なのかなーとなんとなく疑問に思っていた。Python的な要素ないし。この章で、そうか、PyramidだからSphinxなのね!!と気づいてすごいうれしかった。

  • PyCharm

Pycharmは半年くらい頑張って使っていたけれど、自分には機能が多すぎてつらかったので、今はAtom使ってる。

第4章 スクレイピング

  • Scrapy

Scrapy、超便利。ヒヨコ本の内容と、Qiitaあたりでちょこっと調べただけで使えるようになった。丸々一冊スクレイピングの本も前に買っていたけれど、スクレイピングなんてスクレイピングできれば十分なのだ。

mizuecastella.hatenablog.com

第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

チュートリアル

github.com

この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

参考

O'Reilly Japan - word2vecによる自然言語処理

深層学習による自然言語処理 | 書籍情報 | 株式会社 講談社サイエンティフィク

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割くらいカバーしててすごい。

www.amazon.co.jp

仮想環境とインストール

趣味で自然言語処理してるだけなので、以前は仮想環境いらないっておもってた。でも、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