Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

テキストの差分をとるツール

449 views
Skip to first unread message

IIJIMA 'Delmonta' Hiromitsu

unread,
Feb 9, 2001, 5:05:24 AM2/9/01
to
いいじま@東大文学部です。

#クロスポスト先注意。内容に応じて適宜絞ってください。

現在、テキストファイルの差分をとるツールを探しています。
行単位での差分ならば UNIX の diff コマンド
(Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
あたりから引っ張ってくればいいでしょう)で取れますが、
文字単位で差分をとりたいのです。たとえば、

[file1.txt]
現在、テキストの差分をとる<改行>
ツールを探しています。行単<改行>
位での差分ならば…以下略

[file2.txt]
テキストファイルの差分をと<改行>
るツールを探しています。行<改行>
単位での差分ならば…以下略

という場合に、diff では「file1.txt の 1 行目から x 行目までと、
file2 の 1 行目から y 行目までが違う」という結果を出しますが、
「file1 から file2 では、『現在、』がなくなり、『ファイル』が
追加された」という情報を出してくれるものがほしいのです。

文字コードは、とりあえず Shift_JIS か EUC-JP の決め打ちでいいの
ですが、これに ISO-2022-JP を加えた三者の自動判別ができればなお可。

動作環境は、次のどれかで動くものを。
○Windows 98 で動くバイナリ、または Visual C++ 4.0(^^;) か
 LSI C-86 3.30C 試食版あたりでコンパイル可能なソース
○FreeBSD 3.4(x86)か Solaris 2.6(SPARC)で動くバイナリ、
 またはこれらの上の gcc でコンパイル可能なソース
○Perl 5.005_03(Windows なら ActivePerl build 5xx)で
 動作するスクリプト
○Netscape 4.73 で動作する JavaScript スクリプト
○一太郎 8、Word 98、秀丸 3.05 で動くマクロ
○その他いろいろあるけど省略

出力形式は特にこだわりませんが、たとえば HTML か RTF(rich text
format)あたりの形式で

<s>現在、</s>テキスト<b>ファイル</b>の差分をとる
ツールを探しています。行単位での差分ならば…

のように(<s>...</s>=取消線、<b>...</b>=太字)ファイルに保存
できればうれしいです。

#ひょっとして、diff にオプションをつければそれで簡単に
#できるのかな?

なければ自作する用意はあるので、この手の差分検出アルゴリズムに
関する情報もあればよろしくお願いします。

☆------ Delmonta / IIJIMA Hiromitsu (飯嶋 浩光) -------------------☆
【宣伝】EmacsのVZ+ATOK+カナ入力化など外道カスタマイズの数々
近日メールマガジン配信再開予定
http://user.ecc.u-tokyo.ac.jp/~l94102/emacs/
☆------ L94...@mail.ecc.u-tokyo.ac.jp / delm...@ht.sakura.ne.jp --☆

Tanaka Akira

unread,
Feb 9, 2001, 5:37:52 AM2/9/01
to
In article <3A83C0E4...@ht.sakura.ne.jp>,

IIJIMA 'Delmonta' Hiromitsu <delm...@ht.sakura.ne.jp> writes:

> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

英語であれば wdiff が即座に思い浮かびます。日本語には使えませんが。
http://www.fsf.org/software/wdiff/wdiff.html

docdiff というものがあるらしいですが、どこにあるのかは知りません。
http://www.topstudio.co.jp/~kmuto/d/?2001020&to=2001020711#2001020711

ちなみに、

#!/bin/sh

tmp1=/tmp/jwdiff$$-1
tmp2=/tmp/jwdiff$$-2

trap "rm -f $tmp1 $tmp2" 0 1 2 3 15

cat "$1" |nkf -e|kakasi -s > $tmp1
cat "$2" |nkf -e|kakasi -s > $tmp2

wdiff $tmp1 $tmp2|tr -d ' '

という wrapper を使っていたこともありましたが、あまりうまくないですね。

> なければ自作する用意はあるので、この手の差分検出アルゴリズムに
> 関する情報もあればよろしくお願いします。

http://hp.vector.co.jp/authors/VA007799/viviProg/doc5.htm とか?
--
[田中 哲][たなか あきら][Tanaka Akira]
「ああ、それは大丈夫だよぉ。カイロを持って行くもぉん⊇」
(気象精霊記2 爆弾気分の低気圧, 清水文化)

Kawaguti Ginga

unread,
Feb 9, 2001, 5:46:21 AM2/9/01
to
川口です

