【Word】差分確認マクロをGithubにて公開

このブログではたびたびVBAによるレーベンシュタイン距離の実装について触れてきました。

【Excel】一致率の可視化(レーベンシュタイン距離)

【VBA】一致率の可視化(レーベンシュタイン距離)続

今回はこれらのコード実用化に向けて、温めてきたものです。ツイッターでは一足先につぶやいていましたが、差分を取得した後に、異なる部分のみWordの修正履歴付きで反映したいと思います。

difflib.SequenceMatcherをVBAで実装し、差分を修正履歴で表示

そしてこのコード(クラスとモジュール)およびサンプルファイルを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をよろしくお願いいたします。

CATOVIS LS

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