15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2018-04-11

Pythonから国会会議録APIへのアクセス

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

!pip install -q untangle

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

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年に変更した)

!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年に変更した)

#!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も作成できる。但し、以下の例ではストップワードを追加したほうがよいかもしれない。

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パッケージのインストールが必要である。

!apt-get -y install fonts-ipafont-gothic
!pip install -q untangle
!pip install -q wordcloud

Excelファイルを作成する

openpyxlを使うと、Excelファイルを作成できる。そして、以下のスクリプトでは、そのままローカルにダウンロードできる。

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の場合、パッケージが不足しているので、上記のコードの前に、以下の行を追加することが必要である。

!pip install -q untangle
!pip install -q openpyxl==2.5.2

#注意
##制限事項

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

#参考資料

15
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?