<3A83C0E4...@ht.sakura.ne.jp>の記事において
delm...@ht.sakura.ne.jpさんは書きました。


> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

"単語単位" であれば wdiff というのがあります.
FreeBSD の distfiles mirror には転がっています.

> 出力形式は特にこだわりませんが、たとえば HTML か RTF(rich text
> format)あたりの形式で

{} で括られるような感じですが,私はあまり使っていないので
試してみてください.
--
∧∧
Zzz.. (- - )⌒⌒⊇~ 川口 銀河
############## gi...@athena.club.ne.jp

Tanaka Akira

unread,
Feb 9, 2001, 6:17:00 AM2/9/01
to
In article <3A83C0E4...@ht.sakura.ne.jp>,
IIJIMA 'Delmonta' Hiromitsu <delm...@ht.sakura.ne.jp> writes:

> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

英語であれば wdiff が即座に思い浮かびます。文字単位でなく単語単位です
し、日本語には使えませんが。
http://www.fsf.org/software/wdiff/wdiff.html

docdiff というものがあるらしいですが、どこにあるのかは知りません。
http://www.topstudio.co.jp/~kmuto/d/?2001020&to=2001020711#2001020711

ちなみに、

#!/bin/sh

tmp1=/tmp/jwdiff$$-1
tmp2=/tmp/jwdiff$$-2

trap "rm -f $tmp1 $tmp2" 0 1 2 3 15

cat "$1" |nkf -e|kakasi -s > $tmp1
cat "$2" |nkf -e|kakasi -s > $tmp2

wdiff $tmp1 $tmp2|tr -d ' '

という wrapper を使っていたこともありましたが、あまりうまくないですね。

> なければ自作する用意はあるので、この手の差分検出アルゴリズムに
> 関する情報もあればよろしくお願いします。

http://todo.org/cgi-bin/jp/tiki.cgi?c=v&p=diff とか?

ここにも載っていますが、perl には Algorithm::Diff というモジュールがあ
ります。
http://bike-nomad.com/perl/

Tomoaki NISHIYAMA

unread,
Feb 9, 2001, 6:37:42 AM2/9/01
to
IIJIMA 'Delmonta' Hiromitsu <delm...@ht.sakura.ne.jp> writes:

> ○一太郎 8、Word 98、秀丸 3.05 で動くマクロ

前提として、Wordの「変更履歴の作成」では、判定品質が
低すぎるという事ですね?
--
Tomoaki Nishiyama
e-mail:tom...@nibb.ac.jp
National Institute for Basic Biology

Masao Uebayashi

unread,
Feb 9, 2001, 9:42:31 AM2/9/01
to
> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、
>
> [file1.txt]
> 現在、テキストの差分をとる<改行>
> ツールを探しています。行単<改行>
> 位での差分ならば…以下略
>
> [file2.txt]
> テキストファイルの差分をと<改行>
> るツールを探しています。行<改行>
> 単位での差分ならば…以下略

$ cat tmp1


































$ cat tmp2



































$ diff -u tmp1 tmp2
--- tmp1 Fri Feb 9 23:33:10 2001
+++ tmp2 Fri Feb 9 23:32:53 2001
@@ -1,10 +1,11 @@
-現
-在
-、




+フ
+ァ
+イ
+ル


うーん、上出来スギ。:-)

--
ウエ林

Masao Uebayashi

unread,
Feb 9, 2001, 9:54:18 AM2/9/01
to
> $ diff -u tmp1 tmp2
> --- tmp1 Fri Feb 9 23:33:10 2001
> +++ tmp2 Fri Feb 9 23:32:53 2001
> @@ -1,10 +1,11 @@
> -現
> -在
> -、
> テ
> キ
> ス
> ト
> +フ
> +ァ
> +イ
> +ル
> の
> 差
> 分

任意のテキストを「一行/『一文字』」に変換 ("diff" コマンドのため) して
出力する、これをコマンドラインで行ううまい方法が見つかれば、後は、何を
「一文字」 (要素) として見るかが問題であって、その「一文字」 (要素) の並
び (sequence) から、何を差分とみなすのか、は、"diff" コマンドが行うそれ
と同じでいいですよね。

(なんていいつつ "diff" のアルゴリズムすら分かっていないオレ…)

--
ウエ林

IIJIMA 'Delmonta' Hiromitsu

unread,
Feb 10, 2001, 1:45:13 AM2/10/01
to
いいじま@東大文学部です。

