読書メモ『ハッカーと画家』ポール・グレアム

ハッカーと画家 コンピュータ時代の創造者たち
ポール グレアム
オーム社
売り上げランキング: 25,938

ポール・グレアムの『ハッカーと画家』を読みました。実は、邦訳が出たばかりの頃に書店で一度手に取っていたのですが、他の本を買って「また今度」と棚に戻してしまった記憶があります。川井さんのサイトで拾い読みしてはいたのですが、あー、もっと早く読んでおけば良かったと後悔。でも、本というのは、その人が欲しているタイミングになって初めて出会えるもの。たぶん、人と人との出会いもまた然り。


前置きが長くなりましたが、本の内容はというと、僕がここ最近ずっと考えていたことが書かれていました。
  • 最良のイントラネットは、インターネットだ。
  • 信頼できる、良いプログラマからなる小さなチームでのほうが、大企業での平凡なプログラマからなるチームよりもうまくいく。
  • 良いハッカーになる鍵は、たぶん、自分がやりたいことをやることだ。
  • 人材募集がいかにもITといった匂いを漂わせていればいるほど、その企業は脅威ではない。一番安全なのはOracleの経験者を募集しているところだ。また、JavaやC++プログラマを募集しているところも安全だ。もしPerlやPythonプログラマを募集していたら、ちょっと気を付けたほうがいい。その企業の、少なくとも技術部門は本物のハッカーがやっている可能性が高いからだ。
  • 難しいのは問題を解くことではなく、どの問題を解くかを決めることだ。

Life is very short, and there’s no time, for...

MeCabとPythonでマルコフ連鎖を書いてみる(改)

Python界でも自分で書いたプログラムを晒すとえらい人が添削してくれます、という仕組みはまだないですが、ちょうど時を同じくしてマルコフ連鎖のプログラムを書いている人がいました。

マルコフ連鎖プログラム - pyletの日記


なるほど、マルコフ辞書のキーはタプルにしたほうがスッキリしますね。こういうサンプルソースを公開してくれる人がいると勉強になるなぁ。ありがとうございます。> pyletさん
というわけで、 こないだのプログラム に手を入れてみました。だいぶスッキリしたみたい。これなら、連鎖数3にも5秒でできるよ。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import MeCab

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    filename = "test.txt"
    src = open(filename, "r").read()
    wordlist = wakati(src)

    # Create table of Markov Chain
    markov = {}
    w1 = ""
    w2 = ""
    for word in wordlist:
        if w1 and w2:
            if (w1, w2) not in markov:
                markov[(w1, w2)] = []
            markov[(w1, w2)].append(word)
        w1, w2 = w2, word

    # Generate Sentence
    count = 0
    sentence = ""
    w1, w2  = random.choice(markov.keys())
    while count < len(wordlist):
        tmp = random.choice(markov[(w1, w2)])
        sentence += tmp
        w1, w2 = w2, tmp
        count += 1

    print sentence

『プログラムは、人々がそれを読むために書かれるべきである。
たまたま、それが計算機で実行されるにすぎない。』 - Gerald Sussman

MeCabとPythonでマルコフ連鎖を書いてみる(連鎖数2)

PythonでMeCabを使ったわかち書きができるようになったので、マルコフ連鎖のプログラムを書いてみました。
MeCabとPythonで遊んでみたメモ(パパパパパイソン) に載っているものを参考に連鎖数を2に変更してみました。

パパパパパイソンさんのと同じ文章を元に自動生成した文章がこれです。やっぱり連鎖数1の時よりも、それらしい文章を出力してくれるようです。まぁ、意味が分からないのは一緒ですが。

それは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。掌の上で少し落ちついて書生の顔を見た。はここで始めて人間というものである。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。これが人間の飲む煙草というものである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この書生という人間中で一番獰悪な種族であったそうだ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした所でニャーニャー泣いていた事だけは記憶している。第一毛をもって装飾されべきはずの顔がつるつるしている。第一毛をもって装飾されべきはずの顔を見たのがいわゆる人間というものの見始であろう。

次に某芸能人のブログの文章を元にしたものがこれ。もともと意味分かんないから、本人が書いたと言われても分からない気がする…

ルナ溺愛する!前世から のデスティニー!チャットおもしれえ(゜∀゜)(゜∀゜)(゜∀゜)━━━━━━カワユス!キティマ ミタス!キティマミタスDSギザカワユス地球大図鑑いただいてしまった!うれしい(´;ω;`)なんかGJってコメントが沢山ですごいお(^ω^)セラムンコス貪欲にとりくんでプロクオリティめざしてるとこだお

ソース

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import random
import MeCab

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    filename = "test.txt"
    src = open(filename, "r").read()
    wordlist = wakati(src)

    # Create table of Markov Chain
    markov = {}
    prev1 = ""
    prev2 = ""
    for word in wordlist:
        if prev1 and prev2:
            if not markov.has_key(prev2):
                markov[prev2] = {}
            if not markov[prev2].has_key(prev1):
                markov[prev2][prev1] = []
            markov[prev2][prev1].append(word)
        prev2 = prev1
        prev1 = word

    # Generate Sentence
    count = 0
    prev2= random.choice(markov.keys())
    prev1 = random.choice(markov[prev2].keys())
    sentence = prev2 + prev1
    while count < 100:
        tmp = random.choice(markov[prev2][prev1])
        sentence += tmp
        prev2 = prev1
        prev1 = tmp
        count += 1

    print sentence

関連リンク:

改良版です → MeCabとPythonでマルコフ連鎖を書いてみる(改)

MecabのPythonバインディングを使ってみる

例によって、FedoraとCentOS用のPRMパッケージを作りました。利用するには、先に Mecabをインストール しておく必要があります。


インストールしたら、さっそく試してみましょう。次のようなサンプルプログラムを書きます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import MeCab

sentence = "太郎はこの本を二郎を見た女性に渡した。"

try:
    t = MeCab.Tagger()
    m = t.parseToNode(sentence)
    while m:
        if m.stat < 2:
            print m.surface, "\t", m.wcost, "\t", m.feature
        m = m.next
except RuntimeError, e:
    print "RuntimeError:", e;

実行すると、下記のような結果が出力されます。

太郎    7473    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      2919    助詞,係助詞,*,*,*,*,は,ハ,ワ
この    1017    連体詞,*,*,*,*,*,この,コノ,コノ
本      5040    名詞,一般,*,*,*,*,本,ホン,ホン
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二郎    5667    名詞,固有名詞,一般,*,*,*,二郎,ニロウ,ニロー
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      6208    動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    2278    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      3622    助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    5101    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      -12     記号,句点,*,*,*,*,。,。,。
ふむふむ、この結果から名詞だけを取り出して、単語生起コストをごにょごにょすればよいわけですね。
"二郎"が"ニロー"になってるけど、固有名詞だからしょうがないのかな…

Mecab 0.91のFedora用とCentOS用RPMを作った

Mecab 0.91がリリースされたようなのでRPMパッケージを作りました。辞書の文字コードは、UTF-8にしてあります。

[Fedora Core5用]

[CentOS4.3用]


使い方は、mecabコマンドを実行すると入力モードになるので、「すもももももももものうち」とか解析したい文章を入力すると 、わかち書きをして品詞の種類などを教えてくれます。

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