n-gram を試してみる　~国会議事録・コロナ編~

## 行ったこと
2022年と2020年における国会のコロナに関する議論、発言を対象に、
Ngramの考え方を用いて、どのような言葉が連なって使用されたのかを調べました。

## 背景
自然言語処理に興味を持つ。
山内長承『Pythonによるテキストマイニング入門』2017、オーム社 を入手。
最初の項目、Ngramの概念を学ぶ。
なにか有意義なこと（？）をしたい。
その結果、国会の議事録を分析しようと考え至る。

----追記. 2022/03/18
つづきです。
【言語処理・共起】コロナ国会議論を2年前のそれと比較した。
https://qiita.com/yyyoichi/items/48aa94539d5002ce1ed6
-----ここまで-

## 目的
あくまでNgramをつかって有意義らしいことをしてみること。
Ngramについてはこちらも参考にしました。ありがとうございます。
[N-gramの作り方](https://qiita.com/kazmaw/items/4df328cba6429ec210fb "N-gramの作り方")


## 環境
windows10
python 3.9.9
mecab
NEologd

## 処理
簡単に
1. 国会の議事録を取得するためのurlを作成する
2. 議事録を取得する
2. 発言について形態素解析を行う
2. 2-gramを作成する
2. 出現頻度が高い順に2-gramを並べ替える

ソースコードは[Git hub](https://github.com/yyyoichi/gihin_v2/tree/2gram/server "Git hub 2gram")に挙げています。
結城 浩『Java言語で学ぶ デザインパターン入門 第3版』2021、SB Creative　を勉強しています。再利用性の高いコードを書こうとしています。
クラス設計他、ご指摘、アドバイスいただければ嬉しいです。
<details><summary>サンプルコード</summary>

```Main.py

from collections import Counter
from request.Minute import Minute
from request.Url import Url
from language.Token import Morpheme

KEYWORD = "コロナ"
#形態素解析器
m = Morpheme()
#url作成
maker  = Url(3)
maker.any(KEYWORD)
maker.maximumRecords("30")#30コ取得
maker.nameOfHouse("参議院")
maker.recordPacking("json")
# maker.from_("2021-01-01")
maker.until("2020-03-14")
url = maker.getUrl()#設定したクエリをもつURLを取得する
print(url)
#議事録データを取得
fetch = Minute(url)
#コロナにヒットする発言データが帰ってくる
res = fetch.get()
if res == None:
    exit()
n_gram = []
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
        #形態素解析された原形の単語をもつリスト
        words = [w.prototype() for w in m.parse(sentence).getValues()]
        d = list(zip(words[:-1], words[1:]))#2つセットにする
        n_gram.extend(d)
dic2 = Counter(n_gram)#出現回数をカウント
dic2 = sorted(dic2.items(), key=lambda x: x[1], reverse=True)[:50]#上位50位を取得
print("\n")
print("結果")
for d in dic2:
    print(d)
    


```
</details>

## 結果
前置きが長くなりました。
ある日付から遡って最も近い30件のコロナに関する発言を取得し、すべて2-gramを作成。もっとも多かった組合せ上位50件を表示しています。
なお、表層形ではなく、原形を使って2-gramを作成しています。

### 2022-03-14から上位50件
```
(('ます', '。'), 52)
(('は', '、'), 22)
(('する', 'て'), 20)
(('て', 'いる'), 19)
(('君', '国務大臣'), 18)
(('国務大臣', '*'), 18)
(('*', '内閣府特命担当大臣'), 16)
(('内閣府特命担当大臣', '*'), 16)
(('、', '新型コロナウイルス感染症'), 15)
(('とともに', '、'), 15)
(('に関する', '件'), 14)
(('まいる', 'ます'), 13)
(('件', '*'), 12)
(('て', 'おる'), 11)
(('、', 'コロナ禍'), 10)
(('へ', 'の'), 10)
(('する', 'た'), 10)
(('の', '推進'), 10)
(('おる', 'ます'), 10)
(('て', 'いく'), 9)
(('いる', 'ます'), 9)
(('について', 'は'), 9)
(('の', '基本方針'), 9)
(('、', '新型コロナ'), 9)
(('必要', 'だ'), 8)
(('推進', 'する'), 8)
(('て', 'まいる'), 8)
(('新しい', '資本主義'), 8)
(('基本方針', 'に関する'), 8)
(('に', '、'), 7)
(('を', '推進'), 7)
(('ポスト', 'コロナ'), 7)
(('の', '対応'), 7)
(('の', '実現'), 7)
(('国民', 'の'), 7)
(('等', 'を'), 7)
(('君', '厚生労働省'), 7)
(('中', '、'), 6)
(('に', '向ける'), 6)
(('万全', 'を'), 6)
(('後', 'の'), 6)
(('など', '、'), 6)
(('を', '行う'), 6)
(('ます', 'た'), 6)
(('新型コロナウイルス感染症', 'の'), 6)
(('の', '影響'), 6)
(('対応', 'する'), 6)
(('、', 'ポスト'), 6)
(('こと', 'が'), 6)
(('国民', '生活'), 6)
```

### 2020-03-14から上位50件
```
(('ます', '。'), 45)
(('て', 'いる'), 35)
(('は', '、'), 34)
(('する', 'て'), 24)
(('という', 'こと'), 24)
(('する', 'れる'), 23)
(('だ', 'ある'), 20)
(('ある', 'ます'), 20)
(('が', '、'), 19)
(('する', 'た'), 18)
(('て', '、'), 17)
(('を', 'する'), 17)
(('、', 'この'), 16)
(('に', 'は'), 15)
(('けれども', '、'), 15)
(('、', '新型コロナウイルス感染症'), 14)
(('れる', 'た'), 14)
(('に', '、'), 14)
(('だ', 'ござる'), 14)
(('ござる', 'ます'), 14)
(('と', 'する'), 13)
(('いる', 'ます'), 13)
(('て', 'おる'), 13)
(('ます', 'た'), 13)
(('よう', 'に'), 13)
(('れる', 'て'), 12)
(('、', '今回'), 12)
(('今回', 'の'), 12)
(('に', 'なる'), 12)
(('新型コロナウイルス感染症', 'を'), 11)
(('に', 'する'), 11)
(('、', '政府'), 10)
(('は', 'ない'), 10)
(('の', 'か'), 10)
(('こと', 'だ'), 10)
(('おる', 'ます'), 10)
(('と', '、'), 10)
(('ところ', 'だ'), 10)
(('ます', 'けれども'), 10)
(('もの', 'だ'), 9)
(('する', '、'), 9)
(('が', 'ある'), 9)
(('て', 'いく'), 9)
(('ます', 'が'), 9)
(('的', 'だ'), 8)
(('する', 'こと'), 8)
(('と', '思う'), 8)
(('ので', '、'), 8)
(('、', 'その'), 8)
(('、', 'これ'), 8)
```

### 感想
結果を受けて、どう考えますでしょうか？
私は、2年経過しポストコロナなどの議論の軸が現れたのかな、と感じました。

#### 目的について
Ngramを使ってみたかっただけなのですが、正しい使い方なのでしょうか。分かりません。
意味のある単語に限定したほうがいいのかとも思いました。句点ものぞいたり。
ひとまず、今回はこの辺で。

## 参考
参考にしたサイトや書籍です。

### サイト
mecab
https://taku910.github.io/mecab/

インストール
https://obenkyolab.com/?p=2682

NEologd
https://qiita.com/zincjp/items/c61c441426b9482b5a48
https://qd-suriken.com/2020/04/22/widows%E3%81%A7mecabneologd/

前処理
https://note.com/narudesu/n/na35de30a583a
https://qiita.com/Hironsan/items/2466fe0f344115aff177

Ngram
https://qiita.com/kazmaw/items/4df328cba6429ec210fb

### 書籍
言語処理について
山内長承『Pythonによるテキストマイニング入門』2017、オーム社

### その他参考
結城 浩『Java言語で学ぶ デザインパターン入門 第3版』2021、SB Creative