生活を良くします - 怠惰なプログラミング

読者です 読者をやめる 読者になる 読者になる

生活を良くします-怠惰なプログラミング

外資系でエンジニアをやっています。便利なサービスや商品、プログラミングで作ったものなどを紹介していきます

pythonで司法試験をデータマイニングもどきその1 : 単語の出現回数を調べる

司法試験

興味を持ったきっかけ

「Better Call Saul(ベター・コール・ソウル)」を見たのがきっかけです。リーガルハイ経由ではないです。

Netflixだと見れますが、残念ながらAmazonではPrime会員でも有料となってしまいます。


Better Call Saulの主人公は「ブレイキング・バッド」で出てくるかなり怪しい弁護士です。この「ブレイキング・バッド」がものすごく面白くて好きだったので準レギュラーのこのうさんくさい弁護士もお気に入りとなってしましました。

違法なことばかりしていても口が達者で、コメディみたいな雰囲気ですが、シリアスなところは本当にシリアスになっていて面白いドラマです。

こんな感じのイメージでしたので実際はどんな試験を受けるんだろうと興味を持ちました。

自分は理系でしたので特に司法試験について詳しいとか、法律に明るいとか、天才で一ヶ月くらいで合格するとかそういうことはないです。

ただの興味を持った一般人くらいです。

失敗したこと2つとうまくいったの1つを紹介します。

見つけた問題

法務省:平成26年司法試験問題
便利な時代で少し検索をかけるだけでどんな問題が出題されていたのかがすぐに見つかりました。

知識は一切ないので下手に理解しようとするより、どういう単語がたくさん出現しているのかを調べた方が頭に残りやすそうだと判断しました。

Pythonの練習

やろうとして失敗したこと 1

Pythonで先ほどの問題のPDFをテキストとして抜き出したかった。そのために「pdfminer」というものをインストールしたがエラーが続出した。

ドキュメントも少なく、ネット上にもエラー報告はたくさんあったが決め手となる解決策は特に見つからなかった。たぶんバージョンの違いとか単純な話だと思うけど力尽きてしまった。

次は「pyPdf」というのを使ってやろうと思う。

すぐに試そうとしたが、このサイトが落ちていてダウンロードすらできなかった。後日頑張ることになった。
http://pybrary.net/pyPdf/

やろうとして失敗したこと 2

Mecabによって単語を切り出して出現回数をカウントしようとした。ここで書いたようにMecabを入れてあれば、Python用のインストールはすぐにできる。


Mecabとは?インストールの方法
www.what-a-day.net

このコマンドを打ち込むだけで終了。

pip3 install mecab-python3



試しに次のコードを書いて見て実行すれば動作確認ができる。自分はjupyter notebookで実行しました。

import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("今日もしないとね"))



正しい出力結果は次のようになります。エラーが出なければ無事に終了です。
20161207000101

Jupyter notebook入れ方
www.what-a-day.net

ちなみにMecabを使って単語に区切る、という作戦は失敗した。

法律用語は専門的過ぎてMecabが単語の区切り位置をうまく認識できず、デタラメみたいな結果になってしまった。

ユーザー辞書を追加しようとしたが、法律知識がないのと法律用語は山のようにあるため、これも諦めた。

うまくいった?こと

Mecabで単語には区切れないということがわかったので代替案を考えた。法律の問題文を見ていると漢字がやたら多いし、しかも1文字1文字が長い。ドイツ語みたい。

漢字と数字とひらがなに分割すれば、単語の抽出が可能では?と考えた。

参考:文字の種類で切り出す (Python) - プログラミング工場 / Python

書いたコード

import re
import sys
import MeCab
from collections import Counter

def parse(text):
    res = re.compile(u'[一-龠]+|[一-龠]+[a-zA-Z0-9]+')
    result = res.findall(text)
    return result

def parseNum(text):
    res = re.compile(u'[一-龠]+[a-zA-Z0-9]+')
    result = res.findall(text)
    return result


#m = MeCab.Tagger ("-Ochasen")
f = open('Law2.txt')
data = f.read()  # ファイル終端まで全て読んだデータを返す
f.close()


arraylist=[]
arraylist_num=[]


lines1 = data.split('n') # 改行で区切る(改行文字そのものは戻り値のデータには含まれない)

for line in lines1:
    for e in parse(line):
        if len(e) > 1:
            arraylist.append(e)

for line in lines1:
    for e in parseNum(line):
        if len(e) > 1:
            arraylist_num.append(e)
            
arraylist.extend(arraylist_num)
            
counter = Counter(arraylist)
for word, cnt in counter.most_common():
    print(word , cnt)


作った後に気づいたのが法律では憲法何条とか、条文の番号が必要になってくるじゃんということ。

漢字のみの出現回数でランキングをとったもの、漢字+数字の出現回数でランキングをとったもの、この二つを作成した。そして合体させて最終的なランキングをとった。

短答式試験問題集[公法系科目]では下のようになった。長いので適当にカットした。

出現単語と出現回数のセット。短答式試験だから威力を発揮していないんだろうと前向きに判断した。

他の問題文でもやって見たいけど、その前にまだまだ改良の余地が残っているのがわかった。

最高裁判所がたくさん出てくる問題なのか、わからない。

この結果じゃさっぱりわからない、まだその1だから。

~ fin ~

場合 109
配点 40
各記述 40
解答欄 37
処分 26
規定 24
自由 21
条第 21
後記 20
最高裁判所 20
組合 19
後記1 19
必要 19
判例 19
提起 18
許可 18
以下 18
趣旨 17
基準 16
取消 16
憲法 15