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

今回はいつも以上にコードが汚い。
とりあえずだらだら書いてみた。
自分的にif文あたりが気持ち悪いのでまた見直そう...

気をつけたことは「その」、「あの」が入らないようにすることと6文字以上の文字列でMeCabにちゃんと分割されなかった文字があったのでそこの除外処理を考えた(ただしso ダーティ)

```python
"""
34. 「AのB」
2つの名詞が「の」で連結されている名詞句を抽出せよ．

板の間	名詞,一般,*,*,*,*,板の間,イタノマ,イタノマ
木の根	名詞,固有名詞,地域,一般,*,*,木の根,キノネ,キノネ
日の出	名詞,一般,*,*,*,*,日の出,ヒノデ,ヒノデ
"""

import MeCab
from pprint import pprint
from n30_execise import maping_morphology
from n31_execise import load_mecab_file

def define_exception_ofX():
    '''
    extract_concat_noun_withXで使う例外文字列を記述する

    Parameters
    ==========
    e_string:list
        除外1(文字列)「この」と「その」以外
    e_max_len;int
        除外2(文字数) 6文字以上
    Returns
    =======
    e_string,e_max_len
    '''
    e_string = ['この','その']
    e_max_len = int(6)

    return e_string,e_max_len




def extract_concat_noun_withX(analyzed_list,x='の',Exceptions=define_exception_ofX()):
    '''
    特定の文字で名詞を二つ以上の名詞に分離する

    X:str
        分離用の文字:今回はの
    '''

    concat_noun_list = []

    e_string,e_max_len = Exceptions

    for mapped_morphology in analyzed_list:
        if mapped_morphology['pos'] == '名詞':
            # 先頭末尾以外に'の'がある場合
            if x in  mapped_morphology['Surface'][1:-1]:
                # FIXME  e_string[0]  e_string[1]を綺麗に持ってくる方法を知りたい。
                # 「その」、「あの」が入ってる場合はcontinue 
                if  e_string[0] in mapped_morphology['Surface'] or e_string[1] in mapped_morphology['Surface']:
                    continue
                elif len(mapped_morphology['Surface']) > e_max_len:
                    continue
                else:
                    concat_noun_list.append(mapped_morphology['Surface'])

    return concat_noun_list


if __name__ == "__main__":
    
    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)

    # 2つの名詞が「の」で連結されている名詞句を抽出
    concat_nouns = extract_concat_noun_withX(analyzed_list)

    print(concat_nouns)
```

＃出力結果

```
['板の間', '気の毒', '気の毒', '木の根', '気の毒', '世の中', '日の出', '気の毒', '気の毒', '世の中', '気の毒', '世の中', '世の中', '香の物', '香の物', '気の毒', '香の物', '身の上', '女の子', '気の毒', '身の毛', '気の毒', '気の毒', '気の毒', '気の毒', '世の中', '日の出', '腹の中', '世の中', 'なおのこと', '気の毒', '気の毒', '気の毒', '茶の間', '気の毒', '世の中', '茶の間', '茶の間', '女の子', '腹の中', '腹の中', '世の中', '次の間', '身の上', '腹の中', '腹の中', '世の中', '茶の間', '馬の骨', '山の上', '蜂の巣', '気の毒', '血の道', 'もってのほか', '世の中', '世の中', '気の毒', '火の車', '茶の間', '気の毒', '世の中', '世の中', '世の中', '気の毒', '気の毒', '気の毒', '気の毒', '世の中', '袖の下', '茶の間', 'ほのか', '北の方', '気の毒', '世の中', '茶の間', '気の毒', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '茶の間', '山の芋', '次の間', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '気の毒', '山の芋', '山の芋', '茶の間', 'きのう', '板の間', '茶の間', 'きのう', 'きのう', '山の芋', '板の間', '板の間', '気の毒', '気の毒', '気の毒', '女の子', '女の子', '女の子', '女の子', '女の子', '女の子', '女の子', '女の子', '世の中', '茶の間', '腹の中', '火の手', '天の橋立', '気の毒', '気の毒', '松の木', '松の木', '松の木', '気の毒', '世の中', '世の中', '男の子', '板の間', '板の間', '板の間', '板の間', '身の上', '気の毒', '身の丈', '気の毒', '腹の中', '世の中', '気の毒', '梁上の君子', '世の中', '気の毒', '世の中', '気の毒', '亀の甲', '香の物', '思いのほか', '鬨の声', '蜂の巣', '世の中', '世の中', '世の中', '世の中', '世の中', '世の中', '世の中', '世の中', '気の毒', '二の腕', '気の毒', '手のひら', '世の中', '気の毒', '床の間', '床の間', '床の間', '腋の下', '気の毒', '松の木', '松の木', '中の間', '山の芋', '気の毒', '山の芋', '山の芋', '山の芋', '山の芋', '山の芋', '世の中', '腹の中', '世の中', '日の出', '茶の間', '女の子', '茶の間', '松の木', '茶の間', '世の中', '世の中', '茶の間', '茶の間', '山の芋', '気の毒', '茶の間', '山の芋', '気の毒', '世の中', '気の毒', '茶の間', '腹の中', '身の上', '茶の間', '茶の間', '床の間', '気の毒', '床の間', '手のひら', 'そっちのけ', '気の毒', '床の間', '木の葉', '天の河', 'ほのか', '宵の口', '世の中', '床の間', '世の中', '宵の口', '気の毒', '世の中', '気の毒', '腹の中', '気の毒', '年の功', '岩の上', '腹の中', '山の上', '世の中', '気の毒', '世の中', '気の毒', '世の中', '世の中', '世の中', 'おのれ', '身の上', '世の中', '気の毒', '気の毒', '茶の間', '茶の間', '気の毒', '世の中', '世の中', '木の葉', '腹の中', '水の上']
```