歴史上、最も非情な河童（カッパ）はどいつだ　妖怪伝承DB分析

# 1. はじめに
この夏、海や川での溺水といった水難事故について調べる業務に取り組んでいたのですが、その際にチームの中で度々話に出てきたのが「河童（カッパ）」に関する伝説です。

「子どもを川に引き込む」といったいたずらのイメージが強いですが、歴史上最も非情なカッパはどいつなのか――。日本全国に残るカッパの伝承をAIの力を使って分析してみました。

# 2. 分析するデータ
日本に残る妖怪の伝承については、「国際日本文化研究センター」が公開する[怪異・妖怪伝承データベース](https://www.nichibun.ac.jp/YoukaiDB/)というサイトで確認することができます。

日本民俗学の文献から集められた全国各地の伝承35257件が登録されていて、「カッパ」に関するデータも1093件が登録されています。

これらの伝承が記録された書物の要約文や伝承が残っていた地域を分析しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/e4543e98-511e-88e3-540d-d8d2174e2597.png)

# 3.分析開始
分析には、自然言語処理による感情分析を利用することにしました。

参考にしたのは、[こちら](https://qiita.com/kizataka/items/f45c652f484e5b74762c)のソースコード。事前学習済みの日本語感情分析モデルを使って、伝承の要約文の内容がポジティブ・ネガティブ・ニュートラルのどのラベルに割り当てられるかを判定し、その度合いも数値化してみました。

GoogleColaboratoryの実行環境でまずこちらを準備して↓↓
```python
!pip install fugashi
!pip install ipadic
!pip install unidic-lite
```
分析開始↓↓
```python
import torch
from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer
import pandas as pd

# 怪異・妖怪伝承データベースにあるカッパに関するデータを準備してロード
df = pd.read_csv("./drive/MyDrive/df_kappa.csv")

# 事前学習済みの日本語感情分析モデルとそのトークナイザをロード
model = AutoModelForSequenceClassification.from_pretrained('christian-phu/bert-finetuned-japanese-sentiment')
tokenizer = AutoTokenizer.from_pretrained('christian-phu/bert-finetuned-japanese-sentiment', model_max_lentgh=512)

# 感情分析のためのパイプラインを設定
nlp = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer, truncation=True)

# 各テキストに対して感情分析を実行
# すべてのデータを一度に分析するとクラッシュするので分割して分析を実行
N = 100
splited_df = [df[i:i+N] for i in range(0, len(df), N)]
file_number = 0

senti_arr = []
score_arr = []

for part_df in splited_df:
    for text in part_df["yoyaku"]:
        print('＝＝分割ファイルナンバー＝＝')
        print(file_number)
        file_number = file_number + 1
        inputs = tokenizer(text, padding=True, truncation=True, return_tensors='pt', max_length=512)
        outputs = model(**inputs)
        logits = outputs.logits

        # ロジットを確率に変換
        probabilities = torch.softmax(logits, dim=1)[0]

        # 最も高い確率の感情ラベルを取得
        sentiment_label = model.config.id2label[torch.argmax(probabilities).item()]
        senti_arr.append(sentiment_label)

        # positiveまたはnegativeの場合はその確率を表示、neutralの場合はpositiveとnegativeの最大値を表示
        if ((sentiment_label == 'positive') or (sentiment_label == 'negative')):
            score_arr.append(float('{}'.format(max(probabilities))))
        else:
            score_arr.append(float('{}'.format(max(probabilities[0], probabilities[2]))))

# 結果をデータフレームに登録
df["sentiment_label"] = senti_arr
df["sentiment_score"] = score_arr
```

# 4. 結果は…
1093件の伝承のうち、ポジティブは219件、ネガティブは536件、ニュートラルは338件に分類されました。やはり、ネガティブな伝承が多数を占めているようです。

では、本題の「最も非情なカッパ」→ ネガティブ指数が高い要約だったのは…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/596e3ecf-be14-9253-57ae-f6509c4589cd.png)

