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、行毎に別々にデコードする必要があるっぽい。解析する前にちゃんとデータ構造を確認しよう、が今回の教訓。