機械学習を始めるにあたり、Pythonを学習してみようと思いました。どうせはじめてなので新しいものの方が良いと思いPython3で試してみました。

「リスト」と「辞書型」

教科書片手にサンプルを写経しはじめたところなのですが、JavaScriptと比較するとカッコが少なくていいなあ。などと感想が初心者丸出しです。

JavaScriptで言う所の「配列」や「連想配列」の処理がシンプルに出来そうなので、サンプルを元にこんなものを書いてみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import MeCab
text = """
心正しき者の歩む道は、心悪しき者のよこしまな利己と暴虐によって行く手を阻まれる。
愛と善意の名において暗黒の谷で弱き者を導く者は幸いなり。なぜなら、彼こそは真に兄弟を守り、迷い子達を救う羊飼いなり。
よって我は、怒りに満ちた懲罰と大いなる復讐をもって、我が兄弟を毒し、滅ぼそうとする汝に制裁を下すのだ。
そして、我が汝に復讐する時、汝は我が主である事を知るだろう。
"""
mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd -O wakati')
text = text.replace("。", "")
text = text.replace("、", "")
text = mecab.parse(text)
words = text.split()
counter = {}
for word in words:
if word in counter:
counter[word] += 1
else:
counter[word] = 1
for key,value in sorted(counter.items(), key=lambda x:x[1],reverse=True):
if value >= 3:
print(key, value)

ターミナルで実行してみます。

1
2
3
4
5
6
7
8
9
$ python3 work.py
を 8
の 5
は 5
者 4
と 4
汝 3
我が 3
に 3

mecabでかわち書きした形態素を多い順に書き出しました。(助詞を除いていないのでイマイチですが)

Pythonの「リスト」

JavaScriptで言うところの「配列」はPythonでは「リスト」と呼ぶそうです。(「タプル」・「集合型」と言うものもある様ですがここでは割愛)

1
2
3
4
5
6
7
8
9
10
11
12
points = [25, 42, 76, 57, 84, 11]
sum_v = 0
for i in points:
sum_v += i
print(i,"合計は", sum_v)
ave_v = sum_v / len(points)
print("平均は", ave_v)
points.sort()
points.reverse()
print (points)

ターミナルで実行します。

1
2
3
4
5
6
7
8
9
$ python3 work2.py
25 合計は 25
42 合計は 67
76 合計は 143
57 合計は 200
84 合計は 284
11 合計は 295
平均は 49.166666666666664
[84, 76, 57, 42, 25, 11]

リスト(配列)内の数値をループ処理したり、要素の数を抽出したり、降順・昇順でソートしたり、と言ったことがシンプルに記述出来ます。

リスト(配列)は文字列も扱えます。

1
2
3
4
5
6
7
8
9
10
11
import random
vincent_quote = [
"パリでクォーターパウンダー・チーズを何て呼んでるか知ってるか?",
"ロイヤル・ウィズ・チーズ",
"ビッグマックはビッグマック。",
"奴らはこう呼ぶのさ、ル・ビッグマック。"]
i = random.randint(0, len(vincent_quote)-1)
print( vincent_quote[i] )

実行します。

1
2
$ python3 work3.py
奴らはこう呼ぶのさ、ル・ビッグマック。

ここではリスト内の文字列をランダムで表示させてみました。

Pythonの「辞書型」

JavaScriptで言うところの「連想配列」はPythonでは「辞書型」と呼ぶそうです。

辞書型(連想配列)の値を取り出すにはこの様に記述します。

1
2
3
4
5
6
7
8
9
10
11
emotion = {
'happy': 0.0001,
'sad': 0.0077,
'angry': 0.0002,
'fear': 0.2071
}
for i in emotion.keys():
emotion_value = emotion[i]
result = "{0}は、{1}です。".format(i, emotion_value )
print(result)

実行します。

1
2
3
4
5
$ python3 work4.py
fearは、0.2071です。
angryは、0.0002です。
sadは、0.0077です。
happyは、0.0001です。

キーに対応する値を取り出しました。

辞書型(連想配列)のキー、値(バリュー)を両方取り出したい場合に、items()というメソッドがあります。

1
2
3
4
5
6
7
8
9
10
emotion = {
'happy': 0.0001,
'sad': 0.0077,
'angry': 0.0002,
'fear': 0.2071
}
for i, j in emotion.items():
result = "{0}は、{1}です。".format(i, j)
print(result)

実行します。

1
2
3
4
5
$ python3 work5.py
sadは、0.0077です。
happyは、0.0001です。
fearは、0.2071です。
angryは、0.0002です。

結果は同じなのですが、forループに変数を複数指定することが出来ます。

まとめ

「リスト」「辞書型」の基本を学習してみました。

以前node.jsを使ってマルコフ連鎖の文書生成を試したことがあったんですけど、(TinySegmenterでマルコフ連鎖。)実は辞書生成の部分が良く理解出来なかったので、Pyhonで再チャレンジしてみようかな、と思っています。では。

参考書籍

実践力を身につける Pythonの教科書 - Amazon.co.jp

クジラ飛行机先生のパイソン本が発売になったので、こちらを教科書に学習をはじめました。

難しい言い回しを避け、初学者にも理解しやすい書籍です。機械学習の章もあるので、基本が少し理解出来たら試してみたいですね。

追記(2016-11-27)

冒頭のサンプルを書き換えました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import MeCab
text = """
心正しき者の歩む道は、心悪しき者のよこしまな利己と暴虐によって行く手を阻まれる。
愛と善意の名において暗黒の谷で弱き者を導く者は幸いなり。なぜなら、彼こそは真に兄弟を守り、迷い子達を救う羊飼いなり。
よって我は、怒りに満ちた懲罰と大いなる復讐をもって、我が兄弟を毒し、滅ぼそうとする汝に制裁を下すのだ。
そして、我が汝に復讐する時、汝は我が主である事を知るだろう。
"""
mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd ')
mecab.parse('') # これが無いとデコードエラーが出る。
text = text.replace("。", "")
text = text.replace("、", "")
text = text.replace("\n", "")
node = mecab.parseToNode(text)
target = ['名詞','動詞','形容詞']
words = []
while node:
if node.feature.split(',')[0] in target:
words.append(node.surface)
node = node.next
counter = {}
for word in words:
if word in counter:
counter[word] += 1
else:
counter[word] = 1
for key,value in sorted(counter.items(), key=lambda x:x[1],reverse=True):
if value >= 2:
print(key, value)

分かち書きの抽出を「名詞」「動詞」「形容詞」のみにしてみました。実行してみます。

1
2
3
4
5
6
7
$ python3 work6.py
者 4
汝 3
する 2
復讐 2
心 2
兄弟 2

以上です。