個人的に、さだまさしに対して不満な点がひとつあります。
さだまさし氏は twitter や LINE を使ったことがない事、使う気が無い事を方々で公言しており、日本の若者のコミュニケーションの根幹をなす携帯電話・スマートフォン文化に対しての理解が足りないことです。
たとえば LINE におけるスタンプ、たとえば Unicode 絵文字の普及により世界の共通語となった Emoji 文化、そういったものは時代を映す鏡でありその時代を生きる人々の心を映す鏡であり、叙情的なアプローチで世情を映し人の心を映す歌を作り続けてきたさだまさし氏がこれらの文化に親しんでいないのは、個人的には残念です。
しかし、不平不満を言うのは容易いこと、ここは**「さだまさし x IT」**アドベントカレンダーですので、IT 技術の力を用いてこの課題を乗り越えてみたいと思います。
絵文字変換ツール
https://sadatech.herokuapp.com/emoji
入力した文字列を、適切な絵文字を含む表現に変換するツールです。詳しくは、上記のデモサイトを直接のぞいていただくのが早いかなと思います。
heruku 上でこともあろうに Java のプログラムを動かしているので、 footprint が非常に遅く起動まで大変時間がかかるケースがありますが、辛抱強く待ってください...
実行例
個人的には、防人の詩の
🌊は🔚ますか 🗻は🔚ますか
🍃はどうですか ☀もそうですか
おしえて🙏
というくだりがお気に入りです😁
実装
基本的には、文字列と絵文字情報のマッピングテーブルを用意し、入力された文字列をマッピングテーブルを基に変換していく、という作業になります。
絵文字辞書
マッピングテーブルを自作するのは大変なので、配布されている辞書データを用いました。
今回は、以下の、Unicode 絵文字 6.0 の辞書を配布しているサイトからダウンロードして使わせていただいています。
Unicode絵文字に関するプロジェクト
基本的にはダウンロードしたままで使用していますが、一部、さだまさしの歌詞にふさわしい形になるよう手心を加えています。
マッピング処理
上記でダウンロードした辞書データの中身は以下の用になっており、Unicode 絵文字の日本語表現も含まれています。
ちなみに、この辞書データを読み込むときは、Java の場合 UTF-16LE
で読み込まないと文字化けします。
#,#⃣,無品詞,"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"
.....
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()
で推定された単語の読み情報が返却されます。
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());
まとめ
こちらを作ったのはほとんどネタなのですが、意外と悪くない変換が行われるケースもあり、意外とありだな、と感じています。
世の中に、歌の歌詞を絵文字で表現している歌い手、アーティストが居るのか居ないのか、寡聞にも私は存じ上げていませんが、そういう人たちが出てきても良いのではないかと思います。
もちろん、さだまさし氏がそういう道を踏み出すのを期待しています。