Pythonで文書解析

文書解析ライブラリ

Mecabという日本語を解析するライブラリがある。

AIというと何となく自分で考えて何かをしてくれそうなイメージがあるので、文書の自動作成とかしたいなと思った。

いきなり、そこまでは行けないので、まずは文書解析をしたいと思った。

 

とりあえず、Mecabをインストールして、ちょこちょこっとソースを書いてみた。

意外なほど日本語を分析できていて、このレベルのライブラリが無料なことに驚く・・・。

  

mecab.py

import MeCab

mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

text = '梅雨前線が西日本から東北付近へのび、前線に向かって暖かく湿った空気が流れ込んでいる。'
mecab.parse('')#文字列がGCされるのを防ぐ
node = mecab.parseToNode(text)
while node:
char = node.surface
pnt = node.feature.split(",")[1]
print(char, ':', pnt)
node = node.next
結果

: *
梅雨前線 : 固有名詞
が : 格助詞
西日本 : 固有名詞
から : 格助詞
東北 : 固有名詞
付近 : 一般
へ : 格助詞
のび : 自立
、 : 読点
前線 : 一般
に : 格助詞
向かっ : 自立
て : 接続助詞
暖かく : 自立
湿っ : 自立
た : *
空気 : 一般
が : 格助詞
流れ込ん : 自立
で : 接続助詞
いる : 非自立
。 : 句点
: *
 
先頭と最後にゴミを拾っているっぽいけど。
とりあえずは使えそう。

Pythonの関数

閉じる記号が無いのは、やっぱり新鮮

Pythonの関数って閉じる記号が無いのね。

ループとか分岐で予想はしていたけど。

どうもN88とかの昔のBASICを思い出してしまう。

   

kansu.py

def plus(value1, value2):
    return value1 + value2

def minus(value1, value2):
    return value1 - value2

def multiply(value1, value2):
    return value1 * value2

def divide(value1, value2):
    return value1 / value2

print(plus(1, 2))
print(minus(1, 2))
print(multiply(1, 2))
print(divide(1, 2))

 

結果

3
-1
2
0.5

 

関係ないけど、正数を割ると小数でる系の言語なんだなあと思う。

でも、これはPython3から変わった仕様らしい。

確かに使い方で言ったら、こっちだよなあ〜。

Pythonの分岐

この言語わかりやすいかもしれん・・・。

Pythonは分かりやすいと聞いていたのだが、確かに打つ量は少なくサクッと書けるイメージ。

実際に保守運用とかで、ちょっと1回こっきりに捨てスクリプトとか書くのに向いているのではなかろうか・・・。

気にあるのはループやら分岐やらと沢山の作ってネストが深くなり始めると閉じる記号がない関係上、混乱してくるかもなあ〜って事。

まあ、もっと長いソースをバンバン書いたらわかるんだろうなあ。

 

とりあえず、ループは分かったし、後は分岐が分かって関数の書き方がわかれば後はバンバン書けそうな印象。

というわけで分岐を書いてみた。

 

bunki.py

for hensu in range(5):
    if (hensu == 0):
        print("1ループ目")
    elif (hensu == 1):
        print("2ループ目")
    else:
        print("3ループ目以降")

 

結果

1ループ目
2ループ目
3ループ目以降
3ループ目以降
3ループ目以降
 
明日は関数を書いてみようと思う。(とかプログラミング初心者みたいなことを言ってみる。)

Pythonのループ

拡張For文っぽい

for文にカウント用変数を使わないって楽!

ネーミングセンスがないので、ループカウンタの名前を命名する手間がないのは良い。

「i」だの「j」だのを定義するの定番だけど、後で訳わからなくなるので、頭に「lc」を付けたりしていたけれども、そうすると1行が長くなるのが嫌いではあった。

  

loop.py

for hensu in range(1,5):
    print(hensu)
 
結果
1
2
3
4
 
基本的な構文が拡張for文で、それに寄せる形で存在しているrange関数というものが面白い。
range(初期値,最大値 +1,増分)みたいな感じ。
loop2.py

for hensu in range(1,5,2):
    print(hensu)
 
結果
1
3
 
こういう方がスパゲティになりずらいからいいんだろうなあ〜

Pythonの型

Pythonの型宣言を見るとスクリプト言語だと思い出す

Pythonの型は自動型宣言・・・。

JavaScriptとおんなじ・・・。VBとかだとVariant型・・・。これ嫌いなやつだ・・・。

古い人は共感してくれる人がいるかもしれませんね。

 

まあ、でも変数初期化しないでプログラム組んでバグるの結構見たし、スクリプトみたいにサクッと書く場合、この型の考え方は理に適っているような気もする。

多分、自分が古い人間なだけ!!

 

こんな感じで使う。

  

hensu.py

two = 2
three = 3
kekka = two * three
print(kekka)

moji = "abc"
print(moji)

 

これを実行すると数字を代入したものは数字として初期化されるから計算できるし、ダブルコーテーションで囲ったものは文字として初期化される。

 

結果
6
abc

 

うん。簡単!

 

Pythonでhello world

AIの勉強をしたい

 ふと思い立ち、AIの勉強をしたくなった。

何となく、今の段階って人工知能じゃないよねって思っていたけれども自分でやってみないとイマイチ納得できないタチなもので久しぶりに言語の勉強からしようかと。

 

AIの分野ではライブラリが充実している関係でPythonがよく使われているらしい。

というわけでPythonを勉強することにした。

Pythonは昔ハイエンド向け3DCGのスクリプトを書くのに使えたな・・・みたいな微妙な知識しかない。

とりあえずhello worldってみることにした。

 

 

helloworld.py

print("hello world")
 
うん。いつものやつだ!!
でも最後にセミコロンない系の言語なんですね。
ちょっと新鮮。

はじめまして

はじめまして

プログラマーを20年やってきて最近迷走しているなーとか思ってる三流仙人と言います。

どうぞよろしくお願いします。

 

たまに勉強したこととかを雑記として書こうと思います。

よろしくおねがいします。