[[FrontPage]]
#contents

2009/02/01からのアクセス回数 &counter;

** はじめに [#g49145b4]
集合知の3章(一部欠損)を[[Googleのブック検索>http://books.google.com/books?id=-SqPR4iFWD8C&pg=PA49&lpg=PA49&source=web&ots=8u31im4WnN&sig=lp1mG2ZyAGCZ5pGf3EIofR9F8OU&hl=ja&sa=X&oi=book_result&resnum=8&ct=result#PPA31,M1]]
から閲覧することができます。

また、なぜか[[原書のPDF>http://1a26.com/pdf/Programming/Programming%20Collective%20Intelligence.pdf]]
がアップされています。

オリジナルのソースは、[[原書著者Tobesのページ>http://blog.kiwitobes.com/?p=44]]から[[PCI_Code.zip>http://kiwitobes.com/PCI_Code.zip]]と
してダウンロードできます。


** 日本語の分かち書き [#w2a4133c]
ブロガーのフィードの単語を処理するには、日本語の形態素解析を行う必要があり、
まずはchasenを使うことにします。

*** chasenのインストール [#l20a0d93]
chasenは、MacPortを使って

#pre{{
$ sudo port install chasen
}}
でインストールしました。

chasenの起動オプション
- Tiger: -i s 
- Leopard: -i w 

を指定します。((Tigerでは、実行結果が文字化けで表示されます))

動作確認のため、1.txtというファイル(文字コードはShift_JIS)に
#pre{{
オリジナルのソースは、原書著者TobesのページからPCI_Code.zipと してダウンロードできます。
}}
を入れ、chasenを実行
#pre{{
$ chasen -i s <1.txt >1.out
}}
とすると1.outには、以下のような出力がでます。
#pre{{
オリジナル	オリジナル	オリジナル	名詞-一般		
の	ノ	の	助詞-連体化		
ソース	ソース	ソース	名詞-一般		
は	ハ	は	助詞-係助詞		
、	、	、	記号-読点		
原書	ゲンショ	原書	名詞-一般		
著者	チョシャ	著者	名詞-一般		
T	ティー	T	記号-アルファベット		
o	オー	o	記号-アルファベット		
... 途中省略 ...		
でき	デキ	できる	動詞-自立	一段	連用形
ます	マス	ます	助動詞	特殊・マス	基本形
。	。	。	記号-句点		
EOS
}}


*** python_chasenのインストール [#fdf57b8d]
[[python_chasen-0.2>http://www.domen.cx/yusei/pub/python_chasen-0.2.tar.gz]]を使ってPythonからchasenを使います。ダウンロードして、~/localに展開します。

#pre{{
$ cd local
$ tar xzvf python_chasen-0.2.tar.gz
$ cd python_chasen
}}

Tigetでは、-i sオプションが必要なので、chasen.cを変更します。52行を
#pre{{
char *opt[] = { "chasen", "-i", "s", NULL};
}}
とします。

次に、以下の手順でbuild, installをします。
#pre{{
$ python setup.py build_ext --include-dirs=/opt/local/include --library-dirs=/opt/local/lib/
$ sudo python setup.py install
}}

*** 分かち書き処理(split.py) [#n69b149a]
準備ができたので、分かち書き処理を行うpy_chasen.pyを作成します。
日本語の処理をスムーズに行うために以下のPythonスクリプトはすべてUTF-8でencodeされたファイルに記述し、先頭に以下のコードを追加します。
#pre{{
# -*- coding: utf-8 -*-
import japanese
}}

japanese.pyは、
#pre{{
import sys
import codecs
# if you use the jython, comment out next line.
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
}}

分かち書き処理では、
- 形容詞、形容動詞、副詞、連体詞、名詞、動詞、未知語
のオリジナル形を単語とするようにします。

split.pyは、以下のようになります。
#pre{{
# -*- coding: utf-8 -*-
import japanese
import re
from chasen import sparse

def split(txt):
    text = sparse(txt.encode('shift_jis', 'replace')).decode('shift_jis', 'replace')
    ret = []
    lines = text.splitlines()
    parts = [u'^形容詞.*', u'^形容動詞.*', u'^副詞.*', u'^連体詞.*', u'^名詞.*', u'^動詞.*', u'^未知語.*']
    for line in lines:
        words = line.split('\t')
        if len(words) >= 4:
           if len(words[2]) > 0:
               surface = words[2]
           else:
               surface = words[0] 
           feature = words[3]
           for part in parts:
                pat = re.compile(part)
                if pat.match(feature):
                    ret.append(surface)     
    return ret

# テスト用のコード
txt = 'オリジナルのソースは、原書著者TobesのページからPCI_Code.zipと してダウンロードできます。'
for word in split(txt):
    print word
}}

chasenのsparseに渡すときに、コードをshift_jisにencodeし、戻り値は、shift_jisからdecodeとして処理します。

未知語の場合、オリジナル形がないので、surfaceは単語そのものとしました。

テスト用のコードを実行すると以下の出力がでます。
#pre{{
オリジナル
ソース
原書
著者
ページ
から
する
ダウンロード
できる
}}

英語の単語がすべて消えていることにお気づきでしょうか。
これは、chasenを使った場合の欠点ですが、後述する方法にこの問題を回避しました。


** コメント [#tbf261fc]
この記事は、

#vote(おもしろかった,そうでもない,わかりずらい)

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc