2013-12-01

入門自然言語処理(オライリー)の演習問題 解答Part1 [第2章1〜]

入門自然言語処理の演習問題を解くシリーズ。

入門 自然言語処理

【第1問】

単語のリストを含んだ変数を作成しよう。その変数に対し、加算、乗算、添字、スライス表記、ソートを試してみよう。

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

def main():    
    words = ['apple', 'orange', 'banana']
    print words + ['grape']
    print words * 3
    print words[2]
    print words[:2]
    print sorted(words)

if __name__ == '__main__':
    main()

【第2問】

corpusモジュールを利用して、austen-persuasion.txtを調べてみよう。単語トークンはいくつかるか。また異なり語はいくつかるか。

単語トークンは98,171。異なり語は6,132。

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

import nltk

def main():
    #print nltk.corpus.gutenberg.fileids()
    persuasion = nltk.corpus.gutenberg.words('austen-persuasion.txt')
    print len(persuasion)
    print len(set(persuasion))

if __name__ == '__main__':
    main()

【第3問】

NLTKのブラウンコーパスリーダーnltk.corpus.brown.words()とウェブテキストコーパスリーダーnltk.corpus.webtext.words()を利用して2つの異なるジャンルのテキストにいくつかアクセスしよう。

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

import nltk

def main():
    #print nltk.corpus.brown.categories()
    print nltk.corpus.brown.words(categories='news')

    #print nltk.corpus.webtext.fileids()
    print nltk.corpus.webtext.words(fileids='firefox.txt')

if __name__ == '__main__':
    main()

【第4問】

state_unionコーパスリーダーを用いてState of Union addressesのテキストを読み込もう。各ドキュメントについて、men、women、peopleの出現回数を数えよう。それらの単語の使われ方について、時代とともに変化があったかどうかを調べてみよう。

各ドキュメント内のmen, women, peopleの出現回数を出力。

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

import nltk

def main():
    for file in nltk.corpus.state_union.fileids():
        words = [w.lower() for w in nltk.corpus.state_union.words(fileids=file)]
        freq = nltk.FreqDist(words)
        print '【' + file + '】'
        print 'men=%s, women=%s, people=%s' % (freq['men'],
                                               freq['women'],
                                               freq['people'])

if __name__ == '__main__':
    main()

時代とともに変化があったかどうかを調べるためにグラフにする。

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

import nltk

def main():
    cfd = nltk.ConditionalFreqDist(
        (target, file[:4])
        for file in nltk.corpus.state_union.fileids()
        for w in nltk.corpus.state_union.words(file)
        for target in ['men', 'women', 'people']
        if w.lower().startswith(target))
    print cfd.plot()

if __name__ == '__main__':
    main()

このようなグラフが表示される。

【第5問】

いくつかの名詞について、ホロニムとメロニムの関係について調べる。ホロニムとメロニムの関係には3種類あるので、member_meronyms()、part_meronyms()、substance_meronyms()、member_holonyms()、part_holonyms()、substance_holonyms()を使う必要がある。

humanでやってみた。

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

from nltk.corpus import wordnet as wn

def main():
    for synset in wn.synsets('human', wn.NOUN):
        print synset.name + ':', synset.definition
    print wn.synset('human.n.01').member_meronyms()
    print wn.synset('human.n.01').part_meronyms()
    print wn.synset('human.n.01').substance_meronyms()
    print wn.synset('human.n.01').member_holonyms()
    print wn.synset('human.n.01').part_holonyms()
    print wn.synset('human.n.01').substance_holonyms()

if __name__ == '__main__':
    main()

2013-09-27

投資リターンとインフレの関係

みんなインフレ率って気にしていますか?インフレって僕らのお金をどんどん吸い取っていく危険な怪物なんですよ。

とりわけ投資などに興味を持っていない人に多いのですが、インフレ率というのを気にしていない人がほんとに多いです。これって将来にわたって自分の資産形成を考える上でものすごく危険な事です。

投資とか経済の初歩的な本を読めば必ず書いてある事で、初めて知った時には目からウロコが落ちる感覚になって、勉強して良かったと感じる事ができるテーマの1つです。

株式投資とかFXの本とかって薄っぺらいアホみたいな本が多いけど、多くの人から長年高い評価を得ている投資の本というのはやっぱり読むべきだと思います。

例えば、ベンジャミン・グレアムの賢明なる投資家ですよね。これは真剣に投資をしようと考えている人にとっては必読の本です。

ベンジャミン・グレアムという人を知らない人でも、投資の神様であるウォーレン・バフェットの師匠だと言えば、すぐに理解できるでしょう。

ベンジャミン・グレアムは、あのバークシャーハサウェイを率いるウォーレン・バフェットの先生なんですよ。そんな凄い人が書いた真面目な投資の本を読まないなんてもったいないですよ。

新賢明なる投資家 上~割安株の見つけ方とバリュー投資を成功させる方法~《改訂版――現代に合わせた注解付き》

新賢明なる投資家 上~割安株の見つけ方とバリュー投資を成功させる方法~《改訂版――現代に合わせた注解付き》

この賢明なる投資家に、投資の事なんて全く知らない素人でもすぐに理解できるインフレの問題が書いてあったので紹介します。

心理学の世界では「貨幣錯覚(money illusion)」と呼ぶらしいのですが、以下の2つのうちあなたはどちらを好みますか?

  1. 物価が4%上昇した時(インフレ率4%)に、給料が2%アップした。
  2. 物価の変動が全く無かった時(インフレ率0%)に、自分の給料が2%カットされた。

さて、どうでしょうか?

おそらく、ほとんどの人が1番目を好み、2番目を嫌だと感じるでしょう。

でも、これって実は実質的には全く同じなのです。

数字の大きさや単位は現実的ではないですが、分かりやすく説明します。

もし、あたなの月収が1,000円だとします。そしてパン1個の値段が100円だとします。

この場合、あなたはパンを10個買う事ができます。

では、あなたの月収が10%アップして、インフレ率が20%になった場合、パンを何個買えるでしょうか?

あなたの月収が10%アップしたので、月収は1,100円になります。他方でインフレ率が20%なのでパンの値段は120円になります。

すると、1,00÷120=9.16という事で、パンは9個買える事になります。

次に、あなたの給料が10%削減されて、インフレ率が0%だったとします。

あなたの月収は900円になり、パンの値段は100円のままです。

900÷100=9という事で、さきほどと同じくパンは9個買えるという計算になります。

自分の給料が上がると何となく得して資産が増えたような気分になるのですが、実はそれ以上にインフレ率が上昇すると、実質的には給料が減っているのです。

見た目の数字だけ見ると自分のお金が増えたように感じるのですが、お金の本質であるモノやサービスの交換価値という面から考えると自分の財産は減っているのです。

このように錯覚してしまうので、「貨幣錯覚(money illusion)」と呼ばれているのでしょうね。

したがって、自分の老後に向けて投資で確実に資産を増やしていこうと思うと、最低でもインフレ率以上に増加させていかないと実質的にお金は増えないという事です。

見落としがちなインフレですが、本当に要注意ですよ。

2013-08-26

中国のサイトを使う時に新規登録とログインがややこしい。

タオバオをはじめとして、中国のサイトを使う時に日本人が間違えやすい典型的なものがアカウントを新しく作ろうと思って「登录(dēnglù)」をクリックしてしまうことです。

日本語の漢字で何となく「登録」と読めるので、新規登録する際についクリックしてしまいがちですが、これはログインを意味します。

新規登録する時にクリックしなければならないのは「注册(zhùcè)」です。

「注册」は日本語の漢字ではとても登録とか新規登録みたいな事を連想できないので気づきませんよね。

ちなみにブログは中国語で「博客(bókè)」と言います。

百度一下なんかで検索するとたくさん出てきます。

中国のブログを使おうと思っている人の多くはSEOのためだと思いますが、グーグルのSEO対策として有効かどうかは分かりません。

一度実験してみますので、何か進展があれば報告します。

2013-08-16

