soy-curd's blog

へぼプログラマーです [https://twitter.com/soycurd1]

python3で自然言語処理100本ノックの最初のほう その3

今日は正規表現のとこをやった。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import json
import re


def main():
    filename = sys.argv[1]

    json_list = read_json(filename)
    text = abstract_england(json_list)
    print(text)

    category_obj = abstract_category(text)
    [print(x) for x in category_obj]

    [print(x) for x in abstract_categoryname(abstract_category(text))]

    [print(x) for x in abstract_section(text)]


# 20 JSONデータの読み込み
def read_json(filename):
    '''
    wikiのjsonを読み込む。
    記事毎のjsonデータをリストで返す。
    '''
    with open(filename, mode='r') as f:
        articles = f.readlines()

    data = [json.loads(x) for x in articles]
    return data


def abstract_england(json_list):
    return next(filter(lambda x: x['title'] == "イギリス", json_list))['text']


# 21 カテゴリ名を含む行を抽出
def abstract_category(text):
    texts = text.split("\n")
    pattern = r"Category"
    return filter(lambda x:re.search(pattern, x), texts)


# 22 カテゴリ名の抽出
def abstract_categoryname(text_iter):
    return map(search_categoryname, text_iter)


def search_categoryname(text):
    start = len("[[Category:")
    end = len("]]")
    return text[start:-end]


# 23 セクション構造
def abstract_section(text):
    texts = text.split("\n")
    return filter(lambda x:x, map(search_section, texts))


def search_section(text):
    pattern = r"^=+"
    match = re.search(pattern, text)
    if match:
        cnt = match.end()
        return (text[cnt:len(text) - cnt], cnt - 1)
    else:
        return None


if __name__=='__main__':
    main()

なにげにjsonのロードで詰まってしまった。このjson、行毎に別々にデコードする必要があるっぽい。解析する前にちゃんとデータ構造を確認しよう、が今回の教訓。