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実行をする必要がある
#参考資料
- APIの使い方
- 国会会議録検索API
- 国会会議録検索APIとその利用状況分析
- APIを使ったアプリ
- 言語分析
- 機械学習適用