行ったこと
2022年と2020年における国会のコロナに関する議論、発言を対象に、
共起の考え方を用いて、どのような言葉(名詞)が一つの文章内で併せて使用されたのかを調べました。
背景
前回の記事(n-gram を試してみる ~国会議事録・コロナ編~)に詳細
https://qiita.com/yyyoichi/items/6514435da64b05745f6b#%E8%83%8C%E6%99%AF
ざっくりいうと「書籍で解説されている共起について応用してみたい」という背景があります。
目的
学んだ「共起」を有意義に使ってみたい。
環境
windows10
python 3.9.9
mecab
NEologd
処理
簡単に
- 検索用のURLを作成する
- urlで国会議事録APIをたたく
- 発言について形態素解析する
- 一つの文章の中で使われた名詞のペアリストをつくる
- 出現頻度の高い順にペアをならべ、上位を表示する
GitHub
https://github.com/yyyoichi/gihin_v2/tree/kyoki/server
ソースコード
一部です。
from collections import Counter
import itertools
from request.Minute import Minute
from request.Url import Url
from language.Token import Morpheme
KEYWORD = "コロナ"
DAY = "2022-03-14"
stop_words = ["君", "*", "等", "こと", "ため", "これ", "の", "この", "あの", "よう", "ふう", "もの", "ところ", "それ", "ん", "わけ", "とき"]
#形態素解析器
m = Morpheme()
#url作成
maker = Url(3)
maker.any(KEYWORD)
maker.maximumRecords("50")#50コ取得
maker.nameOfHouse("参議院")
maker.searchRange("本文")
maker.recordPacking("json")
# maker.from_("2021-01-01")
maker.until(DAY)
url = maker.getUrl()#設定したクエリをもつURLを取得する
print(url)
#議事録データを取得
#コロナにヒットする発言データが帰ってくる
res = Minute(url).get()
if res == None:
exit()
doublets = []
it = res.iterator()#発言をループする
while it.has_next():
rc = it.next()#発言のデータ
# print(rc.speaker())
# print(rc.speakerYomi())
speech = rc.speech()
sentences = speech.getSentences()# 。(読点)区切りでリスト化
for sentence in sentences:
if KEYWORD not in sentence:
#コロナというワードがなければスルー
continue
#形態素解析された原形の単語をもつリスト, 名詞のみとりだし
print(sentence)
words = [w.prototype() for w in m.parse(sentence).getValues() if w.part_of_speech()== "名詞" and w.surface() not in stop_words and w.part_of_speech_details_1() != "数"]
# 共起のペアをリストで取得
dls = list(itertools.combinations(words, 2))
doublets.extend(dls)
dic = Counter(doublets)#出現回数をカウント
dic = sorted(dic.items(), key=lambda x: x[1], reverse=True)[:50]#上位50位を取得
print("\n")
print("結果\n"+"キーワード: "+KEYWORD+", 日時終点: "+DAY)
for d in dic:
print(d)
結果
2022-03-14
2022-03-14から遡って50件の発言を分析した結果です。
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('必要', '円'), 17)
(('新型コロナウイルス感染症', '対応'), 15)
(('推進', '必要'), 15)
(('推進', '経費'), 15)
(('推進', '円'), 15)
(('必要', '経費'), 15)
(('経費', '円'), 15)
(('年度', '円'), 14)
(('令和', '年度'), 13)
(('円', '円'), 13)
(('新型コロナウイルス感染症', '推進'), 12)
(('必要', '推進'), 12)
(('推進', '推進'), 12)
(('コロナ', '円'), 12)
(('取組', '推進'), 11)
(('新型コロナウイルス感染症', '対策'), 11)
(('強化', '推進'), 11)
(('必要', '必要'), 11)
(('新型コロナウイルス感染症', '影響'), 10)
(('対応', '推進'), 10)
(('復興', '復興'), 10)
(('実現', '確保'), 10)
(('年度', '予算'), 10)
(('子供', '子供'), 10)
(('経費', '推進'), 10)
(('経費', '必要'), 10)
(('経費', '経費'), 10)
(('円', '推進'), 10)
(('円', '必要'), 10)
(('円', '経費'), 10)
(('円', '赤字'), 10)
(('新型コロナ', '対策'), 9)
(('実現', '推進'), 9)
(('医療', '体制'), 9)
(('令和', '予算'), 9)
(('新型コロナ', '影響'), 9)
(('年度', '赤字'), 9)
(('新型コロナウイルス感染症', '実現'), 8)
(('対応', '実現'), 8)
(('コロナ禍', '支援'), 8)
(('ポスト', 'コロナ'), 8)
(('ポスト', '推進'), 8)
(('コロナ', '推進'), 8)
(('推進', '対応'), 8)
(('年度', '補正予算'), 8)
(('総務省', '接種'), 8)
(('接種', '接種'), 8)
(('実現', '基盤'), 8)
(('法的', '必要'), 8)
(('法的', '経費'), 8)
2020-03-14
2020-03-14から遡って50件を分析した結果です。
下のほう、
(('ウイルス', '要件'), 6)
(('新型コロナウイルス感染症', '発生'), 5)
(('新型コロナウイルス感染症', '蔓延'), 5)
(('新型コロナウイルス感染症', '生命'), 5)
(('新型コロナウイルス感染症', '状況'), 5)
(('新型コロナウイルス感染症', '新型インフルエンザ'), 5)
(('発生', '国民'), 5)
(('発生', '状況'), 5)
あたりから鬼気迫るものを感じます。
結果
キーワード: コロナ, 日時終点: 2020-03-14
(('今回', '新型コロナウイルス感染症'), 12)
(('新型コロナウイルス感染症', '対策'), 12)
(('検査', '検査'), 10)
(('要件', '要件'), 10)
(('新型コロナウイルス感染症', '国民'), 9)
(('国民', '生活'), 9)
(('感染', '症'), 9)
(('新型コロナウイルス', '感染'), 9)
(('国民', '影響'), 8)
(('発生', '蔓延'), 7)
(('特措法', '対象'), 7)
(('政府', '措置'), 7)
(('検査', '三月'), 7)
(('検査', '中'), 7)
(('検査', 'PCR検査'), 7)
(('今回', '特措法'), 7)
(('要件', '緊急事態宣言'), 7)
(('要件', '発出'), 7)
(('要件', '影響'), 7)
(('経済', '終息'), 7)
(('新型コロナウイルス感染症', '影響'), 6)
(('新型コロナウイルス感染症', '日'), 6)
(('新型コロナウイルス感染症', '措置'), 6)
(('発生', '影響'), 6)
(('蔓延', '国民'), 6)
(('蔓延', '影響'), 6)
(('国民', '生命'), 6)
(('日', '新型コロナウイルス感染症'), 6)
(('日', '規定'), 6)
(('日', '同法'), 6)
(('政府', '対象'), 6)
(('新型コロナウイルス感染症', '感染'), 6)
(('指定感染症', '指定'), 6)
(('自立', '国家'), 6)
(('政府', '対策本部'), 6)
(('今回', '可能性'), 6)
(('対策', '最小限'), 6)
(('今回', '今回'), 6)
(('民間', '検査'), 6)
(('新型コロナウイルス感染症', 'お願い'), 6)
(('新感染症', 'WHO'), 6)
(('今日', '要件'), 6)
(('ウイルス', '要件'), 6)
(('新型コロナウイルス感染症', '発生'), 5)
(('新型コロナウイルス感染症', '蔓延'), 5)
(('新型コロナウイルス感染症', '生命'), 5)
(('新型コロナウイルス感染症', '状況'), 5)
(('新型コロナウイルス感染症', '新型インフルエンザ'), 5)
(('発生', '国民'), 5)
(('発生', '状況'), 5)
試行錯誤
以上が結果でした。
備忘録もかねて試行錯誤の過程を記録します。
はじめ
形態素する時点で、分析対象を品詞を名詞のみに限定するのみでした。
if w.part_of_speech()== "名詞"
名詞のみに限定すると、”君”や”*(アスタリスク)”が多くなってしまうことが分かりました。
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('君', '*'), 1210)
(('君', '君'), 1081)
(('*', '*'), 630)
(('君', '件'), 611)
(('*', '君'), 482)
(('君', '基本方針'), 376)
(('*', '件'), 364)
(('君', '内閣府大臣政務官'), 287)
(('君', '政策'), 242)
(('国務大臣', '*'), 241)
(('君', '内閣府副大臣'), 238)
(('*', '基本方針'), 225)
(('君', '国務大臣'), 217)
(('国務大臣', '君'), 206)
(('*', '政策'), 150)
(('君', '内閣府特命担当大臣'), 147)
(('*', '内閣府副大臣'), 147)
(('*', '内閣府大臣政務官'), 147)
(('内閣府特命担当大臣', '*'), 147)
(('君', '令和'), 141)
(('君', '四'), 141)
(('君', '年度'), 141)
(('君', '関係'), 141)
(('君', '予算'), 141)
(('内閣府特命担当大臣', '君'), 135)
(('国務大臣', '件'), 117)
(('内閣府副大臣', '*'), 105)
(('内閣府大臣政務官', '*'), 105)
(('件', '*'), 104)
(('君', '内閣'), 94)
(('君', '警察'), 94)
(('君', '等'), 94)
(('君', '内閣府'), 94)
(('君', '対策'), 94)
(('君', '経済'), 94)
(('内閣府副大臣', '君'), 91)
(('内閣府副大臣', '件'), 91)
(('内閣府大臣政務官', '件'), 91)
(('君', '内閣官房副長官'), 88)
(('*', '令和'), 84)
(('*', '四'), 84)
(('*', '年度'), 84)
(('*', '関係'), 84)
(('*', '予算'), 84)
(('*', '国務大臣'), 83)
(('件', '件'), 79)
(('内閣府特命担当大臣', '件'), 78)
(('君', '科学技術'), 74)
(('君', '宇宙'), 74)
(('君', '規制改革'), 73)
会議冒頭を除外
有意義なデータが取得できないと考えて、”君”や”(アスタリスク)”を形態素解析するタイミングで除外しました。
また、会議冒頭の出席者が列挙されている箇所で、”君”や”(アスタリスク)”が多くなっている原因であったと分かったため、検索対象を議事録本文に変更しました。
# 検索対象を本文に変更。
maker.searchRange("本文")
# 中略
if w.part_of_speech()== "名詞" and w.surface() != "*" and w.surface() != "君"
より具体的な言葉が列挙されました。
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('新型コロナウイルス感染症', '等'), 15)
(('新型コロナウイルス感染症', '対応'), 13)
(('新型コロナウイルス感染症', '推進'), 12)
(('新型コロナウイルス感染症', '対策'), 11)
(('新型コロナウイルス感染症', '影響'), 10)
(('復興', '復興'), 10)
(('実現', '確保'), 10)
(('子供', '子供'), 10)
(('新型コロナ', '対策'), 9)
(('等', '推進'), 9)
(('令和', '年度'), 9)
(('新型コロナウイルス感染症', '実現'), 8)
(('総務省', '接種'), 8)
(('実現', '基盤'), 8)
(('新型コロナ', '影響'), 8)
(('新型コロナウイルス感染症', 'こと'), 7)
(('ため', '推進'), 7)
(('対応', '実現'), 7)
(('取組', '推進'), 7)
(('万全', '実現'), 7)
(('資本主義', '実現'), 7)
(('実現', '等'), 7)
(('令和', '予算'), 7)
(('年度', '予算'), 7)
(('実現', '地方'), 7)
(('子供', '貧困対策'), 7)
(('新型コロナ', 'ため'), 6)
(('新型コロナウイルス感染症', '国民'), 6)
(('影響', '等'), 6)
(('ため', '支援'), 6)
(('支援', '推進'), 6)
(('実現', 'ため'), 6)
(('一', '復興'), 6)
(('影響', '推進'), 6)
(('ポスト', 'コロナ'), 6)
(('成長', '実現'), 6)
(('分配', '実現'), 6)
(('循環', '実現'), 6)
(('研究開発', '推進'), 6)
(('令和', '実現'), 6)
(('年度', '実現'), 6)
(('接種', '接種'), 6)
(('実現', '実現'), 6)
(('子供', '等'), 6)
(('新型コロナ', '支援'), 5)
(('対策', '等'), 5)
(('支援', '等'), 5)
(('新型コロナウイルス感染症', '感染拡大'), 5)
(('新型コロナウイルス感染症', '防止'), 5)
(('新型コロナ', '協力'), 5)
データ量を増やす
もっと見たい、ということで、議事録検索時点(APIをたたくタイミング)で50件取得するように変更しました。
- maker.maximumRecords("30")#30コ取得
+ maker.maximumRecords("50")#50コ取得
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('千', '百'), 28)
(('二', '百'), 27)
(('億', '円'), 27)
(('千', '円'), 26)
(('百', '円'), 25)
(('二', '千'), 23)
(('二', '円'), 23)
(('八', '円'), 23)
(('二', '〇'), 22)
(('二', '億'), 22)
(('千', '億'), 21)
(('八', '億'), 21)
(('百', '億'), 21)
(('三', '百'), 21)
(('十', '億'), 19)
(('十', '円'), 19)
(('八', '千'), 18)
(('三', '千'), 18)
(('八', '万'), 18)
(('千', '万'), 18)
(('十', '万'), 17)
(('等', '推進'), 17)
(('三', '円'), 17)
(('必要', '千'), 17)
(('必要', '億'), 17)
(('必要', '円'), 17)
(('億', '千'), 17)
(('二', '赤字'), 17)
(('千', '千'), 16)
(('八', '百'), 16)
(('三', '億'), 16)
(('二', '三'), 16)
(('百', '万'), 15)
(('新型コロナウイルス感染症', '等'), 15)
(('新型コロナウイルス感染症', '対応'), 15)
(('二', '二'), 15)
(('十', '千'), 15)
(('三', '万'), 15)
(('推進', '必要'), 15)
(('推進', '経費'), 15)
(('推進', '億'), 15)
(('推進', '千'), 15)
(('推進', '万'), 15)
(('推進', '円'), 15)
(('必要', '経費'), 15)
(('必要', '万'), 15)
(('経費', '億'), 15)
(('経費', '千'), 15)
(('経費', '万'), 15)
(('経費', '円'), 15)
漢数字を除外
数字には意味がなさそうだったので、除外します。
一 名詞,数,*,*,*,*,一,イチ,イチ
万 名詞,数,*,*,*,*,万,マン,マン
五 名詞,数,*,*,*,*,五,ゴ,ゴ
千 名詞,数,*,*,*,*,千,セン,セン
円 名詞,接尾,助数詞,*,*,*,円,エン,エン
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 記号,句点,*,*,*,*,。,。,。
品詞細分類1が「数」のものを除外すれば良さそうです。
条件文に追加します。
if w.part_of_speech()== "名詞" and w.surface() != "*" and w.surface() != "君" and w.part_of_speech_details_1() != "数"
具体的な言葉がより見えてきました。
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('等', '推進'), 17)
(('必要', '円'), 17)
(('新型コロナウイルス感染症', '等'), 15)
(('新型コロナウイルス感染症', '対応'), 15)
(('推進', '必要'), 15)
(('推進', '経費'), 15)
(('推進', '円'), 15)
(('必要', '経費'), 15)
(('経費', '円'), 15)
(('年度', '円'), 14)
(('ため', '推進'), 13)
(('令和', '年度'), 13)
(('円', '円'), 13)
(('新型コロナウイルス感染症', '推進'), 12)
(('必要', '推進'), 12)
(('等', '円'), 12)
(('推進', '推進'), 12)
(('コロナ', '円'), 12)
(('取組', '推進'), 11)
(('新型コロナウイルス感染症', '対策'), 11)
(('強化', '推進'), 11)
(('必要', '必要'), 11)
(('新型コロナウイルス感染症', '影響'), 10)
(('対応', '推進'), 10)
(('復興', '復興'), 10)
(('推進', '等'), 10)
(('実現', '確保'), 10)
(('実現', '等'), 10)
(('等', '必要'), 10)
(('年度', '予算'), 10)
(('子供', '子供'), 10)
(('経費', '推進'), 10)
(('経費', '必要'), 10)
(('経費', '経費'), 10)
(('円', '推進'), 10)
(('円', '必要'), 10)
(('円', '経費'), 10)
(('円', '赤字'), 10)
(('新型コロナ', '対策'), 9)
(('新型コロナウイルス感染症', 'こと'), 9)
(('実現', '推進'), 9)
(('対応', '等'), 9)
(('医療', '体制'), 9)
(('令和', '予算'), 9)
(('新型コロナ', '影響'), 9)
(('等', '経費'), 9)
(('年度', '赤字'), 9)
(('支援', '等'), 8)
(('新型コロナ', 'ため'), 8)
(('新型コロナウイルス感染症', '実現'), 8)
ストップワードの追加
「ため、等、こと」などの言葉に意味はないので、除外していきます。
stop_words = ["君", "*", "等", "こと", "ため"]
# 中略
if w.part_of_speech()== "名詞" and w.surface() not in stop_words and w.part_of_speech_details_1() != "数"
2022-03-14
いい感じになりました。
('必要', '円')
!
結果
キーワード: コロナ, 日時終点: 2022-03-14
(('必要', '円'), 17)
(('新型コロナウイルス感染症', '対応'), 15)
(('推進', '必要'), 15)
(('推進', '経費'), 15)
(('推進', '円'), 15)
(('必要', '経費'), 15)
(('経費', '円'), 15)
(('年度', '円'), 14)
(('令和', '年度'), 13)
(('円', '円'), 13)
(('新型コロナウイルス感染症', '推進'), 12)
(('必要', '推進'), 12)
(('推進', '推進'), 12)
(('コロナ', '円'), 12)
(('取組', '推進'), 11)
(('新型コロナウイルス感染症', '対策'), 11)
(('強化', '推進'), 11)
(('必要', '必要'), 11)
(('新型コロナウイルス感染症', '影響'), 10)
(('対応', '推進'), 10)
(('復興', '復興'), 10)
(('実現', '確保'), 10)
(('年度', '予算'), 10)
(('子供', '子供'), 10)
(('経費', '推進'), 10)
(('経費', '必要'), 10)
(('経費', '経費'), 10)
(('円', '推進'), 10)
(('円', '必要'), 10)
(('円', '経費'), 10)
(('円', '赤字'), 10)
(('新型コロナ', '対策'), 9)
(('実現', '推進'), 9)
(('医療', '体制'), 9)
(('令和', '予算'), 9)
(('新型コロナ', '影響'), 9)
(('年度', '赤字'), 9)
(('新型コロナウイルス感染症', '実現'), 8)
(('対応', '実現'), 8)
(('コロナ禍', '支援'), 8)
(('ポスト', 'コロナ'), 8)
(('ポスト', '推進'), 8)
(('コロナ', '推進'), 8)
(('推進', '対応'), 8)
(('年度', '補正予算'), 8)
(('総務省', '接種'), 8)
(('接種', '接種'), 8)
(('実現', '基盤'), 8)
(('法的', '必要'), 8)
(('法的', '経費'), 8)
2020-03-14
同じ条件で2020のデータもとってみました。
結果
キーワード: コロナ, 日時終点: 2020-03-14
(('これ', 'の'), 18)
(('新型コロナウイルス感染症', 'の'), 13)
(('よう', 'の'), 13)
(('の', 'の'), 13)
(('今回', '新型コロナウイルス感染症'), 12)
(('新型コロナウイルス感染症', '対策'), 12)
(('今回', 'の'), 12)
(('の', 'よう'), 12)
(('これ', 'もの'), 12)
(('新型コロナウイルス感染症', 'よう'), 11)
(('これ', 'ふう'), 11)
(('新型コロナウイルス感染症', 'ところ'), 10)
(('検査', '検査'), 10)
(('新感染症', 'の'), 10)
(('新感染症', 'もの'), 10)
(('WHO', 'もの'), 10)
(('要件', 'よう'), 10)
(('要件', '要件'), 10)
(('新型コロナウイルス感染症', '国民'), 9)
(('国民', '生活'), 9)
(('感染', '症'), 9)
(('感染', 'の'), 9)
(('新型コロナウイルス', '感染'), 9)
(('これ', 'よう'), 9)
(('もの', 'ところ'), 9)
(('これ', 'わけ'), 9)
(('蔓延', 'それ'), 9)
(('の', '状況'), 9)
(('ん', 'ん'), 9)
(('の', 'ふう'), 9)
(('国民', '影響'), 8)
(('発生', 'の'), 8)
(('これ', 'ところ'), 8)
(('今回', 'ところ'), 8)
(('新型コロナウイルス', 'の'), 8)
(('これ', '新感染症'), 8)
(('これ', 'WHO'), 8)
(('それ', 'とき'), 8)
(('発生', '蔓延'), 7)
(('特措法', '対象'), 7)
(('政府', 'の'), 7)
(('症', 'の'), 7)
(('特措法', 'の'), 7)
(('対象', 'の'), 7)
(('要件', 'の'), 7)
(('影響', 'よう'), 7)
(('状況', 'よう'), 7)
(('政府', '措置'), 7)
(('発生', 'とき'), 7)
(('それ', 'の'), 7)
もっとストップワード
意味をなさない単語が多いので、さらにストップワードを追加しました。
stop_words = ["君", "*", "等", "こと", "ため", "これ", "の", "この", "あの", "よう", "ふう", "もの", "ところ", "それ", "ん", "わけ", "とき"]
2020-03-14
結果
キーワード: コロナ, 日時終点: 2020-03-14
(('今回', '新型コロナウイルス感染症'), 12)
(('新型コロナウイルス感染症', '対策'), 12)
(('検査', '検査'), 10)
(('要件', '要件'), 10)
(('新型コロナウイルス感染症', '国民'), 9)
(('国民', '生活'), 9)
(('感染', '症'), 9)
(('新型コロナウイルス', '感染'), 9)
(('国民', '影響'), 8)
(('発生', '蔓延'), 7)
(('特措法', '対象'), 7)
(('政府', '措置'), 7)
(('検査', '三月'), 7)
(('検査', '中'), 7)
(('検査', 'PCR検査'), 7)
(('今回', '特措法'), 7)
(('要件', '緊急事態宣言'), 7)
(('要件', '発出'), 7)
(('要件', '影響'), 7)
(('経済', '終息'), 7)
(('新型コロナウイルス感染症', '影響'), 6)
(('新型コロナウイルス感染症', '日'), 6)
(('新型コロナウイルス感染症', '措置'), 6)
(('発生', '影響'), 6)
(('蔓延', '国民'), 6)
(('蔓延', '影響'), 6)
(('国民', '生命'), 6)
(('日', '新型コロナウイルス感染症'), 6)
(('日', '規定'), 6)
(('日', '同法'), 6)
(('政府', '対象'), 6)
(('新型コロナウイルス感染症', '感染'), 6)
(('指定感染症', '指定'), 6)
(('自立', '国家'), 6)
(('政府', '対策本部'), 6)
(('今回', '可能性'), 6)
(('対策', '最小限'), 6)
(('今回', '今回'), 6)
(('民間', '検査'), 6)
(('新型コロナウイルス感染症', 'お願い'), 6)
(('新感染症', 'WHO'), 6)
(('今日', '要件'), 6)
(('ウイルス', '要件'), 6)
(('新型コロナウイルス感染症', '発生'), 5)
(('新型コロナウイルス感染症', '蔓延'), 5)
(('新型コロナウイルス感染症', '生命'), 5)
(('新型コロナウイルス感染症', '状況'), 5)
(('新型コロナウイルス感染症', '新型インフルエンザ'), 5)
(('発生', '国民'), 5)
(('発生', '状況'), 5)
以上が試行錯誤でした。
感想
前回より面白い。
グラフも書いてみたいなあ。
参考
サイト
前処理について
https://www.dskomei.com/entry/2019/04/04/191506
書籍
言語処理について
山内長承『Pythonによるテキストマイニング入門』2017、オーム社