> > ○一太郎 8、Word 98、秀丸 3.05 で動くマクロ
>
> 前提として、Wordの「変更履歴の作成」では、判定品質が
> 低すぎるという事ですね?

いえ、Word は常用していないので、そういう機能の存在を知らない
だけです(^^;) 勉強してみます。

Shiroh Sado

unread,
Feb 10, 2001, 11:47:09 AM2/10/01
to
スレッド「テキストの差分をとるツール」での
delm...@ht.sakura.ne.jp氏の発言 <3A83C0E4...@ht.sakura.ne.jp> より引用
>> なければ自作する用意はあるので、この手の差分検出アルゴリズムに
>> 関する情報もあればよろしくお願いします。

ある程度入り組んだ差分になる場合は、DPマッチングが定番だ
と思うんです。パターン認識の教科書にはほぼ100%書いてある、
あれです。

実装は簡単ですが、そのまま使うと入力文字列の2乗に比例する
空間計算量が必要なのが、難点になりかねませんね。

しかしそこは、一致した箇所がある程度以上連続したらそこで文
字列を区切り、差分発生箇所だけマッチングを行うなどの処理を
ツールの内部で行えば、大丈夫かと。

---
佐渡詩郎 (さど しろう) / e-mail : sa...@smlab.tutkie.tut.ac.jp

IIJIMA 'Delmonta' Hiromitsu

unread,
Feb 10, 2001, 8:34:54 AM2/10/01
to
いいじま@東大文学部です。

ありがとうございます。

> > 現在、テキストファイルの差分をとるツールを探しています。
(中略)
> > 文字単位で差分をとりたいのです。


>
> 英語であれば wdiff が即座に思い浮かびます。文字単位でなく単語単位です
> し、日本語には使えませんが。
> http://www.fsf.org/software/wdiff/wdiff.html

見てみました。なるほど、diff へのフロントエンドですか。
同じ要領でテキトーにスクリプトを作れば文字単位での差分検出も
できそうですね。

いま抱えてる仕事(シグナチャに書いてある記事と、本業のほうと…)が
片付いたらテキトーに perl で書いてみよう。
diff -U 1000 あたりで何とかなりそうだな…

> docdiff というものがあるらしいですが、どこにあるのかは知りません。
> http://www.topstudio.co.jp/~kmuto/d/?2001020&to=2001020711#2001020711

そうですねぇ…どこにあるんでしょう。chasen を使うところから判断して
http://www.ruby-lang.org/en/raa-list.rhtml?name=DocDiff でしょうか?

Ruby か…使う気が萎えるなあ(^^;)

> perl には Algorithm::Diff というモジュールがあります。
> http://bike-nomad.com/perl/

ダウンロードしてみました。
…Windows(ActivePerl)でも単純にファイルのコピーだけすれば
使えそうな気配ですが、中身を見たところ、全然使い方を知らない
大括弧 [] の山が(^^;)

というわけでこれは断念です(^^;)

Shuichi YAMAGAMI

unread,
Feb 11, 2001, 12:36:50 PM2/11/01
to
delm...@ht.sakura.ne.jpさんの記事
<3A83C0E4...@ht.sakura.ne.jp>について:

>
> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は
http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

<< エキサイティング・ダウンロード! for Windows >>
http://www.so-net.ne.jp/download/win/util/text/
にもfc、diff系のソフトウェアのコレクションがありました。

---


> 出力形式は特にこだわりませんが、たとえば HTML か RTF(rich text
> format)あたりの形式で

上記のサイトからたどっていった結果、
<< MarkDiff トップ >>
http://www.userssoft.co.jp/markdiffj/index/default.htm
が、Word2000環境に特化していて、「HTML か RTF(rich text
format)あたりの形式で」Output可能な感じがしました。
冗長性を排した、いわゆるインテリジェントな比較・差分が可能な
ようです。
# ただし、この製品の価格は業務用の感じです(\88,000)。

---
> なければ自作する用意はあるので、この手の差分検出アルゴリズムに
> 関する情報もあればよろしくお願いします。
<< MarkDiff の作り方 >>
http://www.userssoft.co.jp/markdiffj/contents/secret.html
にちょっとしたsecretが載っていますが、人工知能技術を駆使しなけ
ればならないのでなかなか大変なようです。

