e-Gov法令APIとXML　Pythonを用いた特定ワードが含まれる法令条文の抽出

＊移動．再投稿

#きっかけ
201910 Business Law Journalに”XMLによる情報整理の薦め”という記事あり．
興あり．
まず法令XMLをいじってみた．

#コードの概要
- e-Gov法令APIから指定する法令XMLを入手し，条文を見やすく？加工し表示．
- 特定のワードを含む条文のみを表示できるようにした（よく使う）
- jupyter notebookで実行し，引用関係にある条文を同時に確認するなどおすすめ
- heroku上のjupyter notebookでコードが起動するようにしておき，スマホからでも使えるようにするなどおすすめ

＊参照　
　法令APIをGoogle Colab (Python) からアクセスする
　　https://qiita.com/sakaia/items/c787aa6471e70000d253

＊注意
・基礎からおかしいでしょう．指摘していただけると本当に助かります．
・iはデバグ用．



#コード

```python:python
import requests
import xml.etree.ElementTree as ET

#e-Gov 法令API 仕様書
#https://www.e-gov.go.jp/elaws/pdf/houreiapi_shiyosyo.pdf

#法令選択
def lawName2No(KEYWORD, TAG='LawName'):
    url = 'https://elaws.e-gov.go.jp/api/1/lawlists/2'
    r = requests.get(url)
    root = ET.fromstring(r.content.decode(encoding='utf-8'))
    iflag = 0
    for i,e in enumerate(root.getiterator()):
        if TAG==e.tag:  
            iflag = 0
        if KEYWORD==e.text: 
            iflag = 1
        if iflag==1 and e.tag=='LawNo':
            return  str(e.text)

#法令表示・抽出
def lawTextExtractor(KEYWORD, lawnum='all', wordn=0, words=[]):
    if lawnum=='all':
        url = 'https://elaws.e-gov.go.jp/api/1/lawdata/'+lawName2No(KEYWORD)
    else:
        url = 'https://elaws.e-gov.go.jp/api/1/articles;lawNum='+lawName2No(KEYWORD)+';article='+str(lawnum)
    r = requests.get(url)
    if r.status_code!=requests.codes.ok:
        return
    root = ET.fromstring(r.content.decode(encoding='utf-8')) 
    lawstrs = []
    ssentcount = 0
    for i,e in enumerate(root.getiterator()):
        for xtag in ['LawTitle', 'SupplProvisionLabel', 'ArticleCaption', 'ArticleTitle', 'ParagraphNum', 'ItemTitle', 'Sentence']:
            if e.tag==xtag :

                if wordn==1 and xtag=='Sentence':#ワード指定する場合
                    tmpstr = ''
                    for word in words:
                        if str(e.text).find(word)>-1:
                            if tmpstr=='':
                                tmpstr = e.text.replace(word, '●'+word)
                            else:
                                tmpstr = tmpstr.replace(word, '★'+word)
                    if tmpstr!='':
                        lawstrs.append(tmpstr)
                        ssentcount += 1
                    
                else:
                    lawstrs.append(str(e.text))
    if lawstrs==[]:
        pass
    else:
        if lawnum=='all':
            print('●条項号数', ssentcount)
        print('\n'.join(lawstrs))
```

```python:   
#法令指定
KEYWORD = '著作権法'

#ワード抽出する場合　1
wordn = 1 
#抽出ワードリスト
words = ['映画'] 
```

```python:
#条文指定 今回は14条から29条
for lawnum in range(14,30): 
    lawTextExtractor(KEYWORD, lawnum, wordn, words)
    #「条の～」を無理やり処理．後で対策を考える→最初に法令の全条文番号リストを作りそこから任意にリストを抽出しfor文を回せば良い→（未実装）
    [lawTextExtractor(KEYWORD, str(lawnum)+'.'+str(i), wordn, words) for i in range(15)]

#法令全体指定する場合（条文が短い場合こちらのほうが手っ取り早い）
lawTextExtractor(KEYWORD, 'all', wordn, words)

#並行して，
#lawTextExtractor(KEYWORD, 18, 0, [])
#など，特定条文の非表示部分を確認するのも良い

#for n in [134,134.2,134.3,153,164.2,134.2]:
#    lawTextExtractor(KEYWORD, n, 0, [])
#など，「第百三十四条第一項若しくは第二項、第百三十四条の二第五項、
#第百三十四条の三、第百五十三条第二項又は第百六十四条の二第二項の規定により
#指定された期間内に限り」など引用された条文をまとめて確認するのも良い
```

#出力例

その前に:

