Pythonで文書解析
文書解析ライブラリ
Mecabという日本語を解析するライブラリがある。
AIというと何となく自分で考えて何かをしてくれそうなイメージがあるので、文書の自動作成とかしたいなと思った。
いきなり、そこまでは行けないので、まずは文書解析をしたいと思った。
とりあえず、Mecabをインストールして、ちょこちょこっとソースを書いてみた。
意外なほど日本語を分析できていて、このレベルのライブラリが無料なことに驚く・・・。
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を思い出してしまう。
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回こっきりに捨てスクリプトとか書くのに向いているのではなかろうか・・・。
気にあるのはループやら分岐やらと沢山の作ってネストが深くなり始めると閉じる記号がない関係上、混乱してくるかもなあ〜って事。
まあ、もっと長いソースをバンバン書いたらわかるんだろうなあ。
とりあえず、ループは分かったし、後は分岐が分かって関数の書き方がわかれば後はバンバン書けそうな印象。
というわけで分岐を書いてみた。
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行が長くなるのが嫌いではあった。
for hensu in range(1,5):
print(hensu)
1
2
3
4
for hensu in range(1,5,2):
print(hensu)
1
3
Pythonの型
Pythonの型宣言を見るとスクリプト言語だと思い出す
Pythonの型は自動型宣言・・・。
JavaScriptとおんなじ・・・。VBとかだとVariant型・・・。これ嫌いなやつだ・・・。
古い人は共感してくれる人がいるかもしれませんね。
まあ、でも変数初期化しないでプログラム組んでバグるの結構見たし、スクリプトみたいにサクッと書く場合、この型の考え方は理に適っているような気もする。
多分、自分が古い人間なだけ!!
こんな感じで使う。
two = 2
three = 3
kekka = two * three
print(kekka)
moji = "abc"
print(moji)
これを実行すると数字を代入したものは数字として初期化されるから計算できるし、ダブルコーテーションで囲ったものは文字として初期化される。
6
abc
うん。簡単!