---
テキストファイル用で間に合うのであれば、
<< Eagle Compare トップ >>
http://www.userssoft.co.jp/eagle/index/default.htm
<< ファイル比較ツール「Eagle Compare」(Windows95/ユーティリティ) >>
http://www.vector.co.jp/soft/win95/util/se124257.html?s
の「Eagle Compare」がよいかも知れません。
# こちらの方は、Personal用の価格ですね(\3,500)。
# また、比較エンジンを部品として使用可能なようです。
} [ReadMe.txtより引用]
} (3)比較エンジンを部品としても使用できる
} ご自身のプログラム(C++,VB)にファイル比較機能を組
} み込むことが可能です。
} 詳しくは下記のホームページをご覧ください。
} http://www.userssoft.co.jp/eagle/index/techinfo.htm

--
Shuichi YAMAGAMI, Kyoto, JAPAN
yam...@mbox.kyoto-inet.or.jp

Yoshihiko SARUMARU

unread,
Feb 11, 2001, 10:49:26 PM2/11/01
to
 猿丸です。

fj.comp.misc,fj.os.ms-windows.win98,fj.questions.unix の <3A83C0E4...@ht.sakura.ne.jp> の記事において
2001-02-09(金) 19:05頃、delm...@ht.sakura.ne.jpさんは書きました。

> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

Emacs で ediff-files とか ediff-buffers は駄目ですか?

> 出力形式は特にこだわりませんが、たとえば HTML か RTF(rich text
> format)あたりの形式で

出力はたぶん Emacs 上にしかできません。


> なければ自作する用意はあるので、この手の差分検出アルゴリズムに
> 関する情報もあればよろしくお願いします。

には役立つかも。

--
猿丸芳彦 (Yoshihiko SARUMARU)
mail: mis...@imasy.or.jp web: http://www.imasy.or.jp/~mistral/

IIJIMA 'Delmonta' Hiromitsu

unread,
Feb 12, 2001, 6:31:49 AM2/12/01
to
いいじま@東大文学部です。

> 任意のテキストを「一行/『一文字』」に変換 ("diff" コマンドのため) して
> 出力する、これをコマンドラインで行ううまい方法が見つかれば、後は、何を
> 「一文字」 (要素) として見るかが問題であって、その「一文字」 (要素) の並
> び (sequence) から、何を差分とみなすのか、は、"diff" コマンドが行うそれ
> と同じでいいですよね。

その作業をするツールを書こうと考えています。
たぶん perl で書いて、diff の出力を取り込んで再加工する
形になるんだと思います。

> (なんていいつつ "diff" のアルゴリズムすら分かっていないオレ…)

おなじく。

Masao Uebayashi

unread,
Feb 13, 2001, 10:02:57 AM2/13/01
to
要は text の差分をうまい具合に表示してくれればよいわけですね。。。

直接の答えではありませんが、以前 (一年位前?) bit 誌に文書校正記述用言語
(?) の話があったような覺えがあります。竹内郁雄御大の記事でした。名前も
面白かったけれども思い出せません。

--
ウエ林

Hideyuki ENDO

unread,
Feb 13, 2001, 10:22:54 AM2/13/01
to
えんどうです

もしかして真鵺道(まぬえど)
http://www.archi.is.tohoku.ac.jp/~yamauchi/projects/manued/index-j.shtml

のことかいね?

分散環境での校正をサポートするメソッドでありシステムですね。

では
はは
--
Hideyuki ENDO end...@remus.dti.ne.jp

Tanaka Yorihito

unread,
Feb 13, 2001, 10:39:06 AM2/13/01
to
<96bib8$ra4$1...@pin3.tky.plala.or.jp> の
ma...@orchid.plala.or.jpさんの記事

>> 文書校正記述用言語

と聞くと、「トルツメ」なんかも言語かなと思ってしまいます。

Yorihito Tanaka
Keio University
Graduate School of Media and Governance
E-mail: yo...@tom.sfc.keio.ac.jp

SAKAI Kiyotaka

unread,
Feb 20, 2001, 9:09:01 PM2/20/01
to
>> In article <3A83C0E4...@ht.sakura.ne.jp>, IIJIMA 'Delmonta' Hiromitsu <delm...@ht.sakura.ne.jp> writes:

> 現在、テキストファイルの差分をとるツールを探しています。
> 行単位での差分ならば UNIX の diff コマンド
> (Windows 版は http://www.vector.co.jp/soft/winnt/prog/se015009.html
> あたりから引っ張ってくればいいでしょう)で取れますが、
> 文字単位で差分をとりたいのです。たとえば、

ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/cdif-1.15

--
酒井 清隆 (E-mail: ksa...@kso.netwk.ntt-at.co.jp)

0 new messages