- ワード抽出すると，たとえば，映画では譲渡権等が頒布権に変換されているのだな，などよく分かる．
- 条項号はそのまま残した．全体構造がわかるようにするため．
- 第一項はNoneとした．法令を読み慣れている人にはこのほうが読みやすいと考えたため．
- 項号にはインデントを入れず．見にくくなったため．

出力例:

（著作者の推定）
第十四条
None
（職務上作成する著作物の著作者）
第十五条
None
２
（映画の著作物の著作者）
第十六条
None
●映画の著作物の著作者は、その●映画の著作物において翻案され、又は複製された小説、脚本、音楽その他の著作物の著作者を除き、制作、監督、演出、撮影、美術等を担当してその●映画の著作物の全体的形成に創作的に寄与した者とする。
（著作者の権利）
第十七条
None
２
（公表権）
第十八条
None
２
一
二
三
第二十九条の規定によりその●映画の著作物の著作権が●映画製作者に帰属した場合
３
一
二
三
四
五
４
一
二
三
四
五
六
七
八
（氏名表示権）
第十九条
None
２
３
４
一
二
三
（同一性保持権）
第二十条
None
２
一
二
三
四
（複製権）
第二十一条
None
（上演権及び演奏権）
第二十二条
None
（上映権）
第二十二条の二
None
（公衆送信権等）
第二十三条
None
２
（口述権）
第二十四条
None
（展示権）
第二十五条
None
（頒布権）
第二十六条
None
著作者は、その●映画の著作物をその複製物により頒布する権利を専有する。
２
著作者は、●映画の著作物において複製されているその著作物を当該●映画の著作物の複製物により頒布する権利を専有する。
（譲渡権）
第二十六条の二
None
著作者は、その著作物（●映画の著作物を除く。以下この条において同じ。）をその原作品又は複製物（●映画の著作物において複製されている著作物にあつては、当該●映画の著作物の複製物を除く。以下この条において同じ。）の譲渡により公衆に提供する権利を専有する。
２
一
二
三
四
五
（貸与権）
第二十六条の三
None
著作者は、その著作物（●映画の著作物を除く。）をその複製物（●映画の著作物において複製されている著作物にあつては、当該●映画の著作物の複製物を除く。）の貸与により公衆に提供する権利を専有する。
（翻訳権、翻案権等）
第二十七条
None
著作者は、その著作物を翻訳し、編曲し、若しくは変形し、又は脚色し、●映画化し、その他翻案する権利を専有する。
（二次的著作物の利用に関する原著作者の権利）
第二十八条
None
第二十九条
None
●映画の著作物（第十五条第一項、次項又は第三項の規定の適用を受けるものを除く。）の著作権は、その著作者が●映画製作者に対し当該●映画の著作物の製作に参加することを約束しているときは、当該●映画製作者に帰属する。
２
専ら放送事業者が放送のための技術的手段として製作する●映画の著作物（第十五条第一項の規定の適用を受けるものを除く。）の著作権のうち次に掲げる権利は、●映画製作者としての当該放送事業者に帰属する。
一
二
３
専ら有線放送事業者が有線放送のための技術的手段として製作する●映画の著作物（第十五条第一項の規定の適用を受けるものを除く。）の著作権のうち次に掲げる権利は、●映画製作者としての当該有線放送事業者に帰属する。
一
二

#改正民法例
・契約その他の債権お発生原因及び取引上の社会通念に照らして
・瑕疵担保
・履行不能