東郷平八郎の戦艦三笠に乗ってきた。

横浜に行ったついでに前から行きたいと思っていた戦艦三笠を見に行ってきた。

戦艦三笠は日露戦争の日本海海戦で、バルチック艦隊に対して海戦史上でも珍しいほどの圧倒的勝利を収めた日本海軍の連合艦隊の旗艦である。

日本海海戦は東郷ターンや下瀬火薬の使用、東郷平八郎司令長官や秋山真之参謀などの大活躍などそれだけで1つの映画になるような壮大な海戦でした。

その伝説的な戦艦三笠が横須賀の三笠公園というところに記念艦として保存されている。

戦後に荒らされて水族館とかダンスホールが甲板に作られたりしたけど、三笠という世界的に有名な戦艦を何としてでも元の勇壮な姿に戻したいという世界中の志ある人たちの活動によって復元された。

記念艦「みかさ」が凄いのは、甲板上の建造物は一部を除きほとんどがレプリカであるもののそれ以外は当時のまま保存されているという事だ。

甲板の一部も当時の木材やタイルがそのまま残っている部分が一部あり、東郷平八郎長官などの乗組員たちが当時歩いていたものと全く同じ所を歩く事ができるのである。

私も最初は全く気付かなかったが、記念写真を撮影できる所にいたおじさんに教えてもらった。

言われたとおりによく見てみると、甲板に使われている木材が確かに一部分明らかに他と事なっている。

↓これが新しく作られた甲板。奇麗すぎますよね。

↓これが当時の甲板のまま残っている部分。新しく作り直された部分と比べると使われている木材の質や大きさが異なるのがよく分かる。この甲板の上を東郷平八郎はじめ乗組員が実際に歩いていたらしい。

また、当時は溶接技術がなくリベットを打ち込み鉄板を繋ぎ合わせていたらしい。レプリカの部分は溶接が使われているが、一部リベットで接合してある部分がある。

その部分が当時のまま保存されている箇所だそうだ。

↓これがレプリカの部分。当時は無かった溶接の技術が使われている。

↓これが当時のまま残っている部分。リベットで結合してあるので注意深くみればすぐに分かる。

私も含めて多くの人がそんな事も気付かず通り過ぎていたが、話を聞いてそれに気付くと、東郷さんや秋山さんの残影を感じずにはいられず、また命をかけて戦ってくれた全乗組員の諸先輩たちの心境ひ思いを致し、目頭が熱くなった。

もし戦艦三笠に乗る機会があれば、よく注意して見て下さい。当時のみんなと全く同じ甲板を歩いていると思うだけで何か感じる事でしょう。

戦艦の高い所にある操縦室の前くらいにあるむき出しの部分に立って東郷長官は指揮を取り続けたらしいのですが、その立ち位置がプレートで表されていました。

敵艦の集中砲火を浴びながらも戦いが終わるまで一歩も動かずに指揮を取り続けたそうです。爆発などの水しぶきで甲板全部が海水を浴びていたらしいのですが、戦いが終わって東郷長官が持ち場を離れると、立っていた靴の形の部分だけが海水に濡れずに乾いていたそうです。

日本海軍の軍服を着て記念撮影できるスポットがあったので記念に1枚。そこのおじさんからいろいろと熱いお話を聞かせていただきました。

子供たちもおじさんに「勉強して立派に偉くなれよ!」と声をかけていただきました。

タオバオで知っておくと便利な単語(女装 レディースファッション)

タオバオで最も人気のあるカテゴリーである女装 レディースファッションの上位階層の単語。

中国語 日本語 発音
连衣裙 ワンピース Liányīqún
T恤 Tシャツ T xù
裤子 パンツ(ズボン) Kùzi
衬衫 ワイシャツ、ブラウス Chènshān
蕾丝衫 レースのシャツ Lěisī shān
牛仔裤 ジーンズ、ジーパン Niúzǎikù
针织衫 ニットシャツ(編物のシャツ) Zhēnzhī shān
短外套 ジャケット Duǎn wàitào
半身裙 スカート Bànshēn qún
商品目录 カタログ Shāngpǐn mùlù

 

タオバオで知っておくと便利な単語(第1階層)

最近、タオバオにどっぷりはまっていて朝起きたらタオバオでいろんな商品と値段をチェックするのが日課になっています。

日本人は漢字が理解できるのでけっこう意味が分かるし、グーグル翻訳などを使えばさらに簡単に意味を理解する事ができるのですが、やっぱり限界もあります。

そこで、タオバオ100%楽しむために覚えておくと便利な重要単語を少しずつご紹介します。

まずはタオバオのカテゴリー第1階層から。

中国語 日本語 発音
流行女装 レディーファッション Liúxíng nǚzhuāng
男装精品 男性高級品 Nánzhuāng jīngpǐn
女鞋 女性の靴 Nǚ xié
男鞋 男性の靴 Nán xié
箱包 バッグ Xiāngbāo
配件 部品、付属品 Pèijiàn
珠宝 ジュエリー Zhūbǎo
饰品 アクセサリー Shìpǐn
食品 食品 Shípǐn
百货 雑貨 Bǎihuò
数码 デジタル機器 Shùmǎ
3C配件 デジタル機器アクセサリー 3C pèijiàn
母婴用品 ベビー用品 Mǔ yīng yòngpǐn
其它 その他 Qítā

 

2013-08-14

入門自然言語処理(オライリー)の演習問題 解答Part3 [第1章21〜29]

入門自然言語処理の演習問題を解くシリーズの最後です。Part1Part2はこちらです。

第21問

print text2[-2:]

第22問

print FreqDist([w for w in set(text4) if len(w) == 4]).keys()

第23問

    for w in set(text6):
        if w.isupper():
            print w

第24問