岩手県花巻市東和町に残るカッパの[伝承](https://sekiei.nichibun.ac.jp/cgi-bin/YoukaiDB3/youkai_card.cgi?ID=1070718)がワースト１の指数でした！

その伝承内容は…

>「馬を川原に繋いで、近くにかいば桶（餌入れ）を置いておいたら、夕方ひっくり返されていた」

だそうです。何ともひどいカッパです。ワースト２は福岡県に残る[伝承](https://sekiei.nichibun.ac.jp/cgi-bin/YoukaiDB3/youkai_card.cgi?ID=2260107)で、

>「河童と角力（相撲）をとると馬鹿になる」

だそうです。皆さん、カッパに遭遇しても絶対に相撲だけはとらないでください。

あとは、

>昔，おにん淵で水浴びをしていた男の子が，飛び込んだきり出てこなかった。死体は，しりく玉が抜かれてなかったという。（[長野県小県郡真田町](https://sekiei.nichibun.ac.jp/cgi-bin/YoukaiDB3/youkai_card.cgi?ID=C2010233-000)）

>鳥取県気高郡大和村では、水浴びに梅干を持って行ってはいけない。河童に取りつかれる、河童にしりこだまを抜かれるという。（[鳥取県鳥取市](https://sekiei.nichibun.ac.jp/cgi-bin/YoukaiDB3/youkai_card.cgi?ID=1232270_006)）

なんて恐ろしい感じの伝承も（てか「しりこ玉」ってなんだ……）。長野と鳥取で地域はだいぶ離れていますが、似た伝承が残っているのも興味深いですね。

ネガティブな情報だけだとカッパに悪いので、ポジティブだった伝承も見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/1fa428b8-e387-bf50-40f4-d2ecd46c3a11.png)

１位は岩手県遠野市の[伝承](https://sekiei.nichibun.ac.jp/cgi-bin/YoukaiDB3/youkai_card.cgi?ID=1370018)で、

>馬に引かれて厩にきた河童を助けたら、秘伝の喉ぱりの薬を教えて貰って、今もつくっている。

だそうです。ポジ・ネガどちらも１位だった岩手県は、カッパの伝承が多いのでしょうか。ちなみに、こちらの伝承が残っていた書物が発行されたのは1985年です。秘伝薬、今も作っているのでしょうか。

ポジティブな伝承は、カッパと薬に関するものが多そうですね。

# 5. 地域性を見てみる
伝承の中には、都道府県や市区町村名が記録されているものも多かったので、少し強引ですがジオコーディングで伝承の位置情報を取得してマッピングし、地域性も調べてみました。

ジオコーディングには、国土地理院のAPIを活用しました。

```python
import json
import requests
from tqdm import tqdm

#伝承DBの地域情報の文字列をつなげる
ADDRESSES = []
for i, row in df.iterrows():
  ADDRESSES.append((str(row["pref"]) + str(row["city"]) + str(row["town"])).replace("nan","",10))

lat_arr = []
lng_arr = []
level_arr = []

#国土地理院のAPIに問い合わせて緯度経度を取得
for address in tqdm(ADDRESSES):
    res = requests.get("https://msearch.gsi.go.jp/address-search/AddressSearch?q=" + address)
    results = res.json()
    try:
      lat_arr.append(results[0]["geometry"]["coordinates"][1])
      lng_arr.append(results[0]["geometry"]["coordinates"][0])
    except:
      lat_arr.append("")
      lng_arr.append("")

df["lat"] = lat_arr
df["lng"] = lng_arr
```

得られた位置情報を、水に関するレイヤーだけ色づけしたMapboxのマップでマッピングしてみました。

伝承は全国各地に点在していますが、北海道や中国、四国地方は少なめということが分かります。

一方で、長野や新潟、岩手、九州に伝承が多く残っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/a1c17f6f-c975-d620-0561-fea5c19f29a7.png)

さらに興味深いのが、河川沿いに伝承が残っているのが見てとれて、例えば天竜川沿いには線を描くようにはっきりと伝承が残っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/58d1c81e-d030-eb7b-6f09-736faf824550.png)

他には信濃川、阿賀野川流域にも伝承が点在していて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/60710327-0723-9cb8-8ef9-867f4cdd75de.png)

筑後川（下図・左）や北上川流域でも伝承が川沿いに残っていることが見てとれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590631/040679f6-2807-9d36-6f49-e66226943605.png)

カッパの伝承ということでイメージ通りではありますが、市区町村名から強引に緯度経度変換をしただけにも関わらず、川沿いに伝承が残っていることが確認できたのは大変面白い結果でした。

# 6. おわりに
怪異・妖怪伝承データベースに登録されている情報から、カッパに関する記録を分析してみました。

カッパの伝承が川沿いを中心に各地で残っている理由についてですが、[こちら](https://president.jp/articles/-/74084?page=3)の記事もあるように、妖怪で水辺の危険性を子どもに伝えてきた、という背景があるのかもしれません。

夏休みがある7、8月は水難事故が特に多い季節。カッパの伝承や[水難事故マップ](https://www.asahi.com/special/water-accident/)などを使って、水辺の危険性について調べてみてはいかがでしょうか。