```python: 
KEYWORD = '民法'
wordn = 0
words = []
for n in [ 400,412,415,483, 570 ]:
    lawTextExtractor(KEYWORD, n, wordn, words)
for lawnum in range(634,641):
    lawTextExtractor(KEYWORD, lawnum, wordn, words)
    [lawTextExtractor(KEYWORD, str(lawnum)+'.'+str(i), wordn, words) for i in range(15)]
for n in [ 412 ]:
    lawTextExtractor(KEYWORD, n, wordn, words)
```
●条項号数 0
（特定物の引渡しの場合の注意義務）
第四百条
None
債権の目的が特定物の引渡しであるときは、債務者は、その引渡しをするまで、善良な管理者の注意をもって、その物を保存しなければならない。
●条項号数 0
（履行期と履行遅滞）
第四百十二条
None
債務の履行について確定期限があるときは、債務者は、その期限の到来した時から遅滞の責任を負う。
２
債務の履行について不確定期限があるときは、債務者は、その期限の到来したことを知った時から遅滞の責任を負う。
３
債務の履行について期限を定めなかったときは、債務者は、履行の請求を受けた時から遅滞の責任を負う。
●条項号数 0
（債務不履行による損害賠償）
第四百十五条
None
債務者がその債務の本旨に従った履行をしないときは、債権者は、これによって生じた損害の賠償を請求することができる。
債務者の責めに帰すべき事由によって履行をすることができなくなったときも、同様とする。
●条項号数 0
（特定物の現状による引渡し）
第四百八十三条
None
債権の目的が特定物の引渡しであるときは、弁済をする者は、その引渡しをすべき時の現状でその物を引き渡さなければならない。
●条項号数 0
（売主の瑕疵担保責任）
第五百七十条
None
売買の目的物に隠れた瑕疵があったときは、第五百六十六条の規定を準用する。
ただし、強制競売の場合は、この限りでない。
●条項号数 0
（請負人の担保責任）
第六百三十四条
None
仕事の目的物に瑕疵があるときは、注文者は、請負人に対し、相当の期間を定めて、その瑕疵の修補を請求することができる。
ただし、瑕疵が重要でない場合において、その修補に過分の費用を要するときは、この限りでない。
２
注文者は、瑕疵の修補に代えて、又はその修補とともに、損害賠償の請求をすることができる。
この場合においては、第五百三十三条の規定を準用する。
●条項号数 0
第六百三十五条
None
仕事の目的物に瑕疵があり、そのために契約をした目的を達することができないときは、注文者は、契約の解除をすることができる。
ただし、建物その他の土地の工作物については、この限りでない。
●条項号数 0
（請負人の担保責任に関する規定の不適用）
第六百三十六条
None
前二条の規定は、仕事の目的物の瑕疵が注文者の供した材料の性質又は注文者の与えた指図によって生じたときは、適用しない。
ただし、請負人がその材料又は指図が不適当であることを知りながら告げなかったときは、この限りでない。
●条項号数 0
（請負人の担保責任の存続期間）
第六百三十七条
None
前三条の規定による瑕疵の修補又は損害賠償の請求及び契約の解除は、仕事の目的物を引き渡した時から一年以内にしなければならない。
２
仕事の目的物の引渡しを要しない場合には、前項の期間は、仕事が終了した時から起算する。
●条項号数 0
第六百三十八条
None
建物その他の土地の工作物の請負人は、その工作物又は地盤の瑕疵について、引渡しの後五年間その担保の責任を負う。
ただし、この期間は、石造、土造、れんが造、コンクリート造、金属造その他これらに類する構造の工作物については、十年とする。
２
工作物が前項の瑕疵によって滅失し、又は損傷したときは、注文者は、その滅失又は損傷の時から一年以内に、第六百三十四条の規定による権利を行使しなければならない。
●条項号数 0
（担保責任の存続期間の伸長）
第六百三十九条
None
第六百三十七条及び前条第一項の期間は、第百六十七条の規定による消滅時効の期間内に限り、契約で伸長することができる。
●条項号数 0
（担保責任を負わない旨の特約）
第六百四十条
None
請負人は、第六百三十四条又は第六百三十五条の規定による担保の責任を負わない旨の特約をしたときであっても、知りながら告げなかった事実については、その責任を免れることができない。
●条項号数 0
（履行期と履行遅滞）
第四百十二条
None
債務の履行について確定期限があるときは、債務者は、その期限の到来した時から遅滞の責任を負う。
２
債務の履行について不確定期限があるときは、債務者は、その期限の到来したことを知った時から遅滞の責任を負う。
３
債務の履行について期限を定めなかったときは、債務者は、履行の請求を受けた時から遅滞の責任を負う。

```python: 
KEYWORD = '民法'
wordn = 1
words = ['瑕疵']
lawTextExtractor(KEYWORD, 'all', wordn, words)
```
～
～

#参考

＊”XMLによる情報整理の薦め”の著者は，判例等を含めて閲覧可能としたXMLを作成しており，次で公開している．
　民法体系XML　
　　http://cyberlawschool.jp/kagayama/civ_ver1.xml
　　http://cyberlawschool.jp/kagayama/
＊官報も取りたいところなのですが，法令XMLには官報は含まれていないのですねぇ．
＊次のようにサーバーにファイルをおいておくと、いつどこからでも使えてよい。
　jupyter nteractをherokuサーバーで立ち上げてみた
　https://qiita.com/kzuzuo/items/7336fa6ac991e7e5e82a

＊法令APIを利用したリサーチツールを自作してみた【SmartRoppo】
　https://qiita.com/lawyer_alpaca/items/0e434235b1254287ef53
　いいねこれ。
　*検索部分が動かなかった。後で動作確認する。

＊全国条例データベースpowered by eLen
　https://elen.ls.kagoshima-u.ac.jp/