ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Pythonコミュの集合知プログラミング

  • mixiチェック
  • このエントリーをはてなブックマークに追加
出ます!
よろしく!!

だけじゃなくて。

以下特徴:

・「これを買った人はこんなものも買ってます」、検索エンジン、その他もろもろをどんどん実装。機械学習系の技術の舞台裏を、動くコードを書きながら詳細にわかりやすく解説。日本語もマトモですヨ!

・数学は裏に隠れてます。日本語で仕組みを解説してコードに落とし込んであります(基礎知識みたいなのは付録で解説)。コワクナイヨ!

・サンプルプログラムは全部Pythonで書いてます。Pythonの特徴全開!
 - チョー読みやすい
 - 短い
 - 複雑なデータ構造を簡単に扱っている

・もちろん原著にあった誤りなどは訂正済み。バグも取ってあるヨ!!

・日本語版は共訳者(主訳者)の當山先生による日本語テキスト処理の解説つき。彼はこの関係のテーマで博士論文絶賛執筆中です。

・各章のテーマはそれぞれが修論のテーマになるようなトピックなのに、本全体がその気になれば1日で読める感じのストレスの低さ。なかなか凄い本です。

以下オライリーのページ(http://www.oreilly.co.jp/books/9784873113647/toc.html)より転載

--------------------------
集合知プログラミング

Toby Segaran 著
當山 仁健、鴨澤 眞夫 訳
2008年07月24日 発売予定
392ページ
定価3,570円
ISBN978-4-87311-364-7
原書: Programming Collective Intelligence

--------------------------
概要

本書は現在注目を集めている「集合知(collective intelligence)」をテーマにした書籍です。機械学習のアルゴリズムと統計を使ってウェブのユーザが生み出した膨大なデータを分析、解釈する方法を、基礎から分かりやすく解説します。本書で紹介するのは「購入・レンタルした商品の情報を利用した推薦システム」、「膨大なデータから類似したアイテムを発見し、クラスタリングする方法」、「数多くの解決策の中から最適なものを探し出す方法」、「オークションの最終価格を予想する方法」、「カップルになりそうなペアを探す方法」、「遺伝的プログラミング」など。del.icio.us、eBayなどが公開しているWeb APIを使用した解説も本書の大きな特徴です。本書のサンプルコードは可読性に優れたPythonを使用していますが、他の言語のプログラマでも理解しやすいようにアルゴリズムを解説しています。日本語版ではYahoo!日本語形態素解析Webサービスを利用した日本語テキスト処理について加筆しました。
--------------------------
目次

訳者まえがき
はじめに

1章 集合知への招待
1.1 集合知とは何か?
1.2 機械学習とは何か?
1.3 機械学習の限界
1.4 実生活における例
1.5 学習アルゴリズムのその他の使用

2章 推薦を行う
2.1 協調フィルタリング
2.2 嗜好の収集
2.3 似ているユーザを探し出す
2.3.1 ユークリッド距離によるスコア
2.3.2 ピアソン相関によるスコア
2.3.3 どちらの類似性尺度を利用すべきなのか?
2.3.4 評者をランキングする
2.4 アイテムを推薦する
2.5 似ている製品
2.6 del.icio.us のリンクを推薦するシステムを作る
2.6.1 del.icio.usのAPI
2.6.2 データセットを作る
2.6.3 ご近所さんとリンクの推薦
2.7 アイテムベースのフィルタリング
2.7.1 アイテム間の類似度のデータセットを作る
2.7.2 推薦を行う
2.8 MovieLensのデータセットを使う
2.9 ユーザベース VS アイテムベース
2.10 エクササイズ

3章 グループを見つけ出す
3.1 教師あり学習 VS 教師なし学習
3.2 単語ベクトル
3.2.1 ブロガーを分類する
3.3.2 フィード中の単語を数える
3.3 階層的クラスタリング
3.4 デンドログラムを描く
3.5 列のクラスタリング
3.6 K 平均法によるクラスタリング
3.7 嗜好のクラスタ
3.7.1 データの取得と準備
3.7.2 Beautiful Soup
3.7.3 Zeboの結果をすくい取る
3.7.4 距離の基準を定義する
3.7.5 結果をクラスタリングする
3.8 データを2次元で見る
3.9 クラスタについてその他のこと
3.10 エクササイズ

4章 検索とランキング
4.1 検索エンジンとは?
4.2 シンプルなクローラ
4.2.1 urllib2を使う
4.2.2 クローラのコード
4.3 インデックスの作成
4.3.1 スキーマの設定
4.3.2 ページ内の単語を探し出す
4.3.3 インデックスへの追加
4.4 問い合わせ
4.5 内容ベースの順位付け
4.5.1 正規化関数
4.5.2 単語の頻度
4.5.3 ドキュメント中での位置
4.5.4 単語間の距離
4.6 インバウンドリンクの利用
4.6.1 単純に数えあげる
4.6.2 PageRankアルゴリズム
4.6.3 リンクのテキストを利用する
4.7 クリックからの学習
4.7.1 クリックを追跡するネットワークの設計
4.7.2 データベースのセットアップ
4.7.3 フィードフォワード
4.7.4 バックプロパゲーションによるトレーニング
4.7.5 トレーニングのテスト
4.7.6 検索エンジンとつなげる
4.8 エクササイズ

5章 最適化
5.1 グループ旅行
5.2 解の表現
5.3 コスト関数
5.4 ランダムサーチ(無作為探索)
5.5 ヒルクライム
5.6 模擬アニーリング
5.7 遺伝アルゴリズム
5.8 実際のフライトを検索する
5.8.1 Kayak API
5.8.2 minidomパッケージ
5.8.3 フライト検索
5.9 嗜好への最適化
5.9.1 学寮の最適化
5.9.2 コスト関数
5.9.3 最適化の実行
5.10 ネットワークの可視化
5.10.1 レイアウト問題
5.10.2 交差線のカウント
5.10.3 ネットワークの描画
5.11 さらなる可能性
5.12 エクササイズ

6章 ドキュメントフィルタリング
6.1 スパムフィルタリング
6.2 ドキュメントと単語
6.3 分類器のトレーニング
6.4 確率を計算する
6.4.1 推測を始める
6.5 単純ベイズ分類器
6.5.1 ドキュメント全体の確率
6.5.2 ベイズの定理の簡単な紹介
6.5.3 カテゴリの選択
6.6 フィッシャー法
6.6.1 特徴たちのカテゴリの確率
6.6.2 確率を統合する
6.6.3 アイテムを分類する
6.7 トレーニング済みの分類器を保存する
6.7.1 SQLiteを利用する
6.8 Blogフィードをフィルタする
6.9 特徴の検出の改良
6.10 Akismetを利用する
6.11 その他の手法
6.12 エクササイズ

7章 決定木によるモデリング
7.1 サインアップを予測する
7.2 決定木入門
7.3 ツリーのトレーニング
7.4 最高の分割を選ぶ
7.4.1 ジニ不純度
7.4.2 エントロピー
7.5 再帰的なツリー構築
7.6 決定木の表示
7.6.1 グラフィック表示
7.7 新しい観測を分類する
7.8 ツリーの刈り込み
7.9 欠落データへの対処
7.10 数値による帰結への対処
7.11 住宅価格のモデリング
7.11.1 Zillow API
7.12 "Hotness"のモデル化
7.13 決定木を使うべき場面
7.14 エクササイズ

8章 価格モデルの構築
8.1 サンプルデータセットの構築
8.2 K近傍法
8.2.1 近傍群の数
8.2.2 類似度を定義する
8.2.3 K近傍法のコード
8.3 重み付け近傍法
8.3.1 反比例関数
8.3.2 減法(引算)関数
8.3.3 ガウス関数
8.3.4 重み付けK近傍法
8.4 クロス評価
8.5 異質な変数
8.5.1 データセットの追加
8.5.2 次元のリスケール(縮尺変更)
8.6 縮尺の最適化
8.7 不均一な分布
8.7.1 確率密度の推測
8.7.2 確率のグラフ化
8.8 実データの利用 eBay API
8.8.1 ディベロッパキーの取得
8.8.2 コネクションのセットアップ
8.8.3 検索する
8.8.4 アイテムの詳細を得る
8.8.5 価格予測器の構築
8.9 K近傍法はどこで使うべきか
8.10 エクササイズ

9章 高度な分類手法:カーネルメソッドとSVM
9.1 matchmakerデータセット
9.2 このデータセットの難点
9.2.1 決定木による分類器
9.3 基礎的な線形分類
9.4 カテゴリーデータな特徴たち
9.4.1 Yes/Noクエスチョン
9.4.2 「興味があるもの」リスト
9.4.3 Yahoo! Mapsを使って距離を決定する
9.4.4 新たなデータセットの作成
9.5 データのスケーリング
9.6 カーネルメソッドを理解する
9.6.1 カーネルトリック
9.7 サポートベクトルマシン
9.8 LIBSVMを使う
9.9.1 LIBSVM の入手
9.9.2 セッション中での使用例
9.9.3 SVMをmatchmakerデータセットに適用する
9.9 Facebookでのマッチ
9.9.1 Developer Keyを取得する
9.9.2 セッションを作成する
9.9.3 友人データをダウンロードする
9.9.4 マッチのデータセットを作る
9.9.5 SVMモデルを構築する
9.10 エクササイズ

10章 特徴を発見する
10.1 ニュースのコーパス
10.1.1 情報源の選択
10.1.2 情報源をダウンロードする
10.1.3 行列に変換する
10.2 これまでのアプローチ
10.2.1 ベイジアン分類器
10.2.2 クラスタリング
10.3 非負値行列因子分解
10.3.1 行列に関する数学の簡単な紹介
10.3.2 これは記事の行列とどのような関わりがあるの?
10.3.3 NumPyを使う
10.3.4 アルゴリズム
10.4 結果を表示する
10.4.1 記事を表示する
10.5 株式市場のデータを使用する
10.5.1 取引量とは何か?
10.5.2 Yahoo! Financeからデータをダウンロードする
10.5.3 行列の準備
10.5.5 NMFを走らせる
10.5.6 結果を表示する
10.6 エクササイズ

11章 進化する知性
11.1 遺伝的プログラミングとは?
11.1.2 遺伝的プログラミング VS 遺伝アルゴリズム
11.2 ツリー構造のプログラム
11.2.1 Pythonでツリーを表現する
11.2.2 ツリーの構築と評価
11.2.3 プログラムを表示する
11.3 最初の集団を作る
11.4 解決法をテストする
11.4.1 単純な数学的テスト
11.4.2 成功の度合いを計測する
11.5 プログラムの突然変異
11.6 交叉(Crossover)
11.7 環境を作り上げる
11.7.1 多様性の大事さ
11.8 シンプルなゲーム
11.8.1 ラウンドロビントーナメント
11.8.2 実際の人間とプレイしてみる
11.9 さらなる可能性
11.9.1 数学的な関数を増やす
11.9.2 メモリ
11.9.3 さまざまなデータタイプ
11.10 エクササイズ

12章 アルゴリズムのまとめ
12.1 ベイジアン分類器
12.1.1 トレーニング
12.1.2 分類
12.1.3 ベイジアン分類器のコードの使用
12.1.4 強みと弱み
12.2 決定木による分類器
12.2.1 トレーニング
12.2.2 決定木分類器の利用
12.2.3 強みと弱み
12.3 ニューラルネットワーク
12.3.1 ニューラルネットワークのトレーニング
12.3.2 ニューラルネットワークのコードの利用
12.3.3 強みと弱み
12.4 サポートベクトルマシン
12.4.1 カーネルトリック
12.4.2 LIBSVMの利用
12.4.3 強みと弱み
12.5 K近傍法
12.5.1 スケーリングと過剰変数
12.5.2 K 近傍法コードの利用
12.5.3 強みと弱み
12.6 クラスタリング
12.6.1 階層的クラスタリング
12.6.2 K平均法クラスタリング
12.6.3 クラスタリングコードの利用
12.7 多次元尺度構成法
12.7.1 多次元尺度構成法のコードの利用
12.8 非負値行列因子分解
12.8.1 NMFコードの利用
12.9 最適化
12.9.1 コスト関数
12.9.2 模擬アニーリング
12.9.3 遺伝アルゴリズム
12.9.4 最適化コードの利用

付録A サードパーティによるライブラリたち
A.1 Universal Feed Parser
A.2 Python Imaging Library
A.3 Beautiful Soup
A.4 pysqlite
A.5 NumPy
A.6 matplotlib
A.7 pydelicious

付録B 数式
B.1 ユークリッド距離
B.2 ピアソン相関係数
B.3 加重平均
B.4 Tanimoto係数
B.5 条件付き確率
B.6 ジニ不純度
B.7 エントロピー
B.8 分散
B.9 ガウス関数
B.10 ドット積

付録C 日本語のテキスト処理
C.1 形態素解析ツール
C.2 Yahoo!日本語形態素解析Webサービス

索引

--------------------------

7月24日発売予定。よろしく!!

コメント(36)

私はまだ学生ですが、将来役立つかも
そうでなくても、おもしろそうですね

あと半年早く出版されていれば、バイトに役立つかも知れなかったんですが
>>6

意外に思うかもしれませんが、これでも日本って「本の価格は安い」国なんですよ。

一般的にアメリカ人は本を読まないので、総体的に本の価格は高め、なんです。
みなさんありがとうございます。こいつは本当に凄い本です。説明してる概念はこの分野をかなり広くカバーしているのに、全部コードに落とし込んで、しかも驚くほど解りやすくて読みやすい。原著者の頭の良さを浴びながら楽しく訳せました。

> でも、これってオリジナルで4000円以上なのに

滅多にないことですが、こいつはセールスが期待できるために戦略価格で出したかもしれんです。ちゃんと全訳+オリジナル付録付きですよ。

まーどこもカツカツでやってます。もっと高い本がどんどん売れる状況なら、良い本であれば片っ端から翻訳、ということも出来るのだけど、現実には営業上の上限価格があるわけです。定価が上がる本だとページを削らざるを得ない場合なども多くて、削れない場合には、すっごく良い本でも企画が通らないことすらあります。
どこにぶら下げるか迷いましたが,関連がありそうなこのトピに書かせてもらいます

http://www.pybrain.org/
pythonで書かれた機械学習のライブラリです
10月1日からソースが公開されるそうです.
初心者トピックから、こちらに本のトピックがあったので
移動してきました。

たまたま図書館でこの本を見つけて以来、
かなりミーハー的にハマっております。(*^_^*)

もしヒープソートのアルゴリズムに「おぉ!」と
感激した経験のある方は…多分この本、ハマります。

例えば、
「SVM(サポートヴェクトルマシーン)は素晴らしい
解答を与えてくれはするが、その理由について
あなたは知ることはできないだろう。」

って、決まってますよねぇ。(*^^)v

現在まだ、最初から3章の真ん中辺りをぼちぼち読んでます。
それと後ろから?付録のC,B,Aと12章まで…^m^

基本構造としては、

1.生データの収集
3章を例にすれば、関係ブログやRSSから文章を集める。
WEB APIの使用。
2.事前準備
その文章に含まれている単語と数を調べる。
3.機械学習のアルゴリズム適用
単語の頻度によって類似ブログを体系化する。
4.検証
それをグラフに描いて、その妥当性を判断する。

の流れのようです。

これまで1や3のステップは結構解説したものは
ありましたが、全体を通して包括的にコードも含んで
解説した本はなかったような…(・・?

ところで、
付録Cにある日本語形態要素解析ツールの
MecabをPythonから扱う例がありました。↓

http://d.hatena.ne.jp/kenkitii/20060227/p1

機械翻訳された文章、笑えます。\(^o^)/
昔読んだ「人工無能は考える」ってページ、面白かったような。

> 機械翻訳された文章、笑えます。\(^o^)/

人工無能の強化に遺伝アルゴリズムが使えないだろうか、などと考えてしまいますね。
どうも良く分からないので、教えて下さい。m(__)m

さて、本書のサンプルコードは下記URLで公開されているので
引用しても著作権上の問題はないかと。(*^^)v↓

http://examples.oreilly.com/9780596529321/

下記コードは本書3章にあるhclusterという関数です。↓

def hcluster(rows,distance=pearson):
distances={}
currentclustid=-1

# Clusters are initially just the rows
clust=[bicluster(rows[i],id=i) for i in range(len(rows))]

while len(clust)>1:
lowestpair=(0,1)
closest=distance(clust[0].vec,clust[1].vec)

# loop through every pair looking for the smallest distance
for i in range(len(clust)):
for j in range(i+1,len(clust)):
# distances is the cache of distance calculations
if (clust[i].id,clust[j].id) not in distances:
distances[(clust[i].id,clust[j].id)]=distance(clust[i].vec,clust[j].vec)

d=distances[(clust[i].id,clust[j].id)]

if d<closest:
closest=d
lowestpair=(i,j)

# calculate the average of the two clusters
mergevec=[
(clust[lowestpair[0]].vec[i]+clust[lowestpair[1]].vec[i])/2.0
for i in range(len(clust[0].vec))]

# create the new cluster
newcluster=bicluster(mergevec,left=clust[lowestpair[0]],
right=clust[lowestpair[1]],
distance=closest,id=currentclustid)

# cluster ids that weren't in the original set are negative
currentclustid-=1
del clust[lowestpair[1]]
del clust[lowestpair[0]]
clust.append(newcluster)

return clust[0]

この関数の説明で
「この関数によって返される最後のクラスタを
再帰的に調べることで、すべてのクラスタと
終端ノードを再構築出来る。」
との記述があります。

自分の理解では、最後の

return clust[0]

は巨大な一つのクラスタにまとめられた最終結果であり
実際の処理は、コードの始めのほうにある

while len(clust)>1:

で、クラスタのリストの数が1個になるまで、
繰り返されているだけのように思うのですが…

つまり再帰手法である自らの関数をその関数中で
呼ぶような処理はされてないような…(・・?
自分のイメージとしては次の関数↓が典型的な再帰と思ってました。

def printclust(clust,labels=None,n=0):
# indent to make a hierarchy layout
for i in range(n): print ' ',
if clust.id<0:
# negative id means that this is branch
print '-'
else:
# positive id means that this is an endpoint
if labels==None: print clust.id
else: print labels[clust.id]

# now print the right and left branches
if clust.left!=None: printclust(clust.left,labels=labels,n=n+1)
if clust.right!=None: printclust(clust.right,labels=labels,n=n+1)
見てみました。

えーと、これは
「関数が返す最終結果」を「再帰的に調べる」
わけですね。
最終結果を返すのに再帰を使っていると書いてあるわけではないという。

もともとこの「結果」がどういうものかといえば(http://kiwitobes.com/PCI_Code.zipのコードを実行してます。たぶん米オライリーにあるのと同じやつ)、

>>> import clusters
>>> blognames,words,data=clusters.readfile('blogdata.txt')
>>> clust=clusters.hcluster(data)
>>> clust
<clusters.bicluster instance at 0x11894b8>
>>> dir(clust)
['__doc__', '__init__', '__module__', 'distance', 'id', 'left', 'right', 'vec']
>>> clust.vec
[0.016345580108463764, 0.0020031116437166929, 0.13414975046180189, 0.0054844929254613817, 0.21499378042062744, 0.0055198066402226686, 0.14761740545509383, 0.50696131773293018, 0.036649252753704786, 0.17329716356471181, 0.56165573210455477,
〜長すぎるので数十行くらい略〜
0.12603041052352637, 0.17111116141313687, 0.043559088837355375, 0.57887655985541642, 0.29291341931093484, 0.022593141242396086, 0.01735077949706465, 0.067445024440530688, 0.039114468672778457, 0.7441698950715363, 0.60890791530255228, 0.056803006096743047]
>>> clust.id
-98
>>> clust.distance
0.9960012161819306
>>> clust.left
<clusters.bicluster instance at 0x7bd418>
>>> clust.right
<clusters.bicluster instance at 0x1189468>
>>>

という感じで、左右のクラスターを保持した物。
んで、まさに湯加減?パンダさんのおっしゃる通り、printclustの方で「再帰的に調べる」ことをやっているわけです。

  # indent to make a hierarchy layout
  for i in range(n): print ' ',
  if clust.id<0:
    # negative id means that this is branch
    print '-'
  else:
    # positive id means that this is an endpoint
    if labels==None: print clust.id
    else: print labels[clust.id]

  # now print the right and left branches
  if clust.left!=None: printclust(clust.left,labels=labels,n=n+1)

(http://mixi.jp/view_bbs.pl?id=20226712&comm_id=6869 を使って整形)
最初と最後の行が無かったり行の前後がおかしくなってたので貼り直し。

def printclust(clust,labels=None,n=0):
  # indent to make a hierarchy layout
  for i in range(n): print ' ',
  if clust.id<0:
    # negative id means that this is branch
    print '-'
  else:
    # positive id means that this is an endpoint
    if labels==None: print clust.id
    else: print labels[clust.id]

  # now print the right and left branches
  if clust.left!=None: printclust(clust.left,labels=labels,n=n+1)
  if clust.right!=None: printclust(clust.right,labels=labels,n=n+1)
>カモサワ逃げ道マサオさん

ご回答有難う御座いました。

ところで全然関係無い話で申し訳ないのですが、
自分の場合、本コメント欄に投稿したコードの
先頭インデント(空白文字)が消えます。

これってPythonの場合は致命的ですよね。(^_^;)

どうすれば、インデントが表示されるように
なるのでしょうか?
>湯加減?パンダさん
横レス失礼します。
15の逃げ道さんのコメントの最後の部分で紹介されている、麦角さん作のスクリプト
を使えばmixi投稿用に変換できますよ。
>ひろーさん

どうも有難う御座います。
ただ、Pythonの使い方がもう一つ不慣れで…(^_^;)

>使い方は、、、見れば分かりますね。

麦角さんのスクリプトどうやって使うのでしょうか?

ファイルIOがないようなので、
コンソールからコードを打ち込んで
コンソールに表示されるとか…(・・?
>湯加減?パンダさん
stdinから入力して、stdoutに出力するので、例えばスクリプトを
mixi.pyとして保存したとすると、

> python mixi.py < input.txt > output.txt

のように実行すれば、良いです。

>ひろーさん

どうも有難う御座いました。
では試しに上記のdef hclusterをやってみました。

そうすると、下記エラー表示が…↓

本文は全角2000文字以内にして下さい。
※半角カタカナは全角としてカウントします。
※文字コードにより換算される文字数が異りますのでご注意下さい。
※改行、スペースも文字としてカウントします。

文字数がオーバーしちゃったようです。(^_^;)
そこで麦角さんのスクリプトを試してみました。↓

import re, sys

while 1:
    line = sys.stdin.readline()
    if line == '': break
     
    mo = re.match( r'^( +)', line )
    if mo:
        line = re.sub( r'^( +)', '&''amp'';''nbsp'';'*len(mo.group(1)), line )

    sys.stdout.write( line )
さて、上記のdef hclusterですが、もう一つ
素人っぽい質問があります。

クラスのbiclusterはメンバー変数しか保持してない
ようなので、わざわざ↓

clust=[bicluster(rows[i],id=i) for i in range(len(rows))]

のようにクラスのインスタンスを多数生成することなく
単なる辞書で

clust=[{'vec':rows[i],'left':None,'right':None,'distance':0.0,'id':i,} for i in range(len(rows))]

で代用出来ないのでしょうか(・・?

タイプの量は若干増えますが、(^_^;)
スピードはこちらの方が早そうに思うのですが。
class bicluster:
  def __init__(self,vec,left=None,right=None,distance=0.0,id=None):
    self.left=left
    self.right=right
    self.vec=vec
    self.id=id
    self.distance=distance

ですよね?おそらく、かわらないですよ。
理由はobjectは、__dict__というdictを持っているから。

スピードがほしければCでmodule書こう、
ideaを試す速度が大事、コードは可読性をもってよしとするのが
Pythonのスタイルです。

むしろPEP8に従ってないことのほうが問題かな。

富豪的プログラミングで行きましょう。:)
>noriさん

>富豪的プログラミングで行きましょう。:)

確かに可読性優先ってことはありますよね。(*^^)v

でも、例えば本書9章P215にある下記コードなんか
富豪的過ぎて?返って可読性を損なっているような
気もします。

allnumのTrueとFalseでファイル別に処理を切り替えて
いるなら、わざわざクラスを使ってそれを別処理に
することなく、loadmatch関数の中で用は
足りるのに、と思われませんか(・・?

class matchrow:
  def __init__(self,row,allnum=False):
    if allnum:
      self.data=[float(row[i]) for i in range(len(row)-1)]
    else:
      self.data=row[0:len(row)-1]
    self.match=int(row[len(row)-1])

def loadmatch(f,allnum=False):
  rows=[]
  for line in file(f):
    rows.append(matchrow(line.split(','),allnum))
  return rows
麦角さんのスクリプトを自分のPython練習のため
少し手を加えました。↓

import re, os
 
#ファイル名は適当に変更して下さい。
fr = open('in.txt','r')
fw = open('out.txt','w')
while 1:
    line = fr.readline()
    if line == '': break
     
    mo = re.match( r'^( +)', line )
    if mo:
        line = re.sub( r'^( +)', '&''amp'';''nbsp'';'*len(mo.group(1)), line )

    fw.write( line )

fr.close
fw.close

ただ、プログラム起動時に< in.txt > out.txtとタイプする手間を
省いただけですが…^m^
どっちかというとhackなんだと思う。test code無し、こねくりまわした感じがしない。指が導くままに書いたのではないかと思う。

interviewでもpythonはアイディアをためすときに楽でいいみたいなことを言っていた。書き手のフランクさが伝わってきますね。

全部にunittestつけてcoverageをチェックした後、かきなおすのもいいんじゃないでしょうか。
確かに機能の切り分けの問題なんでしょうね。

窓口の関数は、CSVファイルに対応するだけに
しておき、ファイルの中味別の処理については
クラスで規定するような…

たまたま今回は二種類しかないが、これが
何十種類もあればこの方がすっきりしている、っと
著者はdef loadmatchを書きながら、ふと思いついて
class matchrowを書いた、とかね。(*^^)v
ところで本書でも紹介されている、NumPyを
インストールしようと下記URLに
アクセスしました。↓

http://sourceforge.net/project/showfiles.php?group_id=1369&package_id=175103

WindowsベースのPython2.5用のEXEを
ダウンロードしましたがファイルとして
認識しません。(・・?

これは自分のパソコンにはActivePython2.6しか
入ってないせいでしょうか?
すみません。上記は↑どうも自分のパソコンに入れた
ブラウザー機能の不具合によるものでした。

さて次なんですが、本書にあるUniversal Feed Parserも
インストールしまして、サンプルにあるとおり:

import feedparser

d = feedparser.parse("http://feedparser.org/docs/examples/atom10.xml")
print d['feed']['title']

と入力して実行ボタン(PyScripter1.9.9.6)
を押したら、下記のエラーメッセージが出ました(・・?

exceptions.AttributeError: 'module' object has no attribute 'parse'

feedparserのモジュールにparseが無い?

どうも色々と質問を重ねて申し訳ありませんが、
よろしくご教示願います。
current direcotryにfeedparser.pyがあるに一票。
どうも有難う御座いました。
feedparserテスト用のコード名をfeedparserに
しちゃったようで…(^_^;)

お陰で名前を変えたら作動したのですが
下記↓Warningが(・・?

sys:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
Sample Feed

どういうことでしょうか?
http://docs.python.org/whatsnew/2.5.html

A new warning, UnicodeWarning, is triggered when you attempt to compare a Unicode string and an 8-bit string that can’t be converted to Unicode using the default ASCII encoding. The result of the comparison is false:

>>> chr(128) == unichr(128) # Can't convert chr(128) to Unicode
__main__:1: UnicodeWarning: Unicode equal comparison failed
to convert both arguments to Unicode - interpreting them
as being unequal
False
>>> chr(127) == unichr(127) # chr(127) can be converted
True

Previously this would raise a UnicodeDecodeError exception, but in 2.5 this could result in puzzling problems when accessing a dictionary. If you looked up unichr(128) and chr(128) was being used as a key, you’d get a UnicodeDecodeError exception. Other changes in 2.5 resulted in this exception being raised instead of suppressed by the code in dictobject.c that implements dictionaries.

Raising an exception for such a comparison is strictly correct, but the change might have broken code, so instead UnicodeWarning was introduced.

(Implemented by Marc-André Lemburg.)

んで、手元の2.4で試したときにparseが返す辞書の中に
'title': u'Sample Feed',
とかある。この辺でね?

http://mogawa.blogspot.com/2009/01/python.html
これとfeedparser.pyがcodingを指定していないことを
あわせて考えると答えが出ませんか?
丁寧なご説明有難う御座いました。
下記のコードでWarningは止まりました。↓

#-*- coding: utf-8 -*-
import feedparser

d = feedparser.parse("http://feedparser.org/docs/examples/atom10.xml")

str = d['feed']['title']

print str.decode('utf-8')


お陰で集合知プログラミングの環境設定も
大詰めになっております。

さて、話はNumPyに戻りますが、自分のパソコンには
Python2.6しかインストールされておりません。

NumPyが配布しているWindowsインストーラーは2.5が最新で
それをダウンロードして起動すると2.5が無いと言って
それ以上動きません。

やはりPython2.5もインストールする必要があるのでしょうか?

試しにNumPy Independent版をダウンロードして解凍、
python setup.py installでインストールしてみました。
そこで、

from numpy import *

a = matrix([1,2,3],[4,5,6])
b = matrix([1,2],[3,4],[5,6])

print a * b

のプログラムを実行すると↓

exceptions.ImportError: No module named numpy

エラーが出ます。

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Python 更新情報

Pythonのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング