Pythonメモ

とりあえず旧サイトよりコピペ。
書式を統一するのはまた今度・・・いや、いつか・・・(--;
 
2010年に「入門 自然言語処理」が出ましたね。英名が「Natural Language Processing with Python」。Pythonって書いちゃってますよね。
とりあえず、12章の日本語についての記述がある部分はネットでも公開されてる。んで、同じコトしてみたいときはコピペで出来るから便利w
http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html
ま、1、2章って真面目に読んで疲れて、3、4章辺りは流し読み。そして12章を読むと。あれ?真面目に読んだの3/12章だけ?しかも12章もWordNetと形態素解析以外は流し読み…(--;
ページ数で言うと約100/約520ページ……20%も超えてないだろうな……あはは☆(^^;

programing

  • 変数宣言はいらない。
  • dictはkeyを入れたら対応する内容が出てくるから便利そう。

ソースの書き方

1行目:#!/usr/local/bin/python
2行目:# coding: sjis または # cording = sjis 


Emacsを使う人は2行目を# -*- cording: sjis -*-らしい!
あと、ファイルのエンコード指定は1行目か2行目じゃないとダメ!3行目に書いたら何書いてんの!?って怒られます。
pythonで利用できるエンコード名としては、以下があげられる!ただ、python2.4以上・JapaneseCodecsなどをインストールしている場合のみだそうです。

エンコード名 pythonでのエンコード名
Shift-JIS sjift-jis、shift_jis、sjis
ISO-2022-JP(JIS) iso-2022-jp
EUP-JP euc-jp
UTF-8 utf-8
windowsだとsjisだし、linux・unixだとeuc-jpですかねぇ。
chasenとかの出力ファイルはmbcsだったw
今まで文字コードをわざわざ変えて使ってたのバカみたいww

プログラムのメモ

  • メモ帳についての注意

保存時の文字コードに注意!!!!!!

  • 値の初期化

たまにリストのレンジ足りないって怒られる。で、なんで怒られるのかずっとわからずに悩んでたというw
エラー検索したらすぐに以下のやつが出てきたから「…あぁ!」と導入した私。
忘れっぽい私用のメモですから…(^^;

a=[""]
↓
IndexError: list assignment index out of range
↓
a=[""] * 100

でも、100個より多くなったときは対応できないのが難点だよね。今はコレでいいことにしといてください…(--;
ただ、多めに取ってるから空要素が邪魔って時は、

del(a[i:])

で、i以下を消せるんで、今はwhile文を回して、回し終わってaに入った要素数(i)を数えといてそれを使って消去してます。
絶対もっと効率的な方法ありますよね…(--;

#全て半角英数字か?
#Pythonの正規表現で、渡された文字列が全て半角英数字かチェックします。(UTF-8向け) 
import re
regexp = re.compile(r'^[0-9A-Za-z]+$')
result = regexp.search("aiueoあいうえお") #ココの(カッコ)内にチェックしたいものを入れると。
if result != None :
    print(u"すべてが半角英数字である".encode('shift_jis'))
else :
    print(u"すべてが半角英数字ではない".encode('shift_jis'))
#↓
#"全て半角英数字である"

reを使った正規表現のプログラムなんて考えたこともなかった私w
でも、半角英数以外を省くプログラム組みたかったから、ググったら出てきたんですよ。やっぱググるって大事。

演習問題

初級

単語マッチング1

テキストファイル(何でもよい)を読み込んで、(例えば)「事件」という単語が含まれる行だけを画面に出力せよ。

#!/usr/local/bin/python
# coding: sjis
import codecs
uf=codecs.open("example_1-1.txt")
for uline in uf.readlines():
   if uline.find("事件")!=-1:
       print uline


codecsのモジュールをimportすることで、日本語(2バイト)で書かれた文字も読み込める。
通常、f=open("*.txt")であるが、uf=codecs.open("*.txt")とする必要がある。
open内がファイル名のみの場合、デフォルトは読み込み。正確にはf=open("*.txt","r")

モード 意味
r ファイル読み込み。ファイルがなければエラー。
w ファイル書き込み。ファイルがなければ作成し、あれば初期化。
a 末尾に追記。ファイルがなければ作成し、既存ファイルに書き込みたいときに利用。
r+、w+、a+ 上記+読み込み・書き込み両方可能。

ファイル名は絶対パスまたは相対パスで。ソースと同じ場所にあればそのままで可。
for uline in uf.readlines(:によって、ufと名付けて開いたファイルを1行ずつ読み取り、ulineに代入。
if uline.find("事件")!=-1により、uline内で"事件"を探す(find)。

引用表現抽出

テキストファイルを読み込んで、「...」で括られている部分(引用表現)を抽出、表示せよ。

#!/usr/local/bin/python
# coding: sjis
import codecs
uf=codecs.open("example_1-2.txt")
for uline in uf.readlines():
   if uline.find("...")!=-1:
       c=uline.split("...")
       print c[1]


uline.split("...")で...ごとに切って文字列のリストをつくって返す。区切り文字は削除。
uline="こんにちは...今日...は...晴れ...です"⇒uline=["こんにちは","今日","は","晴れ","です"]となる。

中級

名詞連続

1. 入力ファイル中から、NのN(Nは任意の名詞、例えば「私の本」)及びNN(=名詞連続、例えば「参考図書」)の形式になっている表現すべてを出力せよ。

#!/usr/local/bin/python
# coding: sjis
a=0
b=[]
import codecs
uf=codecs.open("example_2-1.txt")
for uline in uf.readlines():
   if a==0:
       if uline.find("名詞")!=-1:
           a=a+1
           c=uline.split("\t")
           b.append(c[0])
   if a==1:
       if uline.find("の")!=-1:
           a=a+1
           c=uline.split("\t")
           b.append(c[0])
   if a==2:
       if uline.find("名詞")!=-1:
           c=uline.split("\t")
           b.append(c[0])
           print "".join(b)
           b=[]
           a=0


b.append(c[0])はcというリストの1つの目の要素をbというリストの末尾に追加するという意味。
また、"".join(b)はbというリストの区切りをなくして、連続にする。""の間に入れたものが区切り文字として間に挿入される。

活用一覧作成

テキストファイルからそこに出現した動詞をすべて抽出し、使われていた活用だけを一覧表にまとめよ。

動詞 未然 連用 終止 連体 仮定 命令
食べる 食べ 食べる 食べる 食べれ
行く 行か 行き 行け


#!/usr/local/bin/python
# coding: sjis
import codecs
uf=codecs.open("example_2-2.txt")
for uline in uf.readlines():
   b=[]
   if uline.find("\t"+"動詞")!=-1:
       c=uline.split("\t")
       b.append(c[2]+"\t")
       if uline.find("未然形")!=-1:
           b.append(c[0])
       elif uline.find("連用形")!=-1:
           b.append("\t"+c[0])
       elif uline.find("終止形")!=-1:
           b.append("\t"+"\t"+c[0])
       elif uline.find("連体形")!=-1:
           b.append("\t"+"\t"+"\t"+c[0])
       elif uline.find("仮定形")!=-1:
           b.append("\t"+"\t"+"\t"+"\t"+c[0])
       elif uline.find("命令形")!=-1:
           b.append("\t"+"\t"+"\t"+"\t"+"\t"+c[0])
       print "".join(b)


これまでの集大成?なのでコメントなし!

install and download

  • PyScripterは便利!(free)
→pythonのプログラムを書きながら実行できるし、日本語です!
やっぱりプログラム書くのに専用のアプリ使いたいのは、私≒PC初心者って感じなんですかねぇ;
  • Geanyも便利!
Geanyはpython専用ではないから、PyScripterよりは劣るかもしれないが、linuxでも使えるし、他の言語もいっぱい使える!詳しくは杢:windows関係メモにて。

nltk (Natural Language ToolKit)

自然言語処理入門に書いてあったからやってみた。英語の公式ページ→http://www.nltk.org/
nltkはpython2.6を希望らしいから、2.6になってるのをチェックしつつ、windowsのnltkをダウンロード。msiは面倒だからやっぱりexeでw
PyYAMLについても自然言語処理入門に載ってたけど、あんまり興味なかったから落としたけどやってない。てか、何らかの理由があった気がするけど、覚えてない。
ツールの中には英語のコーパスとかもあり。私はWordNetを使わせてもらってますm(_ _)m
コーパスがあるだけじゃなく、読み込むためのプログラムとかも入ってるから本の通りにwやればできる。

めも。

  • import nltk

コマンドプロンプト(場所が基本位置以外)でpythonを起動。そしてimport nltkをやると…できないw
そしてpyscriperも同じく使えないw
] どちらもfrom nltk.corpus import wordnet as wnのcorpusって何ですかって聞かれた時は泣くかと思った。どうやらその前のimport nltkから総無視くらってる。
pyscripterの方はいろいろと見てみたけどまだ原因不明。知ってる人は教えてくださいf(^^;
また、コマンドプロンプトの方は場所を基本位置(ownerのとこ)でpython起動→実行したらできた。
起動しないでpython wn.py的なのは…そいえばやってみるの忘れてた!やってないw

WordNet

真嘉比さんに助けてもらって、やっとフロントエンドのプログラムが理解でき"始めた"っぽい。
とりあえずわかったとこはまとめておく。んで、もうちょっとわかったらもうちょっと書く。…私が忘れないために。
もうしばらく戦いは続く…?f(^^;

日本語WordNet→ http://nlpwww.nict.go.jp/wn-ja/

wnjpn-0.9.dbというデータベースファイル(.db)を元にしたプログラムを書いていて、それも上記のサイトで落とせるはず。
(データの解説サイト見っけ♪:http://www5.atpages.jp/necross/paper/thesaurus.html)

あ!これにはwn.pyというプログラムが必要。英語のWordNetと一緒にあるはずなので、探すべし。
一応、フロントエンドプログラムをつないどく。
フロントエンドプログラム→ https://gist.github.com/79057

やってみたがあったから、つないでみた。http://www.nal.ie.u-ryukyu.ac.jp/note/note_detail/1471/

真嘉比さんに解説してもらった結果わかったものを以下にあげてみよう。(私は全く使えないダメ子なので;)↓

SQLite3

dbファイルを読み込むために必要なライブラリ。
それはPython2.5以上には標準仕様。
フロントエンドでimportしてる。大事。
参照:http://www.gesource.jp/programming/python/code/0013.html

あれ?なんでdbの勉強に…?(;_;)

execute

レコードの取得?

c = con.execute(u"select * from 社員")
for row in c:
    print row[0], row[1], row[2]
↓
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
select * from ○○ where ××
  • はよくある全部って意味。fromはテーブル指定。whereはレコードの条件。…って書いてた。dbの構造がよくわかってないから単語に対してぽかーんだけど、wn.pyの例で空気を読むべし。
cur = conn.execute("select * from word where lemma=?",(lemma,))
※lemmaはプログラムの前の方で見出し語が入ってるよ。

例でわからなくて、「自分、KYだ…」って思う方は下の参照を読むべし。…私にとってはよくわからないが、知っている人にとってはわかりやすいんだろう…たぶん。
参照:http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database8.htm

fetchone

残りのレコードを取得?
カーソルのfetchone()メソッドを呼ぶと残りのすべての行を取得できる?

c = con.execute(u"select * from 社員")
row = c.fetchone()
print row[0], row[1], row[2]

print "---"
for row in c.fetchall():
    print row[0], row[1], row[2]
↓
橋本 26 広報部
---
小泉 35 営業部
亀井 40 営業部

…問題は、どんな入力によりどんな出力が返ってくるかをわかることであって、その間のブラックボックスなファンクションは置いとけばいいと思う!

namedtuple

名前付けれて、それを使ってアクセスできる良い子。

Word = namedtuple('Word','wordid lang lemma pron pos')

http://d.hatena.ne.jp/mopemope/20081128/p3

with chasen

なんかchasen.pyってのがネット上に上がってる。これも「入門 自然言語処理」からぽ。
まだ使ってないんだけど、nltkと日本語コーパスとChaSenによる形態素解析ってのがキーワードっぽい。大事だから再度言うと、使ってないからよくわかってない。もうちょい待って(^^;
とりあえず、アドレスだけメモメモ。

○chasen.pyがあるトコ
http://code.google.com/p/nltk/source/browse/trunk/nltk/nltk/corpus/reader/chasen.py
○日本語nltk??ブログの名前がUnNatural Language Processingなとこが好き☆w(楽天の萩原さんって方)
http://lilyx.net/nltk-japanese-corpus/
○chasen.pyで検索かけると一番にでてきたブログw
http://d.hatena.ne.jp/yassuo_s/20110307/1299497846
  • python_chasen-2.1

拡張モジュールあり!ただし、Visual Cのvcvarsall.batさんが必要?


どうやらchasenを使うためのプログラムがC言語のため、Cを使うためのベースが必要だったらしい!
あとは、chasenに入ってるchasen.hもないとダメ!
でもそれを入れてもまだerrorが…どうやらwindowsでchasenの拡張モジュールを使うのは大変らしい(--;)
たくさんご協力いただいた久保木さん、本当にありがとうございました!!(><)

  • def chasen

 さらに久保木さんからのご協力により、def chasenのプログラムを提供していただきました!
これからunix→windowsへの書き換えが始まりますが、まず、プログラムを理解せねば…ですね!


○現在、何回か書き換えを試し中…

  • unix限定のcommandsさんを何に変えるべきなのか…

 getstatusoutputさんを使用して、茶筌を実行しようとしているのですが、unixさん限定…
commands.pyを覗いてみたけど、何でダメなのかよくわかんない;
getstatusoutputさんに使われているpopenさんやら、subprocess.Popenさんのプログラム例を見つけて、使ってみたけど、
使用している変数の型が変わってしまうものもあり、そしたらlen使えんよって言われたり…意味もなく1日が終わったんですが;

↑現在、諦め中☆
いや、人間楽しようとしたらダメだよ。自分でできるいっぱいのことで頑張ればいいじゃないか。その苦労がいつか面倒になってレベルアップにつながるんだよ…。と信じてる。

サブページ (1): python-mecab for windows7
Comments