さだまさしの歌詞を絵文字を用いて今風にしてみる

個人的に、さだまさしに対して不満な点がひとつあります。

さだまさし氏は twitter や LINE を使ったことがない事、使う気が無い事を方々で公言しており、日本の若者のコミュニケーションの根幹をなす携帯電話・スマートフォン文化に対しての理解が足りないことです。
たとえば LINE におけるスタンプ、たとえば Unicode 絵文字の普及により世界の共通語となった Emoji 文化、そういったものは時代を映す鏡でありその時代を生きる人々の心を映す鏡であり、叙情的なアプローチで世情を映し人の心を映す歌を作り続けてきたさだまさし氏がこれらの文化に親しんでいないのは、個人的には残念です。

しかし、不平不満を言うのは容易いこと、ここは**「さだまさし x IT」**アドベントカレンダーですので、IT 技術の力を用いてこの課題を乗り越えてみたいと思います。

# 絵文字変換ツール
<https://sadatech.herokuapp.com/emoji>

入力した文字列を、適切な絵文字を含む表現に変換するツールです。詳しくは、上記のデモサイトを直接のぞいていただくのが早いかなと思います。

heruku 上でこともあろうに Java のプログラムを動かしているので、 footprint が非常に遅く起動まで大変時間がかかるケースがありますが、辛抱強く待ってください...

