LoginSignup
1
0

More than 1 year has passed since last update.

【言語処理・共起】コロナ国会議論を2年前のそれと比較した。

Last updated at Posted at 2022-03-18

行ったこと

2022年と2020年における国会のコロナに関する議論、発言を対象に、
共起の考え方を用いて、どのような言葉(名詞)が一つの文章内で併せて使用されたのかを調べました。

背景

前回の記事(n-gram を試してみる ~国会議事録・コロナ編~)に詳細
https://qiita.com/yyyoichi/items/6514435da64b05745f6b#%E8%83%8C%E6%99%AF

ざっくりいうと「書籍で解説されている共起について応用してみたい」という背景があります。

目的

学んだ「共起」を有意義に使ってみたい。

環境

windows10
python 3.9.9
mecab
NEologd

処理

簡単に

  1. 検索用のURLを作成する
  2. urlで国会議事録APIをたたく
  3. 発言について形態素解析する
  4. 一つの文章の中で使われた名詞のペアリストをつくる
  5. 出現頻度の高い順にペアをならべ、上位を表示する

GitHub
https://github.com/yyyoichi/gihin_v2/tree/kyoki/server

ソースコード

一部です。

Main.py
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、オーム社

1
0
0

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
1
0