文法圧縮の可視化ツール

この記事は空いていた[データ構造とアルゴリズム Advent Calendar 2020](https://qiita.com/advent-calendar/2020/str)の4日目の記事として執筆いたしました。

テキストデータ圧縮の一種である[文法圧縮](https://qiita.com/flare/items/a518bb41a6207c0452e5)の実行フローをGoogleのスプレッドシート上で可視化するツール（https://docs.google.com/spreadsheets/d/1gcr5qd2ceu0S38p3n7sdK9GHqt5Uur6R52Qil8A7278/edit#gid=0 ）を作りましたので紹介させていただきます。サポートしている文法圧縮は[RePair](https://qiita.com/flare/items/a6bd7c1af9c943885ab0)と[RLESP](https://qiita.com/tkbtkysms/items/565a9d0dba91b04e85e5)です。似たようなツールとしてはデータ構造を可視化するhttps://github.com/kg86/visds などがあります。

# 使い方
1. [こちらのスプレッドシート](https://docs.google.com/spreadsheets/d/1gcr5qd2ceu0S38p3n7sdK9GHqt5Uur6R52Qil8A7278/edit#gid=0)にアクセスして、自分のGoogle driveにコピーしてください。
2. コピーしたスプレッドシートにアクセスして、アドオン>VisGC>VisGCをクリックしてださい。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/15f63b38-89db-c8c7-a4f3-a4768f14593f.png)
3. クリックすると下図のようなポップアップウィンドウが表示されます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/e3c8dec9-5c0b-0c36-b97f-7c664125dc03.png)
4. 入力文字列（input string）を入力し、データ圧縮方式(compression type) 選び、表示を開始したいスプレッドシート上の行を入力してください。RLESPに関してはalphabet reductionの回数（詳しくは[こちら](https://qiita.com/tkbtkysms/items/565a9d0dba91b04e85e5)）も指定可能になっています。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/bf849643-8ea7-1e08-0f07-2888f5eb04ad.png)
5. startボタンをクリックすると、可視化されます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/1087b91e-654c-7258-11d3-a2fffe260a94.png)

# 実行例の説明

1. RePairの例です。S_0が入力文字列で、S_1はS_0に最頻出するバイグラムであるabをX_{1}に置き換えた文字列、S_2はS_1に最頻出するバイグラムX_1X_1をX_2に置き換えています。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/1087b91e-654c-7258-11d3-a2fffe260a94.png)

2. RLESPの例です。アルゴリズムの詳細に関しては[こちら](https://qiita.com/tkbtkysms/items/565a9d0dba91b04e85e5)をお読みください。S_0が入力文字列、RLE(S_0)はS_0を連長圧縮した文字列、L_0[0]はRLE(S_0)の数値表現、L_0\[i\] (1 <= i <= 3)はL_0\[i - 1\]からalphabet reductionによって計算される数列です。S_1はL_0\[3\]の数列に基づいてS_0のバイグラムもしくはトリグラムをX_iで置き換えた文字列です。RLE(S_1)以降も同様の流れで表示されています。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/c91e62f6-bd24-fe22-1084-37306efe026d.png)

# Texのtabularへの変換
スプレッドシート上でドルマークが埋め込まれていたからお気づきかもしれませんが、Texのtabularへの変換機能もあります。
1. 変換したいテーブルを選択。
 ![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/eb5524c7-4838-2ec2-4333-24ba409102fa.png)
2. アドオン>VisGC>TblToTexをクリック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/cba9c7d4-4fe4-3aa2-27f2-5fbc0c14db0d.png)
3.　ポップアップウィンドウに変換結果が表示されます。コピーテキストでクリップボードにコピー可能です。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/b42a52b4-7f45-0f03-828a-fc8b250897af.png)
4. 以下がTexでコンパイルし、PDF化した結果です。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/832a8e56-cca2-e9ca-d1c7-8840f5a219b3.png)
5. スプレッドシート上で文字の色を変更してから、Texに変換するとTexのソースも文字色を反映してくれます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/590941b3-1da8-c316-c90d-3d97df4c2ab0.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/5617f311-19e6-9a3e-483e-58d74ab827bb.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213482/51e6d5ca-2104-0ace-3d48-66bf7d1fe543.png)

# おわりに
文字はバイト単位で読み込んでいますので、マルチバイト文字を使用している日本語などはうまく表示することできないとおもいます。また、入力文字列としてあまり長い文字列を入力されることを想定していないため、長すぎる文字列を入力するとバグってしまうこともあるとおもいます。Texの変換においては、文字色のみで線の有無やmultirowなどには対応できていません。ソースも見れるようになっていますが、TypeScriptで書いたものが自動的にGoogleAppsScriptが解釈可能なJavaScriptに変換されていますので、読みにくいと思います。[こちら](https://github.com/tkbtkysms/VisGC)にアップロードしておきました。色々問題が山積みではありますが、文法圧縮やデータ圧縮を勉強している方、これから勉強したい方、論文執筆に使いたい方などの手助けになることを願っています。