以下の条件に合うすべての単語を探し出す式を書く。

  • a.「ize」で終わる
  • b.「z」で終わる
  • c.「pt」という文字を含む
  • d.先頭が大文字で後が全て小文字(つまりタイトルケース)
  • 【a】

    print [w for w in set(text6) if w.endswith('ize')]

    【b】

    print [w for w in set(text6) if 'z' in w]

    【c】

    print [w for w in set(text6) if 'pt' in w]

    【d】

    print [w for w in set(text6) if len(w) > 1 and w.istitle()]

    第25問

    似たような事を何度もしているのでパス。

    第26問

    sum([len(w) for w in text1])このPythonコードは何を意味するか?

    text1に含まれている全単語の文字数の和を意味する。

    これを使ってテキスト中の単語帳の平均を求められるか?

    例えば、以下のようにすると単語の平均文字数を求める事ができる。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    from __future__ import division
    from nltk.book import *
    
    def main():
        print sum([len(w) for w in text1]) / len(text1)
    
    if __name__ == '__main__':
        main()

    ちなみに結果は「3.83041112802」でした。よく使われる英語の単語って以外と文字数少ないんですね。

    第27問

    語彙サイズという言葉の意味が分からないので、とりあえず単語の数っていう意味として考える。

    def vocab_size(text):
        text = text.split()
        return len(text)

    第28問

    textをsplitしないと単語の数ではなく文字数になってしまうので注意。

    def percent(word, text):
        return 100 * text.count(word) / len(text.split())

    第29問

    set(sent3) < set(text1)を実行。また他のテキストでも実験せよ。この処理の実用的な応用には何があるか?

    語彙数の多さを比較していることになるから、あるデータの中から語彙数の多いものや少ないものを抽出できる。

    【入門自然言語処理解答(第1章)】

    2013-08-12

    入門自然言語処理(オライリー)の演習問題 解答Part2 [第1章9〜20]

    前回の入門自然言語処理の解答の続きです。

    第9〜14問

    自然言語処理とは関係なくPythonの問題なのでパス。

    第15問

    print sorted([w for w in set(text5) if w.startswith('b')])

    第16問

    自然言語処理とは関係なくPythonの問題なのでパス。

    第17問

    「sunset」という単語の添字番号をtext9.index()探して、sunsetを含む完全な1文を見つけて取り出せ、という問題。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    from nltk.book import *
    
    def main():
        # sunsetの添字番号
        number = text9.index('sunset')
    
        # 文頭と末尾の変数を初期化
        start = end = 0
    
        # sunsetの番号から1つずつ前に戻っていってピリオドを探す。
        i = number # 文頭の添字番号
        while 1:
            if text9[i] == '.':
                start = i
                break
            i -= 1
    
        # sunsetの番号から1つずつ後ろに進んでいってピリオドを探す。
        i = number # 文末の添字番号
        while 1:
            if text9[i] == '.':
                end = i
                break
            i += 1
    
        # sunsetの含まれている1文を出力
        print ' '.join(text9[start+1:end+1])
    
    if __name__ == '__main__':
        main()

    ピリオドが文の区切りと考えて、sunsetを基点に1ずつ前後に移動してピリオドが見つける。これで文頭と文末の添字番号が分かるので、その部分だけをtext9から抜き出す。その結果がこれ。

    CHAPTER I THE TWO POETS OF SAFFRON PARK THE suburb of Saffron Park lay on the sunset side of London , as red and ragged as a cloud of sunset .

    「CHAPTER I」とかなってるしたぶん間違えてると思う。これは章のタイトルだから最後にピリオドが付いてないんだと思う。

    CHAPTER 1 INTRODUCTION
    This book is ~......

    みたいな感じだと思う。この章タイトルの部分にかぶらなければこれで抜き出せたと思うけど・・・。なかなかいやらしい問題だわ。

    第18問

    print len(sorted(set(sent1 + sent2 + sent3 + sent4 + sent5 + sent6 + sent7 + sent8)))

    第19問

    以下の2つの違いは何か?どちらが大きな値を得る事ができるか?

    len(sorted(set([w.lower() for w in text1])))
    len(sorted([w.lower() for w in set(text1)]))

    最初ぱっと見たときは同じ事をしてるだけと思ったんだけど、実際に実行してみると上が17,231で下が19,317とかなり違いが出た。

    でよく考えてみると、上は全て小文字化した後でsetdで重複を取り除いているのに対して、下はsetで重複を取り除いてから小文字化している。

    例えば、dog Dogという単語が入っていたとすると、上の方では先に小文字化するのでdog dogとなってsetするので1つになってしまう。

    下の方は先にsetするのでその段階ではdog Dogと2つ残っており、それから小文字化するのでdog dogと2つの単語が残ったままになる。

    したがって下の方が値が大きくなる。

    別の言い方をすると上と下の値の差は、同じ単語が小文字と大文字の両方で記述されている数という事になるんだろう。

    第20問

    w.isupper()とnot w.isupper()の違いは?

    前者はwが全て大文字なら真、それ以外は偽。

    後者はwが全て大文字なら偽、それ以外は真。

    【入門自然言語処理解答(第1章)】

    入門自然言語処理(オライリー)の演習問題 解答Part1 [第1章1〜8]

    オライリーから出版されている入門自然言語処理をコツコツ読んでいる。

    これからこの分野は確実に伸びるだろうし、何より夢がある。完全なリアルタイム自動翻訳、完全に会話の成り立つ人工知能、自分の心を癒してくれる心理カウンセラーのようなロボットなど。

    今、自分に関係のある領域で言えばグーグルの検索アルゴリズムが進化するキーポイントとなる技術も自然言語処理だと思う。

    もしグーグルのコンピュータがあるページに書かれている内容を完全に理解できるとすると、今みたいに被リンクに頼るアルゴリズムを使う必要性が全く無くなる。

    検索ユーザーの意図を読み取って、その人の求めている情報が掲載されているページを検索結果に返せばいいだけ。

    そのページがどこからリンクを貰っているとか、どれだけの数のリンクを貰っているかなんて完全に二次的なスコア付けに過ぎなくなる。

    ということで自然言語処理という技術にすごく興味がある。

    入門自然言語処理がいいのは、各章の終わりに演習問題が付いていることだと思う。本を読んで知識を入れるだけでも本当の理解には至らず、自分で考えて手を動かしたりして出力(アウトプット)してはじめて理解が深まる。

    ただ、答えがどこにも書かれてない。仕方ないから他の人がブログなんかに書いてたりするのを参考にしながらやっています。

    他にも同じような人がいるかもしれないので、僕も自分の解いた答えをブログに載せることにする。合っているかどうかは全く分からないし自信もありません。あくまでも参考という事にしていただいて間違いなどがあればコメント貰えると嬉しいです。

    【第1章演習問題】

    第1問

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    from __future__ import division
    
    def main():
        print 12 / (4 + 1)
    
    if __name__ == '__main__':
        main()

    第2問

    print 26 ** 100

    第3問

    >>> ['Monty', 'Python'] * 20
    ['Monty', 'Python'] * 20
    ['Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python']

    第4問

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    from nltk.book import *
    
    def main():
        print len(text2)
        print len(set(text2))
    
    if __name__ == '__main__':
        main()
    

    結果としてはtext2に含まれている単語の数は141,576個。重複を省くと6,833個。

    第5問

    ---------------------------------------------------------------------------------
    |ジャンル                 | トークン数 | 異なりアイテム数 | 語彙の多様性 |
    ---------------------------------------------------------------------------------
    |ユーモア(humor)    |     21,695|                  5,017|                 4.3|
    ---------------------------------------------------------------------------------
    |ロマンス(romance) |     70,022|                  8,452|                8.3|
    ---------------------------------------------------------------------------------

    トークン数/異なりアイテム数=語彙の多様性という計算式だからスコアが低い方が語彙は多様性に富んでいるという事。

    もしトークン数が100で、現実的には不可能だろうけど全て異なる語彙を使えば異なりアイテム数も100になり語彙の多様性は1になるから。

    したがって、ユーモアの方が語彙の多様性に富んでいる。

    第6問

    Sense and Sensibility(分別と多感)という本はtext2の事なのだがマリアンのスペルが分からないので検索した。

    print [w for w in set(text2) if w.startswith('M')]

    これらが抽出されたけど、当てはまりそうなのはMarianneだけかな。

    ['Mansion', 'Magna', 'Me', 'Ma', 'Mr', 'My', 'ME', 'MY', 'Michaelmas', 'Midsummer', 'Monday', 'May', 'M', 'Many', 'MADAM', 'Madam', 'MIND', 'MAY', 'Mind', 'Mine', 'Misses', 'Mary', 'Marlborough', 'Mama', 'Most', 'Mrs', 'MUST', 'Music', 'MONTH', 'Must', 'Middletons', 'Misery', 'Margaret', 'Men', 'Mab', 'Mistress', 'Middleton', 'Mamma', 'Much', 'Martha', 'Marianne', 'Mid', 'Morton', 'Master', 'March', 'More', 'Mall', 'Miss', 'Months']

    これら4人の名前を配列に入れてdispersion_plotメソッドに渡す。

    print text2.dispersion_plot(['Elinor', 'Marianne', 'Edward', 'Willoughby'])

    以下のようなプロットが表示された。

    この小説の中で男性と女性の演じる役割の違いを何か発見できるか?という問いがあるんだけど、男性はエドワードだけっぽい。

    エリナとマリアンが主人公的な役割でエドワードとウィロビーが少し脇役的な役割というのはすぐに分かる。すぐに思いつくのはこれくらいなので女性が中心的な役割で男性が女性を引き立てるための脇役としての役割を果たしているという事にしておこう。

    さらに、この情報から「カップルを特定せよ!」との質問がある。

    一般的に考えて異性のカップルとするとエドワードを中心に残りの3人を考える事になる。

    エドワードとウィロビーはほとんど同じ時間に登場していないのでおそらく違うだろう。

    エリナかマリアンかはこの情報だけでは特定できないよね。

    もし同性のカップルという事であれば万遍なく登場しているエリナとマリアンだろう。

    エリナとマリアンがエドワードを巡って恋敵の状態になっていて、でも実はエドワードにはウィロビーという恋人がいるという設定もあり得る。

    結論としてはこれだけでははっきりとは分からない。

    【追記】Wikipediaでこの小説の事を調べてエリナとエドワードが恋人だという事が分かりました。ちなみにエリナとマリアンが姉妹でウィロビーも男性だそうです。Willoughbyで画像検索すると圧倒的に女性が多く出てきたんですけどね。

    第7問

    これは何も難しくない。

    print text5.collocations()

    第8問

    len(set(text4))という式の目的と意味は?

    目的は、text4の中に含まれている単語の種類の数を調べる事。

    set関数で2回以上登場する単語を1つにまとめてlen関数で単語の数を数える。

    【入門自然言語処理解答(第1章)】

    2013-06-26

    鈴木鎮一記念館〜星野リゾート「界 松本」の感想

    先月、生まれて初めて松本市に行ってきました。

    目的は、鈴木鎮一記念館を訪れる事。

    鈴木鎮一記念館というのはスズキメソードの創始者である鈴木鎮一先生が実際に住まわれていた家を松本市が買い上げて記念館として保存・管理しているものです。

    正確に言うと管理は松本市からの委託を受けてスズキメソードがしているそうです。

    松本はサイトウ・キネン・フェスティバルが開催されていて「音楽の町」として有名で、景観も美しい町だと聞いてたので一度行ってみたいと強い思いを持っていました。

    高速のパーキングエリアから見える山の頂きには雪がまだ残っていて、自然の雄大さを感じる事ができました。

    松本市の山頂に雪が残っている山々 高速のパーキングエリアから撮影

    僕が住んでいる京都も山に囲まれていて似ているとも思えるけど、山の高さが全く比にならないので同じように山に囲まれている町でも感じ方は全く異なります。

    何とも言えないような自然のエネルギーを感じられて、ちっぽけな悩みが消えていく感覚になりました。こういう環境だからこそ、そこに住む人たちの音楽の感性が磨かれているんでしょう。

    その日の宿泊は前から少し気になっていた星野リゾートの「界 松本」にしました。

    今年からアメックスのプラチナ特典で星野リゾートに泊まると1人分の料金が無料になるというのがあって、それも理由の1つ。

    クレジットカード選びは【クレジットカードキング】

    この特典はけっこういんだけど、めんどくさいのがコンシェルジュに頼めないこと。

    専用のURLにアクセスしてそこから自分で申し込みをしないといけないのです。

    しかも、その予約システムがしょぼくて全然使えない。

    星野リゾート「界 松本」に宿泊した感想はごく普通。もし、アメックスの特典で1人分が無料にならなければ、もう一度行こうとは思わないかもしれない。

    毎日エントランスホールで開催されているミニコンサートを楽しみにしてたんだけど、それがいまいち。

    ホールがコンサートホールみたいな造りになっていて音響とかは良かったけど、それ以外は何も感じるものが無かった。

    「音楽の街 松本」って事で期待し過ぎていてそのギャップが大きかっただけで、そういうものを知らなかったらもっと良かったと思えたのかもしれない。

    料理は美味しいし、かなり広いゆとりのある個室でいただけたので、子連れの僕たちには周囲に気を使わずに住んで良かった。

    ちょうどこの時iPhoneのカメラが故障してて撮るもの全部がピンボケになってしまっていたのでまともな写真がほとんど撮れなかったのが残念。

    今度は軽井沢とか別の星野リゾートに行ってみようと思う。

    昼間に行った鈴木鎮一記念館は、特に豪邸というような建物ではないけど、建物内に愛の感じられるあたたかい空気が流れていて、いくら金をかけて豪華に造っても絶対に真似できない居心地の良さがありました。

    時が経過してもそこに住んでいた人間の人格というものが建物には残っているんだなと不思議な感覚になりました。

    どんなに金をかけた高級ホテルや高級旅館よりも居心地が良くて安らげた。

    内村鑑三が「後世への最大遺物」で人間が後世に遺すことのできる最大の遺物は「勇ましい高尚なる生涯」であると書いてますが、まさにそれを鈴木鎮一記念館で心底理解しました。

    鈴木鎮一記念館に行ってから星野リゾート「界 松本」に行ったので、どんなによく見せようとしている物でも薄っぺらいハリボテに感じてしまったのです。

    おそらく星野リゾート「界 松本」は、そういう事を考えずに観光として行けば素晴らしいところだと思います。

    僕にとっての鈴木鎮一先生やスズキメソードとの出会いって、最も尊敬する経営者であるソフトバンクの孫さんに遡るんですよね。

    その話はまた今度書きます。

    松本はいい街であり、子供を授かりスズキメソードと出会えた事の幸運を再確認する事ができた旅でした。

    最後に鈴木鎮一記念館に展示してあった鈴木鎮一先生の一日一語集を自分に改めて言い聞かせる意味も込めて載せておきます。

    鈴木鎮一記念館に展示されていた鈴木鎮一先生の直筆一日一語集

    「うちの子は駄目だと思う親は駄目」

    「どの子も育つ親次第」

    「急がず休まず諦めず」

    耳が痛い言葉ばかり。

    2013-05-05

    アメックス、ベルメゾン、ANAマイルの3重取りに成功

    以前の「ANAマイレージクラブに入会。3倍ポイント・マイレージを貯める方法」という記事で、1回の買い物でポイントとマイレージを3重取りする方法というのを書きました。

    あれを書いている時点では、あくまで予想だったのですが、実際に実験してみたところ本当に3重取りをする事ができました。

    今回は楽天ではなくベルメゾンで買い物をしましたが、基本的な考え方は同じです。

    とにかくネットショッピングをする時には、ANAマイレージモールを必ず使おうと言う事です。

    本当にポイントが付与されたという事を証拠画像を交えて書きましたので参考にして下さい。

    ↓新しく作り始めているクレジットカードキングというサイトです。

    クレジットカードを使って1回の買い物で3倍ポイントを獲得する方法

    2013-03-23

    国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    沖縄に来たらステーキ食べないと気が収まらないという事で、最終日の昼食は国際通りの観光を兼ねて鉄板焼きステーキレストラン「碧」という所で食べました。

    最初は、去年も行ったキャプテンズインというシェフがちょっとしたパフォーマンスをしながら肉を焼いてくれる店に行ったんですけど、人が多かったので、待ちきれず別の店を探す事にしました。

    国際通りを歩いていると、何件も鉄板焼き屋というかステーキやがあって、迷ったんですけど、何となく店構えがよかった「碧」という店に入りました。

    入って気づいたのはスタッフが女性ばかりだと言う事。後で置いてあったリーフレットを見てみると、やっぱり女性だけでやっているというのがウリの店だったようです。

    テンダーロインとサーロインのステーキセットを1人前ずつ注文しました。

    沖縄の国際通り、鉄板焼きステーキレストラン「碧」

    テンダーローインの肉は、脂身が少なくて食べやすいんだけど、年齢と共に量が食べられなくなってきた僕にはちょっと不満足でした。

    サーロインは、霜降りの脂がのっていて、トロけるような肉ですごいおいしかったです。キャプテンズインよりは値段は高かったけど、けっこうおいしくて良かったです。

    飛行機までの時間があまり無かったので、その旨を伝えると対応していただけたのもよかったです。

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    5日目。首里城の観光。

    5日目の最終日は、夕方に那覇空港から飛行機に乗るので、チェックアウトしてからは那覇周辺で遊ぶ事にしました。

    ブセナテラスのクラブラウンジでチェックアウトの手続き。最後にこの旅一番のお気に入りになったグァバジュースの炭酸割りを最後にいただきました

    ブセナテラスのクラブラウンジでいただいたグァバジュースの炭酸割り

    首里城とか国際通りとかは那覇空港から近いので、帰りの飛行機に乗る前に行くと無駄な時間が無くてよかったです。

    首里城は、中国文化と日本文化が融合したもので、日本に一般的な城とは大きく雰囲気が異なります。

    去年も首里城を観光して、その時に琉球王朝の事が気になって少し調べたのですが、日本と中国の両ばさみになって厳しい最後を迎えているんですよね。

    今年、私たちが行った時には、工事をしていて美しい外観を見る事ができませんでした。

    首里城は改装工事中でした。

    中国の文化も所々に感じる立派なお城です。日本の有名なお城と比較しても見劣りしませんので、当時の琉球王朝がどれだけ栄えていたかが分かります。

    高台になっている所に築城されていたようで、上からは那覇か何か分かりませんが、町並みを一望することができます。

    首里城の上から見下ろした沖縄の町並み

    門構えは、完全に敵の侵入を想定してそれを防ぐための構造になっています。城だから当然なんですけどね。防御の事を一切考えていなかった安土城が例外です。

    首里城の門は石垣で堅牢な造り

    琉球王朝の事を詳しく知りたければ、昔やってたNHKの大河ドラマ「琉球の風」を見るといいみたいです。ただ、なぜかDVDが発売されていません。原作を本で読むしかないようです。

    ちなみに、沖縄観光でおすすめのむら咲むらは「琉球の風」のロケをするために作られた跡地です。だからあんなにリアルに当時の風景が残されているんですね。

    首里城から出てくると途中で土産物屋さんがたくさん並んでて、また商売っ気たっぷりのおばちゃんたちが商売に励んでいました(笑)

    せっかく沖縄に来たのでブルーシールのアイスクリームをいただきました。京都では真冬の2月に暖かい沖縄で冷たいアイスクリームを食べるっていうのが南国にバカンスに来た事を実感できて最高です。

    首里城のブルーシールアイスクリーム&ソフトクリーム

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    2013-03-18

    沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す

    昼間は美ら海水族館に行ってきて、ホテルに帰ってきてからまた出かけるのは面倒だったのでディナーはブセナテラスの中にある和食レストラン真南風(まはえ)にしました。

    実は、前日も真南風(まはえ)に行きたかって予約しようと思ったけど、既に予約が埋まっていて行けませんでした。15時か16時くらいに電話してすでに21時くらいまでいっぱいだったので、けっこう人気なのかも。行くならできるだけ早めに予約しといた方がいいですよ。

    ソフトドリンクも沖縄らしく南国のトロピカルカクテル風です。こういうのがけっこううれしい。

    ブセナテラス真南風(まはえ)のドリンク

    料理は会席料理とかいろんなものがあるけど、握り寿司が好きな僕は握り寿司盛り合わせを注文。

    ブセナテラス真南風(まはえ)の握り寿司盛り合わせ

    嫁さんが天ぷら好きなので、天ぷらも注文。子どもようにうどんなんかも用意していただきました。メニューには無かったと思いますけど、何でも言ってみれば対応してもらえるものです。

    ブセナテラス真南風(まはえ)の天ぷら

    ブセナテラス真南風(まはえ)で作ってもらった子供用のうどん

    全部食べ終えた後に、沖縄で寿司と天ぷらだけでは雰囲気が出ないので、ゴーヤーチャンプルも食べました。

    味そのものは、特別おいしいというわけではありませんけど、値段相応かなという感じです。ブセナテラスは全体のホテルの雰囲気が良いのですが、料理に関しては特別という事は無いと思います。

    真南風(まはえ)はブセナテラスという素晴らしいホテルの中にあり行くのも楽ですし、素晴らしい雰囲気の中で料理が食べられるという事を考えると総合的には良いレストランだと思います。

    次回行くときは、会席料理を食べてみたいですね。

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    2013-03-16

    下鴨神社近く「加茂みたらし茶屋」のみたらし団子

    下鴨神社のすぐ近くに加茂みたらし茶屋というお茶屋さんがある。

    いかにも京都らしい雰囲気のお店で、中でも食べられるし、持ち帰りもできる。

    中には小さな神社も祭られていて、下鴨神社の近くという土地柄もあって、神聖な空気が流れているように感じる。

    いろんな和菓子を食べる事ができるのだが、一番人気はみたらし団子です。

    京都下鴨神社近くの加茂みたらし茶屋のみたらし団子の画像

    加茂みたらし茶屋で食べるまでは、みたらし団子ってそんなにおいしいというイメージを持ってなかったんだけど、ここのみたらし団子は本当に美味しい。

    店内で食べると焼きたての作り立てを出してくれるので、なおさらおいしい。持って買える予定の人も1皿3本セットのみたらし団子があるので、一皿だけでも店で食べる事をおすすめします。

    スーパーで売っている安いみたらし団子ってもちもちした食感なんですけど、加茂みたらし茶屋のみたらし団子はけっこう固めの食感でそれがおいしいんですよね。

    下鴨神社で心を清らかにしておいしいみたらし団子を食べる。京都ってほんとに素晴らしい所です。

    場所は分かりにくい場所ではないのですが、店が小さめなので車などで通ると見過ごしてしまうことがあります。下のグーグルマップのAというピンが立っている所です。右の緑の部分が下鴨神社です。

    加茂みたらし茶屋の場所

    ちなみに持ち帰った場合でも、ビニールの袋に入っているのでお湯であたためると少しだけおいしくいただけます。

    2013-03-15

    線形探索改良版 for~elseを使う

    前に書いた線形探索法(リニアサーチ)をfor~elseで改良してみました。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def linearSearch():
        array = [4, 2, 3, 5, 1]
        for i, e in enumerate(array):
            if e == 5:
                print "array[%d] is 5." % i
                break
        else:
            print "5 doesn't exist in the array."
    
    if __name__ == '__main__':
        linearSearch()

    elseってif文と組み合わせて使うのが普通だけど、何かの本でfor~elseという書き方ができると知ったので使ってみました。

    for~elseと書くと、forループが全部終わった時に実行されます。ただし、breakするとelse以降は実行されません。

    前回書いた線形探索法と比べて探している数字が見つかったかどうかを判断するansという変数が不要になり少しスッキリしました。

    2013-03-13

    ラ・パティスリー・デ・レーヴ(La patisserie des reves)京都高台寺店

    花灯路を見に行ったついでに、京都の祇園にできたラ・パティスリー・デ・レーヴ(La patisserie des reves)に行ってきました。

    オープンしてすぐの時も行ったので、二回目ですけど、やっぱり美味しいわ。

    京都祇園にあるフランス(パリ)の有名パティシエのお店ラ・パティスリー・デ・レーヴ(La patisserie des reves)のケーキ1

    京都祇園にあるフランス(パリ)の有名パティシエのお店ラ・パティスリー・デ・レーヴ(La patisserie des reves)のケーキ2

    見た目もいいし、食感もいいし、食べてるうちにだんだん味が変わってきたりもする。

    食べログとか見てると、コストパフォーマンスがどうのこうのとか言ってる人多いけど、質が上がれば上がるほどコストパフォーマンスってのは悪くなって当然なのよ。

    サイト作成でも、アプリ作成でも何でも同じ。

    60%の完成度のものを10%向上させるのにかかるコストと90%の完成度のものを10%向上させて100%にするのにかかるコストを比較すると後者の方は何倍も大変なの。

    だからよりレベルほ高いモノを求める時っていうのはコストパフォーマンスを考えたらダメなのよ。

    花灯路は好みの問題かもしれないけど、個人的にはそれほど好きじゃない。やっぱり昼間の太陽が出ている時の方が断然美しい。

    歴史のある建築物っていうのは、建築した当時には今みたいな電気とかライトアップの技術なんて無かったから、そういう飾り付けをする前提で作って無い訳で、ライトアップとかしてもそんなに美しくなるものじゃないのだと思う。

    太陽、青空、緑のコントラストが最も美しい。

    ラ・パティスリー・デ・レーヴは19時で閉店なので、花灯路のついでに行くにはちょっと時間的に厳しいけど、食べる価値のあるスイーツです。

    Pythonで文章に出現する個々のキーワードの出現回数を調べる方法

    キーワード出現頻度とかを調べる時に、ある文章中に特定の単語が何回出現するかというのを調べたい時はよくあります。

    Pythonで個々の単語の出現回数を調べる方法は主に3つあります。

    1. for文で1つずつ調べて行く方法
    2. for文で辞書のgetメソッドを使う方法
    3. nltkを使う方法

    3つの方法で実際に書いてみました。サンプルの文章はWall Street Journalのトップニュースから引用させていただきました。

    def version1(line):
        for word in line.split():
            if word in wordcount:
                wordcount[word] = wordcount[word] + 1
            else:
                wordcount[word] = 1
        print wordcount
    
    def version2(line):
        for word in line.split():
            wordcount[word] = wordcount.get(word, 0) + 1
        print wordcount
    
    def version3(line):
        import nltk
        tokens = nltk.word_tokenize(line)
        text = nltk.Text(tokens)
        wordcount = nltk.FreqDist(text)
        print wordcount.items()
    
    if __name__ == '__main__':
        line = "These changes, almost all of which the White House and Democrats have said they oppose, would combine with January's tax increases to eliminate the government's budget deficit in 2023, a top GOP goal, says Mr. Ryan, chairman of the House Budget Committee. Prior House GOP budget resolutions called for changes that would have taken several decades to eliminate the deficit."
        wordcount = {}
        version1(line)
        version2(line)
        version3(line)

    一番分かりやすいのが1番の方法(version1)で、1つずつ単語を取り出して、その単語が辞書に既に登録されていれば1を足して、登録されていなければ1を代入するのを繰り返します。

    もう少し簡単に書けるのが2番の方法(version2)で、辞書のgetメソッドを使います。引数の1つ目はキーを、2つ目はキーが存在しない場合のデフォルト値を渡します。

    キーが存在すればそれに1を足す事になり、キーが存在しなければ0を代入するという事になります。

    もっと便利なのが3番の方法(version3)のnltkを使うやり方です。nltkは標準で入ってないので別途インストールする必要があります。

    FreqDistっていうのは、単語の出現回数の順番に並べてくれていますので、出現回数の上位10個だけを取り出したい時には以下のように最後に[:10]と書けばいいだけです。NLTKは面白い。

        print wordcount.items()[:10]

    調査したいライバルサイト、ライバルサイトのバックリンクサイトなどのキーワード出現回数とかを調べたい時に便利です。NLTKを使えば最近のSEOで大事な共起語なんかの分析も簡単にできます。

    日本語みたいに単語をスペースで区切らない言語の場合はMeCabなどで単語に分割したり形態素解析する手間も必要になります。

    2013-03-12

    「アルゴリズムを、はじめよう」ユークリッドの互除法をPythonで書く

    2つの数字の最大公約数を導きだすユークリッドの互除法のアルゴリズムをPythonで書きました。

    アルゴリズムを、はじめよう

    第12章:ユークリッドの互除法のアルゴリズム(Euclidean algorithm)

    
    #!/usr/bin/env python
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def euclidean():
        a = int(raw_input("Enter the first number. : "))
        b = int(raw_input("Enter the second number. : "))
        ans = 1
        if a < b:
            a, b = b, a
        while 1:
            r = a % b
            if r == 0:
                ans = b
                break
            else:
                a = b
                b = r
        print "The greatest common divisor is %d." % ans
    
    if __name__ == '__main__':
        euclidean()
    

    これはけっこう簡単にできた。フローチャートを見てもけっこう単純。こんな簡単に最大公約数が出せるなんて知らなかった。

    沖縄旅行記4日目。美ら海水族館の感想。

    沖縄の観光名所の1つとして有名な美ら海水族館は、沖縄のけっこう北の方に位置してて、那覇からだと渋滞などに巻き込まれると2時間くらいかかると思います。

    那覇から往復してると美ら海水族館の見学だけで一日潰れてしまうのでもったいないですね。

    ただ、その日に宿泊してたブセナテラスからだと1時間かからず行けるので、せっかくなので今年も行ってきました。

    グーグルマップで距離感を見るとこんな感じです。Aがブセナテラスで、紫のピンが美ら海水族館で、赤い線が車で走ることになる道です。

    ブセナテラスから美ら海水族館までの道のり

    美ら海水族館のチケットは、当然現地でも買えるけど、近くのコンビニなんかで買った方が割安で買えます。

    美ら海水族館に近くに来るとコンビニなんかで割引チケットを販売しているというのぼりが出ているので、どこかで買って行った方がお得です。

    水族館自体は去年も行って2回目なので、そんなに時間かけずに回りました。

    何度見てもメインの巨大水槽は大迫力で圧巻でした。大水槽は見る大いに見る価値あると思います。

    立っている人と比較すれば水槽がどれだけ大きいか分かっていただけると思います。

    美ら海水族館のメインの大水槽

    大水槽の中を泳いでいるジンベイザメもど迫力。他の水族館では見られないスケール感です。

    美ら海水族館のジンベイザメの画像

    期間限定らしいですけど、伝説のモンスターとしてよく出てくるクラーケンのモデルになっていると言われているダイオウイカが展示してありました。

    ほんとうに大きかった。かなり下がって撮影したけど、それでもカメラに入りきらないくらいの大きさ。

    美ら海水族館に展示されていたダイオウイカ

    昼食は、美ら海水族館の中にある「イノー」というレストランで食べました。バイキング形式で値段の割には味もまぁまぁでした。

    それよりも、東シナ海を一望できるオーシャンビューが素晴らしかった。真っ青な海の景色を見ながら食べたり飲んだりできるだけで幸せ。京都にはない美しさを感じる事ができました。

    美ら海水族館の海が見えるレストランイノー

    美ら海水族館の周りには芝生とか子供が遊べる遊具があって、昼食の後はそこで子供達が遊んでました。水族館よりもそっちの方が楽しいみたいでした。

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    「アルゴリズムを、はじめよう」エラトステネスのふるいをPythonで書く

    指定した数までの範囲の素数を一覧で表示させる問題。素数とは、2以上の整数の中で1とその数字自身以外では割り切れない数のこと。

    「エラトステネスのふるい」っていうのは、ある数以下の範囲に存在する素数を探したい場合に、その数の平方根より小さい素数の倍数を全て消せば素数が残るという考え方です。

    アルゴリズムを、はじめよう

    第11章:エラトステネスのふるい(Sieve of Eratosthenes)のアルゴリズム

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import sys, math
    
    def eratosthenes(max):
        max += 1
        array = range(max)
        array[0] = array[1] = 0
    
        for m in xrange(2, int(math.sqrt(max))):
            for i in xrange(2, max):
                if m * i < max:
                    array[m * i] = 0
        primeNumbers(array)
    
    def primeNumbers(array):
        for e in array:
            if not e == 0:
                print e
    
    if __name__ == '__main__':
        eratosthenes(max=100)
    

    いろんな人が書いているのを参考にさせてもらったけど、何となくしっくりこなくて何とか自分で書いた。

    かなりごちゃごちゃしてきた。これは改善しないといけない。

    2013-03-11

    ANAマイレージクラブに入会。3倍ポイント・マイレージを貯める方法

    去年から時々飛行機を使う事があるので、ANAマイレージクラブに申し込みました。

    高速道路を使うときETCを使うと貯まるマイレージの存在を知らなかって、大損をしていた教訓を活かして、とりあえず申し込みだけでもしておきました。

    クレジットカード付きとか、いろいろなカードがあったけど、今回は入会金も年会費も無料のベーシックなANAマイレージクラブカードです。

    申し込んでからカードが届くまでに3週間くらい時間がかかると書いてあったけど、実際には11日で届きました

    ANAマイレージクラブカードの画像

    いろいろ冊子が入っていてポイントの貯め方とか、使い方とかが書いてあって、気になったのが楽天とかベルメゾンの買い物でもANAマイレージが貯まるというANAマイレージモールいうもの。

    ANAマイレージクラブ会員のサイトにログインして、そこを経由して楽天とかベルメゾンに行って買い物したら、楽天ポイントが付くだけでなくANAマイレージももらえるらしいのです。200円で1マイルなので還元率は0.5%です。

    楽天で定期的にペリエを購入しているので、早速ですが、ANAマイレージモール経由で楽天でペリエを注文してみました。

    決済はアメックスのクレジットカードを使うので、このやり方で買い物をすると、通常の買い物に比べて3倍ポイント・マイレージがもらえてお得ですよね。

    ペリエ(レモン味)の12本セットを2セット買って合計3,980円の買い物でした。

    • アメックスのポイント:39ポイント(3,980 × 1%)
    • ANAマイレージ:19ポイント(200円=1マイル)
    • 楽天ポイント:37ポイント(送料、消費税抜きの金額に対しての1%)

    1回の買い物でこれだけのポイントとマイレージが加算されるということですよね。

    実際にマイレージが付与されるのは、2〜3ヶ月後らしいので、本当にマイレージが加算されたら後日報告します。

    ANAマイレージモールを経由して楽天で買い物をする流れを簡単に説明します。

    1、まずANAのサイトに行ってマイレージ会員専用ページにログインします。

    ANAマイレージ会員ログイン

    2、ログインした最初の画面の下の方に「ネットショッピングでもマイルが貯まる」というバナーがあります。このバナーは変更される可能性がありますが、とにかくネットショッピングでマイルが貯まるとかANAマイレージモールという事が書いてある部分をクリックします。

    ANAマイレージモール

    3、利用したいショップを探してクリックする。今回は楽天で買い物をするので、楽天のバナーをクリックしました。

    ANAマイレージモールを経由して楽天で買い物をするとマイレージが貯まる

    4、「ANAマイレージモールを経由してパートナーショップサイトへ移動します」というのが出てくるので、クリックして移動します。

    ANAマイレージモールから楽天に移動する方法

    5、それぞれのショップに移動した後は、各ショップの手順どおり買い物をします。

    少しめんどくさい手順を踏む必要がありますが、このやり方で買い物をすれば3倍早くマイレージ・ポイントを貯めることができるはずです。

    アメックスのポイント、楽天ポイント、ANAマイレージの3つがきちんと付与されれば報告します。

    クレジットカードに興味がある人は、クレジットカードキングであなたに最適な1枚を見つける事ができます。

    2013-03-08

    「アルゴリズムを、はじめよう」単純挿入法(insertion sort)をPythonで書く

    5,3,4,1,2と並んでいる数字を単純挿入法(インサーションソート)を使って昇順に並べ替える問題。

    アルゴリズムを、はじめよう

    第9章:単純挿入法(インサーションソート, insertion sort)のアルゴリズム

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def insertionSort():
        array = [5, 3, 4, 1, 2]
        for i in xrange(1, len(array)):
            while i - 1 >= 0:
                if array[i-1] > array[i]:
                    array[i-1], array[i] = array[i], array[i-1]
                i -= 1
    
        print array
            
    if __name__ == '__main__':
        insertionSort()
    

    これで合ってるのかちょっと自信がない。

    やっている事がバブルソートのような気もする。

    「アルゴリズムを、はじめよう」単純交換法(バブルソート, buble sort)をPythonで書く

    5,3,4,1,2と並んでいる数字を単純交換法(バブルソート)を使って昇順に並べ替える問題。

    アルゴリズムを、はじめよう

    第8章:単純交換法(バブルソート, buble sort)のアルゴリズム

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def bubleSort():
        array = [5, 3, 4, 1, 2]
        k = len(array) - 1
        for i in xrange(k):
            for j in xrange(k, i, -1):
                if array[j-1] > array[j]:
                    array[j-1], array[j] = array[j], array[j-1]
        print array
    
    if __name__ == '__main__':
        bubleSort()
    

    Pythonはxrange関数の3つの引数をうまく使ってforループを回すのがポイントだって事が分かって来た。

    初めて書くので、この簡単なものがものすごく難しく感じる。

    「アルゴリズムを、はじめよう」単純選択法(選択ソート, selection sort)をPythonで書く

    前回のハッシュ探索法までが探索のアルゴリズムで、今回からはソートのアルゴリズムに突入です。

    12,13,11,14,10と並んでいる数字を選択ソート(selection sort)を使って昇順に並べ替える問題。

    アルゴリズムを、はじめよう

    第7章:単純選択法(選択ソート, selection sort)のアルゴリズム

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def main():
        array = [12, 13, 11, 14, 10]
        for i in xrange(len(array)):
            min = i
            for j in xrange(i+1, len(array)):
                if array[j] < array[min]:
                    min = j
            array[i], array[min] = array[min], array[i]
        print array
    
    if __name__ == '__main__':
        main()
    

    たぶんこれで合っていると思ったけど、これ書くのに3時間くらいかかった。いろんな人が書いているコードを見せてもらって何とかできました。

    できてしまえば、何も難しい事はないんだけど、最初自分で考えていた時は、混乱しまくりで久しぶりに知恵熱が出ましたよ。

    2段階目のforループの部分をwhileで書いてたり。

    変数jがi+1なんだって事に気づけばかなり楽になりました。

    こういう基本的なアルゴリズムを何度も何度も書き直して、何も考えずに手が動くようになるまでやります。最低でも10回くらいは必要かな。

    それができてから次のステップの本に進みます。

    2013-03-07

    「アルゴリズムを、はじめよう」ハッシュ探索法をPythonで書く(データ取り出し編)

    「アルゴリズムを、はじめよう」をPythonで書く第四弾。ハッシュ探索法のデータを取り出すアルゴリズムです。データの格納編はこちら

    アルゴリズムを、はじめよう

    第6章:ハッシュ探索法のアルゴリズム(データの取り出し)

    12,25,36,20,30,8,42という数字を要素11個の配列に格納する。ハッシュ関数は、ArrayD % 11。

    格納した配列から12が入っている場所を探す。

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    class Hash:
        def __init__(self):
            self.arrayD = [12, 25, 36, 20, 30, 8, 42]
            self.arrayH = [0] * 11
            self.max = len(self.arrayH)
        def insert(self):
            for d in self.arrayD:
                k = d % 11
                count = 0
                while count < self.max:
                    if self.arrayH[k] == 0:
                        self.arrayH[k] = d
                        break
                    else:
                        k += 1
                        if k >= self.max - 1:
                            k = 0
                            count += 1
            print self.arrayH
        def search(self, num):
            ans = num % 11
            count = 0
            while count < self.max:
                if self.arrayH[ans] == num:
                    print "%d is in the arrayH[%d]." % (num, ans)
                    break
                else:
                    ans += 1
                    if ans >= self.max - 1:
                        ans = 0
                    count += 1
    
    if __name__ == '__main__':
        hash = Hash()
        hash.insert()
        hash.search(12)
    

    だんだんごちゃごちゃしてきました。間違いや改善方法など、何でもご意見いただければ嬉しいです。

    「アルゴリズムを、はじめよう」ハッシュ探索法をPythonで書く(データ格納編)

    「アルゴリズムを、はじめよう」をPythonで書く第三弾。第一弾の線形探索法のアルゴリズムはこちら。第二弾の二分探索法のアルゴリズムはこちら。

    アルゴリズムを、はじめよう

    第6章:ハッシュ探索法のアルゴリズム(データの格納)

    12,25,36,20,30,8,42という数字を要素11個の配列に格納する。ハッシュ関数は、ArrayD % 11。

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def insert():
        arrayD = [12, 25, 36, 20, 30, 8, 42]
        arrayH = [0] * 11
        for d in arrayD:
            k = d % 11
            max = len(arrayH)
            count = 0
            while count < max:
                if arrayH[k] == 0:
                    arrayH[k] = d
                    break
                else:
                    k += 1
                    if k >= max - 1:
                        k = 0
                        count += 1
        print arrayH
    
    if __name__ == '__main__':
        insert()
    

    だんだん合っているかどうか自身が無くなってきた。間違いや改善方法など、何でもご意見いただければ嬉しいです。

    ちなみに既にデータが入っていて衝突(collision)が起こった場合に別の場所を探す方法をオープンアドレス法と呼び、その中でも1ずつ隣が空いているか探していって、空いている段階で格納する方法を線形走査法と呼ぶらしいです。

    オープンアドレス法以外にもチェイン法というのがあるらしいです。

    こういう事は「アルゴリズムを、はじめよう」には全く書いてありませんでしたので、この本は本当にアルゴリズムの基本中の基本だけを書いているということでしょう。

    ここまでシンプルに基礎だけを書いてあるからこの本は分かりやすいのでしょう。なかなか自分の知っている事で書いた方が分かりやすいし、正確になるという事でも、対象読者のレベルを考えてあえて削るって難しいんですよね。

    それがうまくできているのでアルゴリズムの勉強を始める初心者向けの本としては素晴らしいと思います。

    4日目。ブセナテラスのラティーダで朝食

    朝食はブセナテラス内にあるラ・ティーダで食べました。

    バイキングというかブッフェ形式のお店なのですが、海に向かっている壁側が全面にオープンになっていて、最高に気持ちいい開放感があります。綺麗な真っ青な海が眼前に広がっており、そこでいただく朝食は最高です。

    南国のリゾート地にやって来たということを実感することができます。

    実は、旅に出る前から今回の旅行期間中はずーっと曇りか雨という事が分かっていたし、実際そうだったのですが、なぜか分からないけど、この日の午前中だけは空を覆っていた厚い雲がはるか彼方に消え去って、南国特有の明るい太陽が照らしてくれました。

    太陽の光と青い海のコントラストがほんとう美しくて感動しました。

    天照大御神様に心の底から感謝です。

    ブセナテラスのラ・ティーダのテラス席からのオーシャンビュー

    その後、外に出てプールサイドなどをちょっと散歩しました。

    沖縄の海が目の前にあるのに、あえてそれを眺めながらプールで泳ぐ事ができるというのが贅沢ですね。ホテル内のプールサイド周辺には滝が流れてたり、川があったりで、特に美しい。この辺りをブラブラ歩くだけでもブセナテラスに来てよかったと思えます。

    この時期は、さすがの沖縄もプールの水は抜かれてました。今年は夏に必ずもう一度来ようと思いましたね

    今回の沖縄旅行の間で、これだけ太陽が出てきたのはこの時間帯だけだったでした。雲に覆われている沖縄と青空が晴れ渡って太陽が出ている沖縄。同じ場所でも全く見える景色、感じる美しさなど全く異なっていました。

    沖縄に行く時はやっぱり天気の良い時を見計らって行きたいですね。

    この日はその後に美ら海水族館に行きましたが、その事は次回書きます。

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食

    2013-03-06

    「アルゴリズムを、はじめよう」二分探索アルゴリズムをPythonで書く

    「アルゴリズムを、はじめよう」をPythonで書く第二弾。第一弾の線形探索法のアルゴリズムはこちら

    アルゴリズムを、はじめよう

    第5章:二分探索法のアルゴリズム

    11,13,17,19,23,29,31という数字の中から17という数字をバイナリサーチのアルゴリズムで発見するという問題。

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def main():
        array = [11, 13, 17, 19, 23, 29, 31]
        flag = -1
        head = 0
        tail = len(array) - 1
    
        userNum = int(raw_input("Enter any number. : "))
    
        while head <= tail:
            center = (head + tail) / 2
            if array[center] == userNum:
                flag = center
                break
            elif array[center] < userNum:
                head = center + 1
            else:
                tail = center -1
            center = (head + tail) / 2
    
        if flag == -1:
            print "The number doesn't exitsts."
        else:
            print "The number is in the array[%d]." % flag
    
    if __name__ == '__main__':
        main()
    

    ユーザーが任意の数を入力できるようにしています。

    間違いや改善方法など、何でもご意見いただければ嬉しいです。

    2013-03-05

    「アルゴリズムを、はじめよう」をPythonで書く

    アルゴリズムの勉強を一からやるために伊藤静香さんの「アルゴリズムを、はじめよう」を買った。

    アルゴリズムを、はじめよう

    本の中ではC言語でサンプルが書かれているけど、自分がいつも使っているPythonで書く練習をしてみた。

    第4章:線形探索法のアルゴリズム

    4,2,3,5,1という数字の中から5という数字をリニアサーチのアルゴリズムで発見するという問題。

    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    def main():
        list = [4, 2, 3, 5, 1]
        ans = -1
    
        num = int(raw_input("Input the number."))
        for n, e in enumerate(list):
            if e == num:
                ans = n
                break
    
        if ans == -1:
            print "The number doesn't exits."
        else:
            print "The number is in the list[%d]." % ans
    
    if __name__ == '__main__':
        main()
    

    間違いや改善方法など、何でもご意見いただければ嬉しいです。

    for~elseを使ったスッキリと改良したものはこちら

    2013-02-25

    3日目。ブセナセラスのグラス底ボートに乗る。

    三泊目と四泊目の宿泊はブセナセラスしました。

    車をスタッフに任せてロビーに入ると、目の前に海が広がっていて開放感が最高です。去年始めてブセナテラスに来た時は、テンションマックスになって感動したのを覚えてます。

    ブセナテラスの開放感溢れるロビー。

    小さな子どもが二人いるので、宿泊できる部屋が限られてしまいますが、クラブフロアは大丈夫だったのでそこにしました。

    部屋からの眺めはこんな感じ。

    ブセナテラスのクラブフロアの部屋からの眺め

    クラブフロアはそれほど広いというわけでもなく、豪華というわけでもなく質素な感じでした。ANAインターコンチネンタル東京のクラブラウンジをイメージしてただけにちょっと意外でした。

    ブセナテラスのクラブラウンジの写真

    最初に出してもらったグァバジュースの炭酸割りがおいしくて、滞在中に何度もいただきました。

    ブセナテラスのクラブラウンジで飲んだグァバジュースの炭酸割り

    早くチェックインして特にやる予定も無かったので、近くにあるグラス底ボートに乗りました。

    去年、ホテルで少し話しをさせていただいたご夫婦から「子供が喜ぶから乗せてあげたら?」と言っていただいたんですけど、時間が無くて乗れなかったので今年こそは乗りました。

    そのご夫婦は、何とかクラブだか何とかってのに入っているらしくて、毎月いろんな場所に旅行に行くんだそうです。そういうのを利用して夫婦で老後を楽しむことができればいいなと思って、そのご夫婦のことはすごく鮮明に記憶に残っています。

    さて、グラスボートですが、船なんて何年も乗ってなかったのと、風が少し強かったこともあって、慣れてくると全然大丈夫でしたけど、最初は思ってたよりも揺れて怖かったです。

    思ってたよりも大量の魚が見られて何回も京都水族館で魚を見てる子供達も大興奮してました。同乗してた、団体の男の人たちもうるさいくらいくらい盛り上がってましたわ。

    ブセナテラスのグラス底ボートを真剣に覗き込んでいる息子達

    魚の名前は忘れたけど、これくらい大量の魚がいっぱい見られます。

    沖縄の魚の写真

    ブセナテラスに宿泊する時にはちょっとお金がかかるけど、せっかくなので見るといいと思います。特に子供がいる人にはおすすめ。

    【2013年2月沖縄旅行】記事一覧

    1. 連休中の突然の沖縄旅行。アメックスのプラチナコンシェルジュが超便利。
    2. スカイマークの安全性とサービスの質
    3. 1泊目。那覇空港近くのリーガロイヤルグラン沖縄に宿泊。
    4. 2日目。むら咲むら見学。
    5. ANAインターコンチネンタル万座近くのアラモアで夕食
    6. 二日目。ANAインターコンチネンタル万座に宿泊。
    7. 3日目。ブセナセラスのグラス底ボートに乗る。
    8. 4日目。ブセナテラスのラティーダで朝食
    9. 沖縄旅行記4日目。美ら海水族館の感想。
    10. 沖縄旅行4日目。ブセナテラスの和食レストラン真南風(まはえ)で寿司を食す
    11. 5日目。首里城の観光。
    12. 国際通り、鉄板焼きステーキレストラン「碧」(へき)で昼食