【Word】差分確認マクロをGithubにて公開
このブログではたびたびVBAによるレーベンシュタイン距離の実装について触れてきました。
今回はこれらのコード実用化に向けて、温めてきたものです。ツイッターでは一足先につぶやいていましたが、差分を取得した後に、異なる部分のみWordの修正履歴付きで反映したいと思います。

そしてこのコード(クラスとモジュール)およびサンプルファイルをGithubに公開しました。
Pythonからの移植ですので、PSFLというライセンスにしています。
作ってみた感想
上のサンプル画像でも言及していますが、実はこれまでのレーベンシュタイン距離を取っていたVBAのコードではなく、Pythonのコードの焼き直しで実装しました。
Pythonの方が辞書型もリスト型も、VBAより機能が豊富なので少し長くなってしまっています。
また、VBAのコレクション型が「0始まり」ではなく、「1始まり」であることに悩まされたりしましたが……何とか近しい挙動ができるようになったと思います。
テストファイルの使い方
このブログを見ている方には、Githubに馴染みの少ない方もいると思いますので、簡単な説明を。
まずはこのページにアクセスし、「test」を選択します。
すると「test.docm」というファイルがあるので、もう一度クリック。すると下図のように下の方に「Download」ボタンが現れます。
これをクリックすることで、テスト用のWordファイルをダウンロードできます。

test.docmをダウンロードしたら、まずは「マクロの有効化」をします。
有効化ができたら、一つ目の枠に「修正前」の文を、二つ目の枠に「修正後」の文を入れてみましょう。
最後に、「Alt+F8」を押して、「WordSeqApplyer.main」というマクロを実行すればOKです。

すると一番下の枠内に、修正履歴付きで差分が表示されます。
今後について
まずはこのコードを、開発中のCATOVISに組み込んでいきたいと考えています。
junkについては、まだ必要性を感じていないのと、まだ理解が不足しているため、しばらくは実装する予定はありません。
また、移植していて気が付いたのですが、”seq2”に入れた文字列の方が処理が多いため、原文vs翻訳メモリとの差分検索のように「一対多」である場合は、seq2に原文を入れた方が計算効率が上がりそうです。
ただ、差分箇所の表示であるopcodeはあくまで、「一つ目の文を二つ目の文にするための処理方法」の記述なので、反対方向のopcodeを計算するメソッドを実装する必要が出てきそうです。
このあたりについては、今使用しているdifflib.jsを改造させてもらうか、改めてTypeScript移植をするか検討中です。
以上、今後ともCATOVISをよろしくお願いいたします。

MS Office Wordと接続。軽量型でWYSIWYGを実現