ニートの自然言語処理100本ノック:30

自分のコードがクソすぎるので他の人に見てもらうことを意識してコードをかく。
バーバリアン2号的クソコードからブラック・マジシャン的オシャンティコードを目指す。

```python
"""
30. 形態素解析結果の読み込み
形態素解析結果（neko.txt.mecab）を読み込むプログラムを実装せよ．
ただし，
各形態素は表層形（surface），基本形（base），品詞（pos），品詞細分類1（pos1）
をキーとするマッピング型に格納し，
1文を形態素（マッピング型）のリストとして表現せよ．
第4章の残りの問題では，ここで作ったプログラムを活用せよ．
"""

import MeCab
from pprint import pprint

#ファイルのパス用
text_from = "neko.txt"
text_to = "neko.txt.mecab"

def text_toMeCab(text_from,text_to):
    '''
    convert mecab morphological analisis result and  write it to text

    Parameters
    --------------

    mecab_tag: メカブオブジェクト
    origin: 元のファイル先
    as_mecab: メカブに変更するファイル先

    Returns
    --------
    parsed_text
    '''
    # メカブタグ
    mecab_tag = MeCab.Tagger('')
    with open(text_from,'r') as origin,\
         open(text_to,'w') as as_mecab:
        tmp_text = origin.read()
        parsed_text = mecab_tag.parse(tmp_text)
        as_mecab.write(parsed_text)

        return parsed_text
    


def maping_morphology(mecab_file):
    '''
    mapping morphological analysis result
    
    Parameters
    ----------
    all_text:str
        「吾輩は猫である」全文読み込み
    raw_list:list
        改行ごとにsplit されたもの(要素)
    temporary_list,tmp_list:list
        一時変換用リスト
    morphological_dict:dict
       一行ごとの形態素解析結果のマップ型
    result_mapping_list:list
        morphological_dictの全体リスト
    Returns
    --------
    result_mapping_list:mapping dictionary list
    '''
    #先頭に改行があるので削除する
    mecab_file = mecab_file.lstrip('\n')
    # 一行ずつに分割
    raw_list = mecab_file.splitlines()
    result_mapping_list = []

    for temporary_list in raw_list:
        tmp_list = temporary_list.replace('\t',',').split(',')
        # '最終行EOS直前まで読み込む
        if tmp_list[0] == 'EOS':
            break
        else:
            morphological_dict = {'Surface':tmp_list[0],'base':tmp_list[-3],'pos':tmp_list[1],'pos1':tmp_list[2]}
            result_mapping_list.append(morphological_dict)
    
    
    return result_mapping_list

        
mecab_text = text_toMeCab(text_from,text_to)
result = maping_morphology(mecab_text)
pprint(result)
```
出力結果

```
{'Surface': 'て', 'base': '助詞', 'pos': '接続助詞', 'pos1': 'て'},
 {'Surface': 'その', 'base': '連体詞', 'pos': '*', 'pos1': 'その'},
 {'Surface': '上', 'base': '名詞', 'pos': '非自立', 'pos1': '上'},
 {'Surface': 'に', 'base': '助詞', 'pos': '格助詞', 'pos1': 'に'},
 {'Surface': '大きな', 'base': '連体詞', 'pos': '*', 'pos1': '大きな'},
 {'Surface': '猫', 'base': '名詞', 'pos': '一般', 'pos1': '猫'},
 {'Surface': 'が', 'base': '助詞', 'pos': '格助詞', 'pos1': 'が'},
 {'Surface': '前後', 'base': '名詞', 'pos': '副詞可能', 'pos1': '前後'},
 {'Surface': '不覚', 'base': '名詞', 'pos': '形容動詞語幹', 'pos1': '不覚'},
 {'Surface': 'に', 'base': '助詞', 'pos': '副詞化', 'pos1': 'に'},
 {'Surface': '寝', 'base': '動詞', 'pos': '自立', 'pos1': '寝る'},
 {'Surface': 'て', 'base': '助詞', 'pos': '接続助詞', 'pos1': 'て'},
 {'Surface': 'いる', 'base': '動詞', 'pos': '非自立', 'pos1': 'いる'},
 {'Surface': '。', 'base': '記号', 'pos': '句点', 'pos1': '。'},
 {'Surface': '彼', 'base': '名詞', 'pos': '代名詞', 'pos1': '彼'},
 {'Surface': 'は', 'base': '助詞', 'pos': '係助詞', 'pos1': 'は'},
 {'Surface': '吾輩', 'base': '名詞', 'pos': '代名詞', 'pos1': '吾輩'},
 {'Surface': 'の', 'base': '助詞', 'pos': '格助詞', 'pos1': 'の'},
 {'Surface': '近づく', 'base': '動詞', 'pos': '自立', 'pos1': '近づく'},
 {'Surface': 'の', 'base': '名詞', 'pos': '非自立', 'pos1': 'の'},
 {'Surface': 'も', 'base': '助詞', 'pos': '係助詞', 'pos1': 'も'},
 {'Surface': '一向', 'base': '副詞', 'pos': '一般', 'pos1': '一向'},
....
```
無駄にコメントが長い...あと変数の名前もなんかしっくりこない...
まさかり待ってます。
待つことしかできないお