## 実行例
* [無縁坂](https://sadatech.herokuapp.com/emoji?origin=%E6%AF%8D%E3%81%8C%E3%81%BE%E3%81%A0%E8%8B%A5%E3%81%84%E9%A0%83%20%E5%83%95%E3%81%AE%E6%89%8B%E3%82%92%E3%81%B2%E3%81%84%E3%81%A6%0D%0A%E3%81%93%E3%81%AE%E5%9D%82%E3%82%92%E7%99%BB%E3%82%8B%E5%BA%A6%20%E3%81%84%E3%81%A4%E3%82%82%E3%81%9F%E3%82%81%E6%81%AF%E3%82%92%E3%81%A4%E3%81%84%E3%81%9F%0D%0A%E3%81%9F%E3%82%81%E6%81%AF%E3%81%A4%E3%81%91%E3%81%B0%20%E3%81%9D%E3%82%8C%E3%81%A7%E6%B8%88%E3%82%80%0D%0A%E5%BE%8C%E3%81%A0%E3%81%91%E3%81%AF%E8%A6%8B%E3%81%A1%E3%82%83%E3%81%A0%E3%82%81%E3%81%A8%0D%0A%E7%AC%91%E3%81%A3%E3%81%A6%E3%81%9F%E7%99%BD%E3%81%84%E6%89%8B%E3%81%AF%20%E3%81%A8%E3%81%A6%E3%82%82%E3%82%84%E3%82%8F%E3%82%89%E3%81%8B%E3%81%A0%E3%81%A3%E3%81%9F%0D%0A%E9%81%8B%E3%81%8C%E3%81%84%E3%81%84%E3%81%A8%E3%81%8B%20%E6%82%AA%E3%81%84%E3%81%A8%E3%81%8B%0D%0A%E4%BA%BA%E3%81%AF%E6%99%82%E3%80%85%20%E5%8F%A3%E3%81%AB%E3%81%99%E3%82%8B%E3%81%91%E3%81%A9%0D%0A%E3%81%9D%E3%81%86%E3%82%86%E3%81%86%E3%81%93%E3%81%A8%E3%81%A3%E3%81%A6%E7%A2%BA%E3%81%8B%E3%81%AB%E3%81%82%E3%82%8B%E3%81%A8%0D%0A%E3%81%82%E3%81%AA%E3%81%9F%E3%82%92%E3%81%BF%E3%81%A6%E3%81%A6%E3%81%9D%E3%81%86%E6%80%9D%E3%81%86)
* [道化師のソネット](https://sadatech.herokuapp.com/emoji?origin=%E5%83%95%E9%81%94%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%AA%E8%88%9F%E3%81%AB%20%E5%93%80%E3%81%97%E3%81%BF%E3%81%A8%E3%81%84%E3%81%86%E8%8D%B7%E7%89%A9%E3%82%92%E7%A9%8D%E3%82%93%E3%81%A7%0D%0A%E6%99%82%E3%81%AE%E6%B5%81%E3%82%8C%E3%82%92%E4%B8%8B%E3%81%A3%E3%81%A6%E3%82%86%E3%81%8F%20%E8%88%9F%E4%BA%BA%E3%81%9F%E3%81%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%A0%E3%81%AD%0D%0A%E5%90%9B%E3%81%AE%E3%81%9D%E3%81%AE%E5%B0%8F%E3%81%95%E3%81%AA%E6%89%8B%E3%81%AB%E3%81%AF%20%E6%8C%81%E3%81%A1%E3%81%8D%E3%82%8C%E3%81%AA%E3%81%84%E7%A8%8B%E3%81%AE%E5%93%80%E3%81%97%E3%81%BF%E3%82%92%0D%0A%E3%81%9B%E3%82%81%E3%81%A6%E7%AC%91%E9%A1%94%E3%81%8C%E6%95%91%E3%81%86%E3%81%AE%E3%81%AA%E3%82%89%20%E5%83%95%E3%81%AF%E9%81%93%E5%8C%96%E5%B8%AB%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8B%E3%82%88%0D%0A%0D%0A%E7%AC%91%E3%81%A3%E3%81%A6%E3%82%88%E5%90%9B%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%20%E7%AC%91%E3%81%A3%E3%81%A6%E3%82%88%E5%83%95%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%0D%0A%E3%81%8D%E3%81%A3%E3%81%A8%E8%AA%B0%E3%82%82%E3%81%8C%20%E5%90%8C%E3%81%98%E6%B2%B3%E3%81%AE%E3%81%BB%E3%81%A8%E3%82%8A%E3%82%92%E6%AD%A9%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B)
* [防人の詩](https://sadatech.herokuapp.com/emoji?origin=%E3%81%8A%E3%81%97%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%0D%0A%E3%81%93%E3%81%AE%E4%B8%96%E3%81%AB%E7%94%9F%E3%81%8D%E3%81%A8%E3%81%97%E7%94%9F%E3%81%91%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AE%0D%0A%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%94%9F%E5%91%BD%E3%81%AB%E9%99%90%E3%82%8A%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%AA%E3%82%89%E3%81%B0%0D%0A%E6%B5%B7%E3%81%AF%E6%AD%BB%E3%81%AB%E3%81%BE%E3%81%99%E3%81%8B%20%E5%B1%B1%E3%81%AF%E6%AD%BB%E3%81%AB%E3%81%BE%E3%81%99%E3%81%8B%0D%0A%E9%A2%A8%E3%81%AF%E3%81%A9%E3%81%86%E3%81%A7%E3%81%99%E3%81%8B%20%E7%A9%BA%E3%82%82%E3%81%9D%E3%81%86%E3%81%A7%E3%81%99%E3%81%8B%0D%0A%E3%81%8A%E3%81%97%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)

個人的には、防人の詩の

```text:sakimori
🌊は🔚ますか 🗻は🔚ますか  
🍃はどうですか ☀もそうですか
おしえて🙏
```
というくだりがお気に入りです😁

# 実装
基本的には、文字列と絵文字情報のマッピングテーブルを用意し、入力された文字列をマッピングテーブルを基に変換していく、という作業になります。

## 絵文字辞書
マッピングテーブルを自作するのは大変なので、配布されている辞書データを用いました。
今回は、以下の、Unicode 絵文字 6.0 の辞書を配布しているサイトからダウンロードして使わせていただいています。
[Unicode絵文字に関するプロジェクト](https://osdn.jp/projects/moji/releases/)

基本的にはダウンロードしたままで使用していますが、一部、さだまさしの歌詞にふさわしい形になるよう手心を加えています。

## マッピング処理
上記でダウンロードした辞書データの中身は以下の用になっており、Unicode 絵文字の日本語表現も含まれています。
ちなみに、この辞書データを読み込むときは、Java の場合 `UTF-16LE` で読み込まないと文字化けします。

```text:dic
#,#⃣,無品詞,"F985        F489    F7B0"
0,0⃣,無品詞,"F990        F7C9    F7C5"
1,1⃣,無品詞,"F987        F6FB    F7BC"
2,2⃣,無品詞,"F988        F6FC    F7BD"
3,3⃣,無品詞,"F989        F740    F7BE"
4,4⃣,無品詞,"F98A        F741    F7BF"
5,5⃣,無品詞,"F98B        F742    F7C0"
6,6⃣,無品詞,"F98C        F743    F7C1"
7,7⃣,無品詞,"F98D        F744    F7C2"
8,8⃣,無品詞,"F98E        F745    F7C3"
9,9⃣,無品詞,"F98F        F746    F7C4"
C,©,無品詞,"F9D6        F774    F7EE"
こぴーらいと,©,無品詞,"F9D6     F774    F7EE"
R,®,無品詞,"F9DB        F775    F7EF"
とれーどまーく,®,無品詞,"F9DB   F775    F7EF"
.....
```

```java:sample
try (BufferedReader reader = new BufferedReader(new InputStreamReader(this.class.getResourceAsStream(dicfile), "UTF-16LE"))) {
	while (reader.ready()) {
		String line = reader.readLine();
		// process...
	}
}
```

ただ日本語表現はすべてひらがなになっているので、いくつかマッピングの際に工夫が必要です。
基本的には、以下のような流れです。

* 入力された文章を単語単位で形態素解析する
* 単語の「読み」情報を抽出する
* 「読み」と、上記辞書のひらがな表現とのマッピングを行う。

入力された文章の形態素解析は、何度か登場している `kuromoji` などでOKです。
単語の読みの推定も、たいていの形態素解析器ではサポートしていますが、 kuromoji でもサポートしているため、こちらを使います。
以下のサンプル中の `Token#getReading()` で推定された単語の読み情報が返却されます。

```java:sample
StringBuilder buf = new StringBuilder();
Tokenizer tokenizer = Tokenizer.builder().build();
List<Token> tokens = tokenizer.tokenize(str);
for (Token token : tokens) {
	String surface = token.getSurfaceForm();
	String reading = token.getReading();
	String emoji = EmojiConverter.convert(reading);
	if(reading != null && !reading.eqauls(emoji)){
		buf.append(emoji);
	}else{
		buf.append(surface);
	}
}
System.out.println(buf.toString());
```

# まとめ
こちらを作ったのはほとんどネタなのですが、意外と悪くない変換が行われるケースもあり、意外とありだな、と感じています。
世の中に、歌の歌詞を絵文字で表現している歌い手、アーティストが居るのか居ないのか、寡聞にも私は存じ上げていませんが、そういう人たちが出てきても良いのではないかと思います。
もちろん、さだまさし氏がそういう道を踏み出すのを期待しています。