文章からの気象解析〜WordCloudで遊ぶ〜

# 0.はじめに

テレビの天気予報では現在の気象状況、明日や明後日の気象の予測とそれに伴う現象に対する注意事項を、気象キャスターが要領よく簡潔に説明してくれます。

気象庁からも気象予報の解説、過去の気象図に関する概説といったように文章で気象状況を簡潔にまとめた資料が定期的に発表されています。

このような文章にはどのような特徴があるのでしょうか？
今回は気象予報解析に関する文章の傾向をWordCloudというアプリケーションを用いて可視化してみます。

可視化すると、このような絵が得られます。

![2020textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/380645f0-bb71-a128-9261-16d7ecbf93ef.png)

頻出する単語が大きな文字で表示されます。
これによってある期間の気象状況の傾向を可視化することができるのではないでしょうか。


##### 環境

Mac mini(2018) 
 CPU:3.2GHz 6core Intel Core i7
 MS :32GB 2667MHz DDR4 
 OS :macOS Big Sur 11.6
  anaconda3-5.3.1
  Python            3.7.2
  matplotlib        3.1.0
  wordcloud         1.8.1

# 1. 題材とする気象庁発表資料

### 1.1 気象実況に関わる気象庁発表資料

次の2種類の気象庁発表資料を用います。

####(1) 日々の天気図
　気象庁が過去３か月から以前の天気図を月ごとにまとめた資料です。
![2022-01-10 19.40のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/a01d1ef3-d5cf-bbbb-0924-b1066e61552b.jpeg)

PDFで公開されており、日ごとの天気図と簡単な概況解説があります。
以下はテキスト例です（2022年1月1日分)。

**引き続き強い冬型の気圧配置。沖縄・奄美は寒気の影響で雨。西〜北日本も日本海側中心に雪や雨。その他は概ね晴れて初日の出日和。岩手県一関の最深積雪38cmは1月1位。**

なお、最新の「日々の天気図」は下記にあります。

