国会会議録検索システム検索用APIをPythonでアクセスする。

# Pythonから国会会議録APIへのアクセス
##特定のキーワードで検索する。
国会会議録は、APIが2014年から国会図書館で公開されている。Python経由だと、以下のコードで、アクセスできる。このコードはそのまま、Web上の無料サービスとなっている[Google Colab](https://colab.research.google.com/)でも使える。その場合、設定に1行余分に必要となる。

```python
!pip install -q untangle
```
実際のソースコードは以下の通りである。ただし、一度の検索では、100件までしか表示されないことに注意が必要である。(制限事項参照)

```Python
import urllib
import untangle

if __name__ == '__main__':
    keyword = 'ニュートリノ'
    url = 'http://kokkai.ndl.go.jp/api/1.0/speech?' + urllib.parse.quote('maximumRecords=100&any=' + keyword)
    obj = untangle.parse(url)
    for record in obj.data.records.record:
        speechrecord = record.recordData.speechRecord
        print(speechrecord.session.cdata,
              speechrecord.nameOfHouse.cdata,
              speechrecord.nameOfMeeting.cdata,
              speechrecord.date.cdata,
              speechrecord.speaker.cdata)

```


出力の抜粋は以下の通りである。(全部で87行あったのでその先頭のみ。)

```
193 衆議院 科学技術・イノベーション推進特別委員会 2017-06-06 本島修
193 衆議院 科学技術・イノベーション推進特別委員会 2017-06-06 鈴木義弘
193 衆議院 科学技術・イノベーション推進特別委員会 2017-06-06 本島修
192 参議院 財政金融委員会 2016-10-27 麻生太郎
190 衆議院 内閣委員会 2016-04-22 岩田和親
189 参議院 内閣委員会 2015-03-24 藤本祐司
177 衆議院 科学技術・イノベーション推進特別委員会 2011-08-03 小柴昌俊
177 衆議院 科学技術・イノベーション推進特別委員会 2011-08-03 小柴昌俊
177 衆議院 科学技術・イノベーション推進特別委員会 2011-08-03 小柴昌俊
```
##特定のキーワードの時系列を検索する。
以下のようにすると年毎の発言を見る事が出来る。はじめの1行は、Google Colabではじめに動かすときに必要な行である。なお、本コードは、年あたり100件以内に対応している。(`maximumRecords`に関するAPI制限のため)

なお、最終年は、適宜付け足してほしい。(もともとは、2020年だったが、2022年に変更した)

```Python
!pip install -q untangle
import urllib
import untangle

keyword = 'ニュートリノ'
startdate = '-01-01'
enddate = '-12-31'
for year in range(1960, 2022):
  url = 'http://kokkai.ndl.go.jp/api/1.0/speech?' + urllib.parse.quote('maximumRecords=100'
                                                  + '&from=' + str(year) + startdate
                                                  + '&until=' + str(year)+ enddate
                                                  + '&any=' + keyword)
  obj = untangle.parse(url)
  print(year, " ", int(obj.data.numberOfRecords.cdata))
```
##今まで発言した人のリストとランキング
こちらは、今まで質疑した人とその頻度のランキングを出すためのコードである。1行目は、Google Colabを使うときに必要なコードである。なお、本コードは、一年ごとの最大件数が1000件に対応している(`obj.data.numberOfRecords.cdata`に関するAPIの制限)

なお、最終年は、適宜付け足してほしい。(もともとは、2020年だったが、2022年に変更した)

```Python
#!pip install -q untangle
import urllib
import untangle

keyword = 'ニュートリノ'
startdate = '-01-01'
enddate = '-12-31'
speakerlist =[]
yearrate = []
for year in range(1960, 2022):
  nextpos = 1
  while True:
      url = 'http://kokkai.ndl.go.jp/api/1.0/speech?' + urllib.parse.quote('maximumRecords=100'	
                                                  + '&from=' + str(year) + startdate
                                                  + '&until=' + str(year)+ enddate
                                                  + '&any=' + keyword
                                                  + '&startRecord=' + str(nextpos))
      obj = untangle.parse(url)
      if nextpos == 1:
        yearrate.append([year, int(obj.data.numberOfRecords.cdata)])
      if hasattr(obj.data, 'records'):
        for i, record in enumerate(obj.data.records.record, start=1):
          speechrecord = record.recordData.speechRecord
          print(speechrecord.session.cdata, speechrecord.nameOfHouse.cdata, 
              speechrecord.nameOfMeeting.cdata, speechrecord.date.cdata, 
              speechrecord.speaker.cdata, speechrecord.meetingURL.cdata)
          speakerlist.append(speechrecord.speaker.cdata)
      if hasattr(obj.data, 'nextRecordPosition'):
        print(year, obj.data.nextRecordPosition.cdata, obj.data.numberOfRecords.cdata)
        nextpos = obj.data.nextRecordPosition.cdata
      else:
        break
import collections
c = collections.Counter(speakerlist)
print(c.most_common())
print(yearrate)
```
なお、Colab/Jupyternotebookだと変数が保存されているので、以下の処理でグラフの出力が出来る。

```
import pandas as pd

df = pd.DataFrame(yearrate)
ax = df.plot(0, 1, grid=True)
ax.set_ylabel(u'count')
ax.set_xlabel(u'year')
```
# Word Cloudの作成
もちろん、Word Cloudも作成できる。但し、以下の例ではストップワードを追加したほうがよいかもしれない。

```python
import urllib
import untangle
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def stopwords():
    """
    Get stopwords.
    """
    stopwords = []
      
    slothlib_path = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
    slothlib_file = urllib.request.urlopen(slothlib_path)
    slothlib_stopwords = [line for line in slothlib_file]
    slothlib_stopwords = [ss for ss in slothlib_stopwords if not ss==u'']
    stopwords += slothlib_stopwords
    return stopwords 
      
      
if __name__ == '__main__':
    total_string = ''
    kaigi = '本会議'
    house = '衆議院'
    startdate = '2018-01-01'
    enddate=    '2018-06-20'
    url = ('http://kokkai.ndl.go.jp/api/1.0/speech?'
           + urllib.parse.quote('maximumRecords=100&nameOfMeeting=' + kaigi 
                                 + '&nameOfHouse=' + house
                                 + '&from=' + startdate
                                 + '&until' + enddate))
    obj = untangle.parse(url)
    print(obj.data.numberOfRecords.cdata, type(obj.data.records.record))
    for record in obj.data.records.record:
        speechrecord = record.recordData.speechRecord
        total_string = total_string + speechrecord.speech.cdata
    stop_words = stopwords()
    stop_words.extend([u'大島理森君'])
    wordcloud = WordCloud(background_color="white", font_path="/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf",width=1024,height=674, stopwords=set(stop_words)).generate(total_string)
    plt.figure()
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.show()  
```

なお、Google Colabの場合は、以下のように、フォントとPythonパッケージのインストールが必要である。

```python
!apt-get -y install fonts-ipafont-gothic
!pip install -q untangle
!pip install -q wordcloud
```
# Excelファイルを作成する
openpyxlを使うと、Excelファイルを作成できる。そして、以下のスクリプトでは、そのままローカルにダウンロードできる。

```python
import urllib
import untangle
from openpyxl import Workbook
from google.colab import files

if __name__ == '__main__':
    kaigi = '本会議'
    house = '衆議院'
    startdate = '2018-01-01'
    enddate=    '2018-06-20'
    url = ('http://kokkai.ndl.go.jp/api/1.0/speech?'
           + urllib.parse.quote('maximumRecords=100&nameOfMeeting=' + kaigi 
                                 + '&nameOfHouse=' + house
                                 + '&from=' + startdate
                                 + '&until' + enddate))
    obj = untangle.parse(url)
    wb = Workbook()
    dest_filename = 'kokkai_book.xlsx'
    ws1 = wb.active
    ws1.title = house + kaigi
    for i, record in enumerate(obj.data.records.record, start=1):
        speechrecord = record.recordData.speechRecord
        ws1.cell(row=i, column=1).value = speechrecord.session.cdata
        ws1.cell(row=i, column=2).value = speechrecord.nameOfHouse.cdata
        ws1.cell(row=i, column=3).value = speechrecord.nameOfMeeting.cdata
        ws1.cell(row=i, column=4).value = speechrecord.date.cdata
        ws1.cell(row=i, column=5).value = speechrecord.speaker.cdata
        ws1.cell(row=i, column=6).value = speechrecord.speech.cdata
    wb.save(filename = dest_filename)
    files.download(dest_filename)
```
Google Colabの場合、パッケージが不足しているので、上記のコードの前に、以下の行を追加することが必要である。

```python
!pip install -q untangle
!pip install -q openpyxl==2.5.2
```
#注意
##制限事項

-  国会会議録APIでは、会議録の数が1000件を超えると、エラーとなる。
   -  (`numberOfRecords`に関するAPI制限)この際は、絞り込みが必要となる。暫定回避策として、fromとuntilキーワードを使って期間を区切る等の対策が必要である。これでは、使いずらいので、会議録の数を返す場合、上限値を超えた場合にもエラー返却ではなく、数を返却するようにしてほしい。
-  一度に応答できる記事数が、100件である
  -  (`maximumRecords`に関するAPI制限)このため、終わりかどうかを確認して、何度もAPI実行をする必要がある

#参考資料
- APIの使い方
  - [国会会議録検索API](http://kokkai.ndl.go.jp/api.html)
  - [国会会議録検索APIとその利用状況分析](https://researchmap.jp/?action=cv_download_main&upload_id=99189)
  - APIを使ったアプリ
     - [kokalog(国会議事録検索)](http://kokalog.net/)
- 言語分析
  - [言語資料としての国会会議録検索システム(松田謙次郎)](http://sils.shoin.ac.jp/~kenjiro/papers/talks7.pdf)
  - [国会会議録を使った日本語研究(松田謙次郎)](https://www.amazon.co.jp/dp/4894762994)
  - [「しっかり」を国会会議録で検索すると(神永　暁)](https://japanknowledge.com/articles/blognihongo/entry.html?entryid=386)
  - [国会会議録に見る複合辞の特異な形―丁寧形/普通形の不対応―(服部匡)](https://www.ninjal.ac.jp/event/specialists/project-meeting/files/JCLWorkshop_no3_papers/JCLWorkshop_No3_25.pdf)
  - [持続可能な○○○○について ～国会会議録の分析～（岩川 貴志：MailNews 2017年7月号）](http://www.kiess.org/mailnews_1707_iwakawa/)
  - [国会会議録に見る前置き表現の変化(森 勇 太)](http://ir.lib.hiroshima-u.ac.jp/files/public/3/39854/20160426144855794801/Ronso-Kokugokyoikugaku_11_91.pdf)
  - [民主的討論の構造と動態：トピックモデルによる日米議会スピーチデータの比較分析 阪本拓人（東京大学）・瀧川裕貴（東北大学）](http://css-japan.com/wp-content/uploads/2017/02/23.CSSJWS.pdf)
  - [国会議事録をデータマイニングする(藤末健三)(東洋経済)](https://toyokeizai.net/articles/-/61)
- 機械学習適用
  - [国会会議録に基づく短命大臣の特徴分析](http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/E4-2.pdf)(2017/3)
  - [国会会議録に基づく「チルドレン議員」の特徴分析](http://anlp.jp/proceedings/annual_meeting/2018/pdf_dir/B6-1.pdf)(2018/3)
  - [国会会議録に基づく短命議員・短命大臣の特徴分析](https://www.jstage.jst.go.jp/article/jsoft/31/2/31_617/_pdf/-char/ja)(2019/4)
  - [国会会議録を用いたディベート人工知能による意見生成(日立製作所)](https://kaigi.org/jsai/webprogram/2017/pdf/860.pdf) 
  - [(平成 29 年度電子経済産業省構築事業)国会会議録を対象とした人工知能技術適用検討のための分析等支援事業](http://www.meti.go.jp/meti_lib/report/H29FY/000691.pdf)
  - [国会議事録を用いた経済指標のナウキャスティング(早稲田大学)](http://db-event.jpn.org/deim2015/paper/103.pdf)
  - [国会会議録 を対象 とする話 し言葉要約(山本　和英他)](https://www.jstage.jst.go.jp/article/jnlp1994/12/1/12_1_51/_pdf/-char/ja)
  - [ランダムフォレストを用いた国会会議録のイデオロギー分析(中川　侑他)](http://www.ieice.org/jpn/event/FIT/2016/data/pdf/N-001.pdf)