[気象庁ホームページ　日々の天気図](https://www.data.jma.go.jp/fcd/yoho/hibiten/index.html)

####(2) 短期予報解説資料
　気象庁が発表する、17時および05時の天気予報(短期）の考え方、防災事項の解説です。

![2022-01-10 19.44のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/9d18659f-6297-9793-e842-b657db524e58.jpeg)

1.節に「実況上の着目点」として現在状況を説明している箇所がありますので、これを用います。

以下は解説例です（2022年1月10日発表分）

**・北海道地方では 3cm 前後/3h の降雪の所があるが、次第に弱まる見込み。
・日本の東の発達中の低気圧の影響で、関東地方や伊豆諸島で波が高くなっている。
・500hPa -42℃以下の寒気を伴う寒冷渦が中国東北区にあり南東進。また寒冷渦の南西側にはトラフがのびており、-33℃以下の寒気を伴っている。**

最新版は下記ホームページから確認できます。
[気象庁ホームページ（短期予報解説資料）](https://www.data.jma.go.jp/fcd/yoho/data/jishin/kaisetsu_tanki_latest.pdf)

短期予報解説資料はどちらかというと予報専門家向けの文章です。
「トラフ」、「500hPa」といった専門的な用語が用いられています。一般にはそれぞれ、「気圧の谷」「上空5500m付近」といった言葉で説明されています。

# 2. WordCloudでの可視化とテキストの前処理



### 2.1 PDFからのテキストの抜き出し

`pdftotext`というツールを用いてPDFからテキストデータを抜き出すことができます。
抜き出したばかりのテキストには、PDFでの書式に応じて、文章の途中で改行があったりしています。
そこで多少のawkやtrといったテキスト処理を行い、改ページ記号や改行記号を削除したりしておきます。
「日々の天気図」については、異なる日のテキストが1行おきに混じってしまうなどの箇所もありました。
これは目で見て整形してやる必要がありました。

こうして得られるテキストを1ヶ月分結合したもの、1年分結合したものを入力データとします。

### 2.2 日本語テキストの前処理

こうして収集したテキストをそのまま`wordcloud`に入力することもできますが、そのままだと長めの文がそのまま使われてしまいますので、頻出単語の可視化とは少し違ったものになります。
それはそれで面白い絵ができますが、語句単位での頻出度にも注目したいので、字句解析をさせて「分かち書き」の状態にしておきます。

こういった日本語文章の処理の解説は下記のサイトを参考にさせて頂きました。

[uepon日々の備忘録　Twitterのツイートをwordcloudで可視化したい【後編】](https://uepon.hatenadiary.com/entry/2019/01/03/204116)

ここでは日本語形態要素解析の分野で有名な`janome`を用いて日本語テキストを分かち書きします。
さらに、ある程度不要な文字・字句を排除してしまいます。


```Python:wordcloud.py
import os
from   wordcloud import WordCloud

from janome.tokenizer   import Tokenizer
from janome.analyzer    import Analyzer
from janome.tokenfilter import *

fpath  = "/Library/Fonts/Arial Unicode.ttf" # Mac OSのフォントファイル
docdir = "somewhere_your_favorite"

#複合名詞を作成するフィルタによる字句解析インスタンス
a = Analyzer( token_filters=[CompoundNounFilter()]) 

f_in = docdir + "alltext.2.txt"    # 入力テキストファイル
f_tm = docdir + "tmp2.txt"         # 下処理済テキストファイル
f_ru = docdir + "textcld_raw.png"  # 出力するPNGファイル
f_ou = docdir + "textcld.png"      # 出力するPNGファイル

# 入力テキストファイルから文字列を読み込む
contents   = open( f_in , encoding="utf-8" ).read()

word_list  = []

# 一部字句を排除する下処理を行う。
for token in a.analyze(contents) :
  word         = token.surface
  word_base    = token.base_form
  PartOfSpeech = token.part_of_speech.split(',')[0]

  # 不要な助詞類、頻出する不要な文字を除去
  if token.base_form in \
    ["なる" , "れる" , "する" , "S" , "s" , "Ｓ" , "ｓ"]:
    continue 

  #使用する品詞を制限
  if PartOfSpeech in \
     ["形容詞", "動詞", "名詞", "代名詞", "副詞", "接頭詞" ]:
    word_list.append(word_base) 

#スペースにより語句を結合
wakachi = " ".join(word_list) 

# 分かち書きされたテキストファイルを書き出す
content_tmp = open( f_tm, encoding="utf-8" , mode='w' )
print( wakachi, file=content_tmp)
content_tmp.close()

```

この結果、解説文が下記のように変換されます。

【下処理前】
**引き続き強い冬型の気圧配置。沖縄・奄美は寒気の影響で雨。
西～北日本も日本海側中心に雪や雨。その他は概ね晴れて初日の出日和。
岩手県一関の最深積雪38cmは1月1位。
冬型の気圧配置続く。西日本～北日本の日本海側は北陸地方を中心に概ね雪。
山形県肘折の日降雪量52cm。
冷え込みも続き、北海道大樹は最低気温が平年より13℃低い‐28.1℃。**


【下処理後】
**引き続き 強い 冬型 気圧配置 沖縄 奄美 寒気 影響 雨
西～北日本 日本海側中心 雪 雨 その他 概ね 晴れる 初日の出日和
岩手県一関 最深積雪38cm 1月1位 
冬型 気圧配置 続く 西日本～北日本 日本海側 北陸地方 中心 概ね 雪 
山形県肘折 日降雪量52cm 
冷え込み 続く 北海道大樹 最低気温 平年 13℃ 低い 28.1℃。**

品詞の間にスペースが入ったほか、助詞が削除されたり、「続き」が「続く」と基本形になったりしています。


### 2.4 WordCloudの実行

これら2種類のテキストをWordCloudに入力します。
日本語のwordcloudを実行する際には、フォントファイルを指定する必要があります。
これをしないと、日本語は表示されません。

```Python:wordcloud.py
# フォントファイルを指定してWordCloudを実行する
# 字句解析前のデータ
wc = \
WordCloud(background_color="white",width=900,height=500,\
          font_path=fpath).generate(contents)
wc.to_file( f_ru ) #　画像をファイルに書き込む

# 字句解析後のデータ
wc = \
WordCloud(background_color="white",width=900,height=500,\
          font_path=fpath).generate(contents_tmp)
wc.to_file( f_ou ) #　画像をファイルに書き込む
```

### 2.5 データの期間

次の2種類で実施しました。

・1ヶ月分の文字列を結合したもの
・1年分の文字列を結合したもの

それぞれ、下記の期間のテキストを収集しました。

「日々の天気図」2002年から2021年9月まで
「短期予報解説」2020年から2021年9月まで


# 3. 結果

### 3.1 字句解析の下処理後と下処理前
同じ時期について、「日々の天気図」を用いて結果を比較してみます。

##### 冬の例（2021年1月分)

・下処理前
![202101.raw.textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/0cf4425c-5eec-2119-170e-27ce29438184.png)

・下処理後
![202101textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/b8230c5f-97f6-9475-8fd1-4d8085e30e9e.png)

下処理後は「雪」「雨」が頻出するため、はっきりとこれらが表示されるようになります。
下処理前は予報文としておなじみの表現「引き続き強い冬型の気圧配置」「北日本の広い範囲で雨や雪」などの用語が見られるほか、「など」といった単独では意味を有しづらい語句も目立ちます。


##### 夏の例(2021年8月分)

・下処理前
![202108.raw.textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/d20b761e-33af-6eef-f651-1b3c9a1e9e0a.png)

・下処理後
![202108textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/8b2589a7-8fb7-4214-b9d4-26b6e19ce49c.png)

「下処理後」の方が端的な語句が増えています。
冬の例と比べると、「前線」「猛暑日」「雷雨」といった夏らしい用語が出てきます。

###　3.2 四季の変化

下処理後のデータを用いて、四季の変化を見ていきます。
「日々の天気図」の2010年分です。

##### 1月
 「雨」か「雪」かが最大の関心事のようです。2月以降にも「最高気温」の表現がよく出てきます。
この年は暖冬だったのでしょうか。
![201001textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/dda22a96-e7c3-4482-bd21-5d7daa13c913.png)
##### 2月
　引き続き「雨」か「雪」です。
　ほかの年の解析結果でもそうなっていて、どんだけって感じですが。
![201002textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/d3d78bc5-fae3-e6c8-2eda-0311a5821e08.png)
##### 3月
　この年は暖かかったようですね。「サクラ開花」など春の訪れを思わせる用語も出てきています。
![201003textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/702f3796-2110-4c4e-db64-adccf6362ee7.png)
##### 4月
　サクラの話題が続きます。「前線」という言葉も見えるように。
![201004textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/37d5a309-b00e-4d42-a2aa-6b9df135de07.png)
##### 5月
![201005textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/904d054f-2ba0-13b2-6c38-717148f22d55.png)
##### 6月
　「梅雨前線」が出てきます。「雷雨」「激しい雨」「前線」など雨に関する単語が多いですね。
![201006textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/3a686e01-5962-b5ab-7240-974270be4368.png)
##### 7月
　引き続き雨の言葉。梅雨末期の前線活動を思わせる「不安定」「非常」「激しい雨」「雷雨」に混じって「梅雨明け」「猛暑日」といった言葉も。
![201007textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/8490e0e8-ed02-7eae-dd8c-e13b3d6018b2.png)
##### 8月
　「猛暑日」が多かったようです。「台風」の言葉も現れます。
![201008textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/94df1bc2-3cc8-fc53-35ba-97f2747df310.png)
##### 9月
　まさに「台風」シーズン到来！というかんじですね。「猛暑日」も見られ残暑厳しかったかな。
![201009textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/6a06e693-9228-d75e-7ac8-ed060fdba933.png)
##### 10月
　「晴れ」と「雨」と「曇る」。周期的に天気が変わったのでしょうか。
![201010textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/fac869bf-c1e3-1cca-3f02-501d3c7e8812.png)
##### 11月
　「初霜」や「初氷」、「冷え込む」といった言葉です。冬の到来です。
![201011textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/5278fb88-836b-9e2e-48d4-afea13e81504.png)
##### 12月
　「雪」や「初雪」とか「冬型気圧配置」が出てきました。
![201012textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/16681508-7060-10bd-cddd-ac0ad86a57d1.png)

　という感じで想像以上に季節感が感じられる可視化結果でした。

### 3.3 1年分の文章全体の可視化

　「日々の天気図」の1年分のテキストの可視化結果です。

**2003年**
![2003textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/2364dc2f-7c41-4b9b-dced-f7dfbec282af.png)
**2009年**
![2009textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/160676ca-7fad-5bfe-baac-a41ed9718d53.png)
**2020年**
![2020textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/17f982b4-d2cf-7efa-4d4d-df4bb041d333.png)

こうしてみると「低気圧」というワードが目立ちます。
天気、気象予報というものがいかに低気圧の動きによって説明されているかをあらためて思い知ります。
そのほか地方の名称（北日本、西日本など）が目立ちます。「北海道」というワードも多いですね。


### 3.4 「日々の天気図」と「短期予報解説」の比較

専門家向けの「短期予報解説」と、「日々の天気図」の違いを見てみます。

##### 日々の天気図（2020年2月）

![202002textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/f8a1ca31-0c6c-1b45-3195-36279ab7c078.png)
「雪」「雨」が重要なのです。

##### 短期予報解説（同上）

![tanki_202002textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/2f4caee6-0c04-3fe5-0c98-220c67460951.png)
「雪」「雨」といった直接的な現象に関する表現は少なかったのでしょう。

さて短期予報解説資料の方にはいくつか専門用語が登場しています。
「トラフ」は「気圧の谷」に相当します。
「500hPa」は高層気象を説明するための等高度面を表していて、テレビの天気予報でも時折「上空5500m付近」のような表現で登場します。

このような表現の違いは、日々の天気図は最終的な「雨」「雪」という人が感じた事象に重きをおいた解説であるのに対して、短期予報解説資料では予報の根拠となる「現在の状況」を専門的に説明しているために現れるのでしょう。

#####短期予報解説資料の1年分の可視化

短期予報解説資料の1年分も見てみます。

2020年1年分
![tanki_2020textcld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411112/40a075c7-e594-bcfa-ee35-48f049efdfc5.png)

「低気圧」はよほど重要なのでしょうね。また、「寒気」も頻出するようです。寒気が上空に流入することで大気の状態が不安定となり、災害を引き起こすような雨が降る場合があります。
このほか「暖湿気」といった用語が目を引きます。これもテレビで「暖かく湿った空気」と説明されるのをよく聞きますが、上空の寒気とともに、大気の状態を不安定にして大雨を降らせる要因です。


# 4 まとめ

　気象庁が発表した文章からなる解説資料について、テキストデータ化してwordcloudを用いた可視化を行いました。季節による違いや、資料種別による違いがはっきりと見えました。

　私はこれまで趣味として[気象データを画像として用いての機械学習](https://qiita.com/m-taque/items/2788f623365418db4078)を主に行ってきましたが、テキストから面白いことを引き出す機械学習も勉強していこうと思います。