\section{はじめに}
差分検出を行なうdiffコマンドは言語処理の研究において役に立つ場面が数多く存在する．本稿では，まず簡単にdiffの説明を行ない，その後，diffを使った言語処理研究の具体的事例として，差分検出，書き換え規則の獲得，データのマージ，最適照合の例を示す\footnote{本稿は筆者のさまざまな言語処理研究におけるdiffというツールの使用経験を述べたものであり，今後の自然言語処理，言語学の研究に有益な知見を与えることを目的にしている．}．あらかじめ本稿の価値を整理しておくと以下のようになる．\begin{itemize}\itemdiffコマンドはUNIXで標準でついているため，これを用いることは極めて容易である．この容易に利用できるdiffコマンドを用いることで，さまざまな言語処理研究を行なうことができることを示している本稿は，容易さ，簡便さの観点から価値がある．\item近年，言い換えの研究が盛んになりつつある\cite{iikae_jws}．本稿の\ref{sec:kakikae}節では実際に話し言葉と書き言葉の違いの考察，また話し言葉と書き言葉の言い換え表現の獲得\cite{murata_kaiho_2001}にdiffが利用できることを示している．diffの利用は，話し言葉と書き言葉に限らず，多方面の言い換えの研究に役に立つと思われる．本稿はそれらの基盤的なものとなると思われる．\itemdiffコマンドは一般には差分の検出に利用される．しかし，本稿で述べるようにデータのマージや最適照合にも利用できるものである．本稿では\ref{sec:merge}節で，このデータのマージ，最適照合の例として，対訳コーパスの対応づけ，講演と予稿の対応づけ，さらに最近はやりの質問応答システム(「日本の首都はどこですか」と聞くと「東京」と答えるシステムのこと)といった，種々の興味深い研究をdiffという簡便なツールで実現する方法を示している．本稿はこのような研究テーマもしくは研究手段の斬新性といった側面も兼ね備えている．\end{itemize}
\section{diffとmdiff}
\label{sec:diff_and_mdiff}本節ではdiffについて説明する．本稿でいうdiffとはUNIXのファイル比較ツールdiffのことである．このコマンドは，与えられた二つのファイルの差分を順序情報を保持したまま行を単位として出力する\footnote{diffコマンドの内部のアルゴリズムについては文献\cite{algo}のp.282に説明がある．}．例えば，\begin{verbatim}今日学校へいく\end{verbatim}ということが書いてあるファイルと\begin{verbatim}今日大学へいく\end{verbatim}ということが書いてあるファイルがあるとする．これらのdiffをとると，差分の部分が\begin{verbatim}<学校へ>大学へ\end{verbatim}のような形で出力される．ところで，diffコマンドには\verb+-D+オプションという便利なオプションがある．これをつけてdiffコマンドを使うと差分部分だけでなく共通部分も出力される．つまりファイルのマージが実現される．また，差分部分はCのプリプロセッサなどで使われるifdef文などで表現される．この場合，場所によって差分部分の表示の順番が逆転しテキスト全体として差分の状態がわかりにくくなり，また，ifdefという機械的な記号だと人間の目で認識するのが困難であるため，ここでは差分部分は以下のように表示することにする\footnote{ここにifdef文からmdiffの出力への変形方法を記述しておく．ifdefが使われているときは順序を保存したまま，表現のみ``;▼▼▼▼▼▼''などに変更する．ifndefが使われているときは差分の順序を変更してから表現を``;▼▼▼▼▼▼''などに変更する．}．\begin{verbatim};▼▼▼▼▼▼(一つめのファイルにだけある部分);●●●(二つめのファイルにだけある部分);▲▲▲▲▲▲\end{verbatim}ここでは，``\verb+;▼▼▼▼▼▼+''は差分部分の始まりを，``\verb+;▲▲▲▲▲▲+''は差分部分の終りを意味し，``\verb+;●●●+''は差分を構成する二つのデータの境界を意味する．本稿では，\verb+-D+オプションをつけてさらにifdefの部分を上記のように表示して，ファイルのマージを行なう場合のdiffを{\bfmdiff}と呼ぶ(mはmergeのm)．(mdiffの構成方法および使用方法については付録\ref{sec:exp_mdiff}をつけておいた．参考にしてほしい．)実際に先ほどのデータに対してmdiffをかけてみると，以下のような結果になる．\begin{verbatim}今日;▼▼▼▼▼▼学校へ;●●●大学へ;▲▲▲▲▲▲いく\end{verbatim}「今日」が一致し，「学校へ」と「大学へ」が差分となり，「いく」がまた共通部分となっている．mdiffの出力はdiffと異なり一致部分も出力されるためにわかりやすい．また，mdiffの結果からは元の二つのファイルのデータを完全に復元することができる．共通部分と，差分部分の黒丸(;●●●)の上側だけを取り出すと，\begin{verbatim}今日学校へいく\end{verbatim}のように一つ目のファイルの情報が取り出される．また，共通部分と，差分部分の黒丸(;●●●)の下側だけを取り出すと，\begin{verbatim}今日大学へいく\end{verbatim}のように二つ目のファイルの情報が取り出される．このように元の情報を完全に復元できる．また，mdiffでは一致部分は片方のデータにあったものだけを表示し，不一致部分のみ両方のデータのものを表示するために，元の二つのデータよりもデータ量は削減できるが，上記のように元の情報を完全に復元できるために，復元できる状態でデータ量を削減するという意味でmdiffはデータ圧縮を実現しているものともいえる．次に文字を単位としたmdiffを考える．言語処理の場合は文字単位で差分を取りたい場合が多い．そのようなときは一度ファイルの中身の情報を，一文字ずつ改行をして出力したファイルでmdiffをとればよい．例えば先のファイルの情報だと，\begin{verbatim}今日学校へいく\end{verbatim}という形にしてから，mdiffをとればよい．diffの表示は見にくく，mdiffはdiffで表示される情報を完全に含むので以降の説明はmidffを用いて行なう．以降の節では，実際にこのmdiffを使った言語処理の実例を見ていくこととする．
\section{差分検出，および，書き換え規則の獲得}
本節ではmdiffを用いて差分検出したり，またその差分結果から書き換え規則を獲得する研究などを記述する．具体的には，以下のものを示す．\begin{itemize}\item複数システムの出力の差分検出\item差分の考察と書き換え規則の獲得\end{itemize}\subsection{複数システムの出力の差分検出}\label{sec:system}筆者は以前，jumanのシステムのバージョン\cite{juman,araya_juman}が複数乱立しているとき，この複数のjumanの出力をmdiffによりマージして形態素結果の品質を向上させる\footnote{これは，文脈処理の研究\cite{murata_shuuron,murata_noun_nlp,murata_deno_nlp}を行なう際に，文脈処理の前段階の形態素解析，構文解析の誤りを修正するために行なっていた．}ことをしていた\footnote{同様の考え方は文献\cite{fujii1998}にもある．また，この種の考え方はシステム融合(複数のシステムを組み合わせることで個々のシステムの精度以上のものを得ることを目的としたもの)という形でよくしられている\cite{murata_nlc2001_wsd}．}．ここではこれを説明する．「といったこと」を解析し，jumanのAというバージョンの出力が\begin{verbatim}とと助詞いった言う動詞ことこと名詞\end{verbatim}となっていて，Bのバージョンの出力が\begin{verbatim}とと助詞いった行く動詞ことこと名詞\end{verbatim}となっているとしよう．「いった」という語は「行く」と「言う」の曖昧性があり，Bのバーションではこれを誤って「行く」の方の語であると出力していたとする．ここでmidffをとると以下のような結果となる．\begin{verbatim}とと助詞;▼▼▼▼▼▼いった言う動詞;●●●いった行く動詞;▲▲▲▲▲▲ことこと名詞\end{verbatim}mdiffをとることで複数のシステムの出力の差異を容易に検出することができる．この場合「いった」の部分の出力に差異があることがわかる．ここで，出力修正の作業者はこのような差分が検出された箇所においてどちらが正しいかを判断し，上が正しければなにもせず下が正しければ「;●●●」の先頭に``x''をつけるなどとすると決めておく．そのようにすると，``x''がなければ差分の下を，あれば差分の上の情報と区切り記号を消すことで，その作業結果のデータから自動的にそれぞれの差分からよい結果の方を選び，それぞれのバージョンのものよりも高い精度の結果を生成できる．また，差分の両方が誤っている場合がよくある．このときは「;●●●」の上の方のデータを実際に書き直すとよい．この方法を用いると，修正できないものは両方のバージョンで同じように誤るものだけであり，多くの形態素誤りを修正できる．ここで注意すべきことは異なる性質のシステムを複数用意しないといけないということである．誤り方が同じシステムの場合だと多くの誤りを見逃すことになる．また，システムが三つある場合はdiff3コマンドを使うとよい．diff3は三つのファイルの差分を検出することができる．上記では形態素解析を例にあげたが，他の解析でも解析結果を行単位にすることでmdiffで差分をとることができる．ここでは，複数のシステムの出力の差分をとる話をしたが，一つをタグつきコーパスとし，それをなにかのシステムで解析した結果と比較することで，そのタグつきコーパスの誤りを検出し修正する\footnote{コーパス修正の先行研究には文献のもの\cite{murata2000_3_nl,NLP2001}がある．}ということもできる．\begin{table}[t]\begin{center}\leavevmode\caption{書き言葉データと話し言葉データの例}\label{tab:write_talk_juman}\begin{tabular}{|l|}\hline\multicolumn{1}{|c|}{書き言葉データ}\\\hline本\\論文\\で\\は\\意味\\ソート\\に\\ついて\\述べる\\。\\一般に\\ソート\\は\\５０\\音\\順\\\hline\end{tabular}\hspace{.5cm}\begin{tabular}{|l|}\hline\multicolumn{1}{|c|}{話し言葉データ}\\\hline今日\\は\\え\\意味\\ソート\\に\\ついて\\述べ\\ます\\一般に\\ソート\\って\\いう\\の\\は\\だいたい\\\hline\end{tabular}\end{center}\end{table}\begin{table}[t]\begin{center}\leavevmode\caption{書き言葉データと話し言葉データのdiffの結果}\label{tab:write_talk_diff}\begin{tabular}{|l|}\hline;▼▼▼▼▼▼\\本\\論文\\で\\;●●●\\今日\\;▲▲▲▲▲▲\\は\\;▼▼▼▼▼▼\\;●●●\\え\\;▲▲▲▲▲▲\\意味\\ソート\\に\\(右欄につづく)\\\hline\end{tabular}\hspace{.5cm}\begin{tabular}{|l|}\hlineついて\\;▼▼▼▼▼▼\\述べる\\。\\;●●●\\述べ\\ます\\;▲▲▲▲▲▲\\一般に\\ソート\\;▼▼▼▼▼▼\\;●●●\\って\\いう\\の\\;▲▲▲▲▲▲\\\hline\end{tabular}\end{center}\end{table}\begin{table}[t]\begin{center}\leavevmode\caption{差分部分の抽出}\label{tab:write_talk_diff_ext}\begin{tabular}{|l|l|}\hline\multicolumn{1}{|c|}{書き言葉データ}&\multicolumn{1}{|c|}{話し言葉データ}\\\hline本論文で&今日\\&え\\述べる。&述べます\\&っていうの\\\hline\end{tabular}\end{center}\end{table}\subsection{差分の考察と書き換え規則の獲得}\label{sec:kakikae}ここでは，文献\cite{murata_kaiho_2001}でも述べた話し言葉と書き言葉のdiffの研究について記述する．この研究では，対応のとれた話し言葉と書き言葉のデータを使い，それらの差分から話し言葉と書き言葉の違いを考察したり，話し言葉から書き言葉への言い換え規則，また，その逆のための規則を獲得した．データとしては，学会の口頭発表を話し言葉データとし，その口頭発表の内容が記されたその学会の予稿原稿を書き言葉として用いた．例えば，話し言葉と書き言葉のデータが表\ref{tab:write_talk_juman}のような形で与えられたとする\footnote{ここではわれわれの意味ソートの論文\cite{murata_msort_nlp}のものを例にあげている．ところで，本稿ではdiffを扱ったが，その論文ではUNIXのsortコマンドを用いて様々な情報を意味の情報でソートする，つまり，順序付けて並べるということを行ない，それらが種々の言語処理にどのように役に立つかを議論している．興味があれば，この文献も読むことをお奨めする．}．ここでは，差分がとりやすいように形態素解析システムなどで1行に1単語がはいるような形に変換してある．このような書き言葉と話し言葉のデータが与えられたとき，mdiffをとると，表\ref{tab:write_talk_diff}のような結果を得る．この結果から，差分部分だけを抽出すると表\ref{tab:write_talk_diff_ext}のような結果が得られる．この結果から，話し言葉には「え」などが挿入されること，また話し言葉では「っていうの」という表現をいれて発話をなめらかにすることなどがわかる．また，「述べる」が「述べます」と言い換えられることがわかる\footnote{実際には，ここであげた例ほどきれいに話し言葉と書き言葉は対応がとれず，「本論文は」と「今日」のような言い換え表現としてはよくない対応が多く，確率などを用いたソートを用いて確信度の高い良質な差分情報を集めるということを行なう(これについては文献\cite{murata_kaiho_2001,murata_nl2001_henkei}を参照せよ)．}．以上のようにmdiffを使うことで話し言葉と書き言葉の差異を検出でき，またそれを考察することで，話し言葉と書き言葉の違いを調査できることがわかる．また，これらの差分は話し言葉と書き言葉の言い換え規則としてみることもできる．例えば，「え」の部分は，書き言葉になにもないところに話し言葉に変換する場合「え」をいれるという規則のように見ることができる．また，「述べる」と「述べます」の部分は，話し言葉に変換する場合は「述べる」を「述べます」に言い換える規則のように見ることができる．その意味でmdiffを用いることで言い換え規則，もしくは，変換規則を検出できることがわかる．ここでは，話し言葉と書き言葉のデータを例にとったが，このようなことはさまざまなところで可能である．例えば，英文校閲前のテキストと英文校閲後のテキストで，mdiffをとると，どのような間違いをどのように直せばよいかがわかるし，また英文校閲用の規則が獲得できる．また，要約前のテキストと要約後のテキストで，mdiffをとると，どのように要約されているかを如実に見ることができるし，また要約用の規則が獲得できる\footnote{diffやmdiffは用いていないが，要約前のテキストと要約後のテキストで，DPマッチングを用い，どのように要約されているかを調べたり要約用の規則を獲得したりする研究として文献\cite{Kato1999,mochinushi2000}などがある．diffで行なうことはDPマッチングでもできる．diffは文献にもあるように最長共通部分列(longestcommonsubsequence)のアルゴリズムを用いるもので，共通部分が最大になるような形でデータの照合を行なう．このため，共通部分を評価値とするDPマッチングのプログラムを作るとその出力する結果はdiffとまったく等価となる．さらにDPマッチングでは品詞，意味情報なども評価値に使うことでより精密に照合を行なうことができる．このため，精度を重視する場合はDPなどをプログラミングした方がよい．しかし，それほど精度を重視せず研究として差異がどうなっているかを調べる程度ならばdiffでも十分役に立つ．}．その他にも対応のとれた性質の異なるデータに対してmdiffをとることで，さまざまな考察と，言い換え規則の獲得ができることだろう\footnote{ここでの議論とは逆に，性質の同じ対応のとれたデータに対してmdiffをとることも考えられる．この場合，性質が同じデータのため，差分としては等価な表現対，つまり，同義表現が獲得されることになる．実際，われわれは異なる辞書の定義文をmdiffにより照合することで，同義表現の獲得\cite{murata_nl2001_henkei}を行なっている．}．
\section{データのマージ，および，最適照合}
\label{sec:merge}本節ではmdiffのデータをマージする機能，および，そのマージの最適照合能力\footnote{diffの場合共通部分を最大にするような形で最適な照合を行なっている．}を利用したものについて記述する．具体的には以下の三つについて記述する．\begin{itemize}\item対訳コーパスの対応づけ\item講演と予稿の対応づけ\item最適照合能力を用いた質問応答システム\end{itemize}\begin{figure}[t]\begin{center}\leavevmode\begin{tabular}[h]{|l|}\hline{\begin{minipage}[h]{4cm}\verb+<Section1>+..................................................\verb+<Section2>+..................................................\end{minipage}}\\\hline\end{tabular}\caption{コーパスの構成}\label{tab:mt_corpus}\end{center}\end{figure}\begin{figure}[t]\begin{center}\leavevmode\begin{tabular}[h]{|l|}\hline{\begin{minipage}[h]{4cm}\verb+<Section1>+;▼▼▼▼▼▼(日本語文の内容);●●●(英語文の内容);▲▲▲▲▲▲\verb+<Section2>+;▼▼▼▼▼▼(日本語文の内容);●●●(英語文の内容);▲▲▲▲▲▲\end{minipage}}\\\hline\end{tabular}\caption{mdiffによって対応づけられた対訳コーパス}\label{tab:mt_corpus_mdiff}\end{center}\end{figure}\subsection{対訳コーパスの対応づけ}\label{sec:taiyaku}ここでは対訳コーパスの対応づけを考える\footnote{対訳コーパスは，機械翻訳\cite{murata_nlc2001,modal2001}の研究を行なう上で重要な研究資料となる．}．ここで条件としてそれぞれのコーパスには対応する箇所に同じ記号が入っていることを前提とする．また，対応づけの単位はこの記号で区切られた部分であるとする．例を図\ref{tab:mt_corpus}にあげる．ここでは日本語のコーパスと英語のコーパスがまだばらばらに存在し，対応づけられていないとする．また，それぞれは図\ref{tab:mt_corpus}のように両方とも\verb+<Section1>+などの同じ形をしたセクション情報が与えられているとする．このとき，日本語と英語では同じセクションのものは同じ内容であるとする．この場合，これらのデータのmdiffをとることで，図\ref{tab:mt_corpus_mdiff}のような結果を得ることができる．この結果では，\verb+<Section1>+などが共通部分となり，その他の部分が不一致部分となる．この不一致部分では日本語と英語が上下にわかれて格納されることになる．このようにすることで，mdiffを用いて対訳データが作成されることになる．ここで示したものは，文ごとなどの細かい対応づけをするものでなく，セクションなどの大雑把なもので一見役に立たないように思えるかもしれないが，文の対応づけは難しい問題で，まずあらかじめ対応がとれていることがはっきりしている章，段落のレベルで対応づけをしてから細かい対応づけをするという考え方もあり\cite{haruno_ipsj97}，その意味ではこのような粗い対応づけも役に立つ．また，ここで示したものは\verb+<Section1>+などの情報を認識させて区分するだけなのでそのようなことをするプログラムを書くことでも同じように対訳データの対応づけを行なうことができる．しかし，mdiffを使うとそのようなプログラムも書くこともなく対応づけを容易に実現できるのである．\begin{figure}[t]\begin{center}\leavevmode\begin{tabular}[h]{|l|}\hline{\begin{minipage}[h]{4cm}\verb+<Chapter1>+(1章の内容)\verb+</Chapter1>+\verb+<Chapter2>+(2章の内容)\verb+</Chapter2>+\verb+<Chapter3>+(3章の内容)\verb+</Chapter3>+\end{minipage}}\\\hline\end{tabular}\caption{予稿データの構成}\label{tab:youkou_kousei}\end{center}\end{figure}\begin{figure}[t]\begin{center}\leavevmode\begin{tabular}[h]{|l|}\hline{\begin{minipage}[h]{4cm};▼▼▼▼▼▼\verb+<Chapter1>+(予稿のみの内容);●●●(講演のみの内容);▲▲▲▲▲▲(共通する内容);▼▼▼▼▼▼(予稿のみの内容);●●●(講演のみの内容);▲▲▲▲▲▲(共通する内容);▼▼▼▼▼▼\verb+</Chapter1>+\verb+<Chapter2>+(予稿のみの内容);●●●(講演のみの内容);▲▲▲▲▲▲\end{minipage}}\\\hline\end{tabular}\caption{予稿と講演のmdiffの結果}\label{tab:youkou_mdiff}\end{center}\end{figure}\begin{figure}[t]\begin{center}\leavevmode\begin{tabular}[h]{|l|}\hline{\begin{minipage}[h]{4cm}\verb+<Chapter1>+(講演のみの内容)(共通する内容)(講演のみの内容)\verb+</Chapter1>+\verb+<Chapter2>+(講演のみの内容)\end{minipage}}\\\hline\end{tabular}\caption{講演データへの章の情報の挿入結果}\label{tab:youkou_mdiff2}\end{center}\end{figure}\subsection{講演と予稿の対応づけ}\label{sec:sp_merge}本節では講演と予稿の対応づけ\cite{uchimoto2001}を考える．この講演と予稿は，先の書き換え規則の獲得でも述べた書き言葉データと話し言葉データに対応する．講演は学会の口頭発表で，予稿はその口頭発表に対応する論文のことである．このような講演と予稿が与えられたとき，講演の各部分と，予稿の各部分の対応がとれると，講演を聞いている時だと，それに対応する予稿の部分を参照できるし，予稿を読んでいるときだと，それに対応する講演の部分を参照できて便利である\cite{uchimoto2001,fujii_kaiho_2001}．本節ではこの講演と予稿の対応づけをmdiffで行なうことを考える．ここでは特に予稿の各章が講演のどこの部分に対応するかをmdiffでもとめることにする．ここで予稿と講演とは話は同じ順序でなされると仮定する．また，予稿の章が認識しやすいように予稿のデータには図\ref{tab:youkou_kousei}のように，``\verb+<Chapter1>+''のような記号を挿入しておく．この形にしておいて，予稿と講演のデータに対して，形態素解析をして各行に単語がくる状態でmdiffを使うことで，図\ref{tab:youkou_mdiff}のような結果を得る．ここで，差分部分で予稿に対応する上半分の方を，``\verb+<Chapter1>+''のような記号を除いてすべて消し去ると図\ref{tab:youkou_mdiff2}のような結果を得る．図では元の講演のデータに対して``\verb+<Chapter1>+''のような記号だけが挿入された形になる．つまり，講演のどの部分が予稿のどの章にあたるかがわかることになる．これは簡単にいうと，mdiffの照合能力を用いて予稿と講演を照合し，章の情報だけ残して予稿の情報を消し去ることにより，講演データに章の情報を挿入するということを行なっていることを意味する．このような予稿と講演の対応づけもmdiffを用いると簡単に行なえるのである\footnote{この予稿と講演の対応づけを実際に文献\cite{uchimoto2001}のデータで行なってみた．このときは，mdiffを用いまたデータは各行に単語がくるような状態で行なった．結果は文献\cite{uchimoto2001}の精度と同程度か少しよい程度であった．mdiffを使うこのような簡単な処理でもこのような結果を得ることができるのである．}．\subsection{最適照合能力を用いた質問応答システム}\label{sec:qa}本節ではmdiffの最適照合能力を用いた質問応答システム\cite{qa_memo,murata2000_1_nl,murata_QA_nlp2000ws,murata_nlp2001ws_true}について記述する．質問応答システムとは，例えば，「日本の首都はどこですか」と聞くと「東京」と答えそのものをずばり返すシステムである．知識が自然言語で書かれていると仮定すると，基本的には質問文と知識の文を照合し，その照合結果で疑問詞に対応するところを答えとして出力すればよい．例えば先の問題だと，「日本の首都は東京です」という文を探してきてこの文で疑問詞に対応する「東京」を解として出力するのである．ここではこれをmdiffで行なうことを考える．まず，質問文の疑問詞の部分をXに置き換え，また文末を平叙文に変換し，「日本の首都はXです」を得る．また，知識ベースから「日本の首都は東京です」を得る．ここでこの二つを一文字ずつ改行してからmdiffをとると以下のような結果を得る．\begin{verbatim}日本の首都は;▼▼▼▼▼▼X;●●●東京;▲▲▲▲▲▲です\end{verbatim}ここでXと差分部分で組になっているものを解とすると，「東京」を正しく取り出せることになる．ところで一文字単位に改行してからmdiffを使う場合少々文に食い違いがあっても答えを正しく取り出すことができる．例えば，知識ベースの文が「日本国の首都は東京です」であったとする．この場合はmdiffの結果は以下のようになる．\begin{verbatim}日本;▼▼▼▼▼▼;●●●国;▲▲▲▲▲▲の首都は;▼▼▼▼▼▼X;●●●東京;▲▲▲▲▲▲です\end{verbatim}差分部分は少し増えるがXに対応する箇所は「東京」のままで，解を正しく抽出できる．ところで，われわれが提案する質問応答システムでは類似度を尺度として用いた変形をくりかえし，質問文と知識データの文がより一致した状態で上記のような照合を行なう．このために類似度を定義する必要がある．mdiffを用いた場合は一致部分と不一致部分が認定できるので，類似度は(一致部分の文字数)/(全文字数)のような形で定義できる\footnote{ここではmdiffにより類似度を求めるようなことをしている．このようにmdiffは文の類似性/類似度を求めることにも役に立つ．}．ここで，「日本国」と「日本」を言い換える規則があれば「日本の首都はXです」を「日本国の首都はXです」と言い換えて照合し，不一致部分を減らすことで，より確実に解を得ることができる\footnote{\label{fn:qa}ここではmdiffに基づく質問応答システムを述べたが，このmdiffに基づく質問応答システムは文献\cite{murata_nlp2001ws_true}でも述べているように文献\cite{murata2000_1_nl}の研究の予備実験として構築したシステムである．精度の高いシステムを目指すならば，文献\cite{murata2000_1_nl}にあるような情報検索\cite{murata_irex_ir_nlp}で用いられるIDFなどの重みを単語に与えてなおかつ構文情報なども用いたシステム\cite{qa_memo}を構築した方がよい．といってもmdiffを使うだけでも簡単な質問応答システムは容易に構築できることは簡便さの観点から価値がある．}．
\section{おわりに}
本稿ではdiffを用いた言語処理の例を多数記述した．\ref{sec:system}節では複数システムの出力を融合することで個々のシステムの精度以上のものを得る研究をdiffを用いて実現する方法を述べた．この種の考え方はシステム融合という形で広く知られているもので，それがdiffで簡便に実現できることを示した．\ref{sec:kakikae}節では言い換えの研究の一例として話し言葉と書き言葉の違いの考察，また，話し言葉から書き言葉への言い換え規則，また，その逆のための規則の自動獲得をdiffで行なっている研究を紹介した．そこでは，話し言葉と書き言葉の言い換えを扱っていたが，言い換えの問題は，文を短縮する要約から，文を修正する文章校正支援，わかりにくい文からわかりやすい文を作成する平易文生成の研究まで幅広いものを含むものであり，それらでもdiffを用いることで，種々の考察や種々の書き換え規則の獲得を容易に実現することができる．この意味で本稿はこの今後発展の予想される言い換えの研究の基盤的なものとなると思われる．\ref{sec:merge}節ではデータのマージ，最適照合の例を示した．diffコマンドは一般には差分の検出に利用されるものなので，データのマージや最適照合にも利用できることを示した\ref{sec:merge}節の例はまた別の新しさがある．その節では対訳コーパスの対応づけ，講演と予稿の対応づけ，さらに最近はやりの質問応答システム(「日本の首都はどこですか」と聞くと「東京」と答えるシステムのこと)といった，種々の興味深い研究をdiffという簡便なツールで実現する方法を示した．本稿はこのような研究テーマもしくは研究手段の斬新性といった側面も兼ね備えている．本稿ではこのようにdiffを用いた言語処理の例を多数記述した．diffに関係することでここまでいろいろな例をまとめたものはおそらくないだろう．他にも面白い利用方法があると思う．本稿であげた多数の例を参考にし，より面白い利用方法を考えて使うのもよいし，本稿であげた例と同じような使い方をしてもよい．diffを使って効率よく様々な研究がなされていくことを期待したい．\appendix
\section{mdiffの構成方法および使い方}
label{sec:exp_mdiff}本付録では読者の便を考えmdiffの構成方法と使い方を記す．また，現在はこのプログラムは筆者のホームページ(http://www.crl.go.jp/jt/a132/members/murata/software/software.html)からダウンロードできる．\subsection{mdiffの構成方法}\label{sec:make_mdiff}筆者はmdiffはcshとperlを使って構成している\footnote{SunOSとSunSolarisのOSとLinuxの一部のOSで筆者はこのプログラムが実際に動くことを確認している．他のOSではプログラムを少々変更する必要があるかもしれない．}．\begin{verbatim}------------------------------------------------------------ファイルmdiff------------------------------------------------------------#!/bin/csh-f/usr/bin/diff-D@@@mm$*|~username/bin/Perl/tmpdiff_patch.pl#------------------------------------------------------------\end{verbatim}\begin{verbatim}------------------------------------------------------------ファイル~username/bin/Perl/tmpdiff_patch.pl------------------------------------------------------------#!/usr/local/bin/perl$|=1;while(<>){if(/^\#ifn?def(\/\*)?\@\@\@mm(\*\/)?/){$con=$_;while(<>){$con.=$_;if(/^\#endif(\/\*)?\@\@\@mm(\*\/)?/){#print";▼▼▼▼▼▼\n";print";▲▲▲▲▲▲\n";if($con=~/^\#ifndef/){if($con=~/^\#ifndef(\/\*)?\@\@\@mm(\*\/)?\n((\\.|\n)*)\#else(\/\*)?\@\@\@mm(\*\/)?/||$con=~/^\#ifndef(\/\*)?\@\\\@\@mm(\*\/)?\n((.|\n)*)\#endif(\/\*)?\@\@\@mm(\*\/)?/){print$3;}print";●●●\n";if($con=~/\#else(\/\*)?\@\@\@mm(\*\/)?\n((.|\\\n)*)\#endif(\/\*)?\@\@\@mm(\*\/)?/){print$3;}}elsif($con=~/^\#ifdef/){if($con=~/\#else(\/\*)?\@\@\@mm(\*\/)?\n((.|\\\n)*)\#endif(\/\*)?\@\@\@mm(\*\/)?/){print$3;}print";●●●\n";if($con=~/^\#ifdef(\/\*)?\@\@\@mm(\*\/)?\n((.\\|\n)*)\#else(\/\*)?\@\@\@mm(\*\/)?/||$con=~/^\#ifdef(\/\*)?\@\@\\\@mm(\*\/)?\n((.|\n)*)\#endif(\/\*)?\@\@\@mm(\*\/)?/){print$3;}}print";▼▼▼▼▼▼\n";#print";▲▲▲▲▲▲\n";last;}}}else{print;}}exit;------------------------------------------------------------\end{verbatim}cshのプログラムの中からdiffとperlで書いた整形プログラム\\\verb+~username/bin/Perl/tmpdiff_patch.pl+を呼ぶことでdiffによる処理，さらに整形を実現している．またページの都合上，長い行の部分は``\verb+\\+''で分割している．実際のプログラミングは``\verb+\\+''を消してさらに改行せずに記述して欲しい．また，このプログラムでは本稿の表示と少し違う表示をする．本稿では\begin{verbatim};▼▼▼▼▼▼(一つめのファイルにだけある部分);●●●(二つめのファイルにだけある部分);▲▲▲▲▲▲\end{verbatim}と表示しているところ，このプログラムでは\begin{verbatim};▲▲▲▲▲▲(一つめのファイルにだけある部分);●●●(二つめのファイルにだけある部分);▼▼▼▼▼▼\end{verbatim}と表示する．つまり差分の始まりと終りを示す記号が逆転する．これは，理論の説明としては差分部分を挟んでいることを示す上の表示がよいが，みやすさとしては下の表示の方が見やすいからそうしているのである．下の表示だと差分部分とそれ以外との境目で，三角形の底辺が差分部分側に並び差分部分が見やすいのである．上の表示の方がみやすいという人はプログラムのその部分だけ書き直せばよい．ちょうど以下のように\begin{verbatim}#print";▼▼▼▼▼▼\n";#print";▲▲▲▲▲▲\n";\end{verbatim}コメントアウトして行があるのでそのコメントを削り，もとのをコメントアウトするとすぐに表示方法をかえることができる．プログラム中，\verb+~username+としている部分があるが，そのusernameの部分はそのUNIXシステムにloginしているユーザの名前にしてほしい(例:``\verb+~murata+'')．また，二つのプログラムの実行許可は与えておき，\verb+mdiff+は環境変数PATHのとおっているところに，\verb+~username/bin/Perl/tmpdiff_patch.pl+は，\verb+~username/bin/Perl+のディレクトリに置くこと．また，mdiffのプログラム中の``/bin/csh''と``/usr/bin/diff''の部分と，\verb+tmpdiff_patch.pl+のプログラム中の``/usr/local/bin/perl''の部分は各マシンごとに，それらのコマンドがあるディレクトリに書き直すこと．\subsection{mdiffの使い方}\label{sec:use_mdiff}上のように二つのプログラムを記述しそれぞれのファイルを所定の場所におくとあとは以下のように打ち込んでmdiffを使うだけである．\begin{verbatim}mdiff<ファイル1><ファイル2>\end{verbatim}\verb+<ファイル1>+,\verb+<ファイル2>+は比較する二つのファイルである．例えば，二つのファイルが\begin{verbatim}------------------------------------------------------------<ファイル1>------------------------------------------------------------今日学校へいく------------------------------------------------------------<ファイル2>------------------------------------------------------------今日大学へいく------------------------------------------------------------\end{verbatim}であったとする．それで，mdiffを動かすと以下の出力を得る．\begin{verbatim}今日;▲▲▲▲▲▲学校へ;●●●大学へ;▼▼▼▼▼▼いく\end{verbatim}「学校へ」と「大学へ」の部分が差分として正しく抽出できる．あとはうまく行単位にデータを格納したファイルを二つ作り，これらを上記のようにmdiffにかければよい．そうすると様々な結果がmdiffにより出力される．\acknowledgment本稿の\ref{sec:sp_merge}節の話し言葉データと書き言葉データの対応づけの実験では独立行政法人通信総合研究所内元清貴研究員に実験データなどを提供してもらった．また，本稿には筆者が学生であったころの研究室の同僚のコメントが役に立っている．ここに感謝する．\begin{thebibliography}{}\bibitem[\protect\BCAY{新谷}{新谷}{1995}]{araya_juman}新谷研\BBOP1995\BBCP.\newblock\JBOQ日本語形態素解析システムＪＵＭＡＮの精度向上\JBCQ\\newblock\Jem{京都大学工学部学士論文}.\bibitem[\protect\BCAY{藤井,伊藤,秋葉,石川}{藤井\Jetal}{2001}]{fujii_kaiho_2001}藤井敦,伊藤克亘,秋葉友良,石川徹也\BBOP2001\BBCP.\newblock\JBOQ音声言語データの構造化に基づく講演発表の自動要約\JBCQ\\newblock\Jem{ワークショップ「話し言葉の科学と工学」}.\bibitem[\protect\BCAY{春野}{春野}{1997}]{haruno_ipsj97}春野雅彦\BBOP1997\BBCP.\newblock\JBOQ辞書と統計を用いた対訳アライメント\JBCQ\\newblock\Jem{情報処理学会論文誌},{\Bbf38}(4).\bibitem[\protect\BCAY{石間,藤井,石川}{石間\Jetal}{1998}]{fujii1998}石間衛,藤井敦,石川徹也\BBOP1998\BBCP.\newblock\JBOQ日本語形態素・構文解析システム{JEMONI}の開発と評価について\JBCQ\\newblock\Jem{情報処理学会自然言語処理研究会98-NL-127}.\bibitem[\protect\BCAY{加藤,浦谷}{加藤,浦谷}{1999}]{Kato1999}加藤直人,浦谷則好\BBOP1999\BBCP.\newblock\JBOQ局所的要約知識の自動獲得手法\JBCQ\\newblock\Jem{言語処理学会誌},{\Bbf6}(7).\bibitem[\protect\BCAY{松本,黒橋,宇津呂,妙木,長尾}{松本\Jetal}{1992}]{juman}松本裕治,黒橋禎夫,宇津呂武仁,妙木裕,長尾真\BBOP1992\BBCP.\newblock\JBOQ日本語形態素解析システム{JUMAN}使用説明書version1.0\JBCQ\\newblock京都大学工学部長尾研究室.\bibitem[\protect\BCAY{望主,荻野,太田,井佐原}{望主\Jetal}{2000}]{mochinushi2000}望主雅子,荻野紫穂,太田公子,井佐原均\BBOP2000\BBCP.\newblock\JBOQ重要文と要約の差異に基づく要約手法の調査\JBCQ\\newblock\Jem{情報処理学会自然言語処理研究会2000-NL-135}.\bibitem[\protect\BCAY{村田}{村田}{1995}]{murata_shuuron}村田真樹\BBOP1995\BBCP.\newblock\JBOQ日本語文章における名詞の指示対象の推定\JBCQ\\newblock\Jem{京都大学工学部修士論文}.\bibitem[\protect\BCAY{村田,長尾}{村田,長尾}{1996}]{murata_noun_nlp}村田真樹,長尾真\BBOP1996\BBCP.\newblock\JBOQ名詞の指示性を利用した日本語文章における名詞の指示対象の推定\JBCQ\\newblock\Jem{言語処理学会誌},{\Bbf3}(1).\bibitem[\protect\BCAY{村田,長尾}{村田,長尾}{1997}]{murata_deno_nlp}村田真樹,長尾真\BBOP1997\BBCP.\newblock\JBOQ用例や表層表現を用いた日本語文章中の指示詞・代名詞・ゼロ代名詞の指示対象の推定\JBCQ\\newblock\Jem{言語処理学会誌},{\Bbf4}(1).\bibitem[\protect\BCAY{村田,馬,内元,小作,内山,井佐原}{村田\Jetal}{2000a}]{murata_irex_ir_nlp}村田真樹,馬青,内元清貴,小作浩美,内山将夫,井佐原均\BBOP2000a\BBCP.\newblock\JBOQ位置情報と分野情報を用いた情報検索\JBCQ\\newblock\Jem{言語処理学会誌},{\Bbf7}(2).\bibitem[\protect\BCAY{村田,神崎,内元,馬,井佐原}{村田\Jetal}{2000b}]{murata_msort_nlp}村田真樹,神崎享子,内元清貴,馬青,井佐原均\BBOP2000b\BBCP.\newblock\JBOQ意味ソートmsort---意味的並べかえ手法による辞書の構築例とタグつきコーパスの作成例と情報提示システム例---\JBCQ\\newblock\Jem{言語処理学会誌},{\Bbf7}(1),51--66.\bibitem[\protect\BCAY{村田,内山,内元,馬,井佐原}{村田\Jetal}{2000c}]{murata2000_3_nl}村田真樹,内山将夫,内元清貴,馬青,井佐原均\BBOP2000c\BBCP.\newblock\JBOQ決定リスト，用例ベース手法を用いたコーパス誤り検出・誤り訂正\JBCQ\\newblock\Jem{自然言語処理研究会2000-NL-136},49--56.\bibitem[\protect\BCAY{村田,内山,井佐原}{村田\Jetal}{2000d}]{murata_QA_nlp2000ws}村田真樹,内山将夫,井佐原均\BBOP2000d\BBCP.\newblock\JBOQ質問応答システムを用いた情報抽出\JBCQ\\newblock\Jem{言語処理学会第6回年次大会ワークショップ論文集},\BPGS\33--40.\bibitem[\protect\BCAY{村田,内山,井佐原}{村田\Jetal}{2000e}]{murata2000_1_nl}村田真樹,内山将夫,井佐原均\BBOP2000e\BBCP.\newblock\JBOQ類似度に基づく推論を用いた質問応答システム\JBCQ\\newblock\Jem{自然言語処理研究会2000-NL-135},181--188.\bibitem[\protect\BCAY{村田,馬,内元,井佐原}{村田\Jetal}{2001a}]{murata_nlc2001}村田真樹,馬青,内元清貴,井佐原均\BBOP2001a\BBCP.\newblock\JBOQサポートベクトルマシンを用いたテンス・アスペクト・モダリティの日英翻訳\JBCQ\\newblock\Jem{電子情報通信学会言語理解とコミュニケーション研究会NLC2000-78}.\bibitem[\protect\BCAY{村田,内山,内元,馬,井佐原}{村田\Jetal}{2001b}]{NLP2001}村田真樹,内山将夫,内元清貴,馬青,井佐原均\BBOP2001b\BBCP.\newblock\JBOQ機械学習を用いた機械翻訳用モダリティコーパスの修正\JBCQ\\newblock\Jem{言語処理学会第７回年次大会}.\bibitem[\protect\BCAY{村田,井佐原}{村田,井佐原}{2001c}]{murata_nlp2001ws_true}村田真樹,井佐原均\BBOP2001c\BBCP.\newblock\JBOQ言い換えの統一的モデル---尺度に基づく変形の利用---\JBCQ\\newblock\Jem{言語処理学会第7回年次大会ワークショップ論文集}.\bibitem[\protect\BCAY{村田,内山,内元,馬,井佐原}{村田\Jetal}{2001d}]{murata_nlc2001_wsd}村田真樹,内山将夫,内元清貴,馬青,井佐原均\BBOP2001d\BBCP.\newblock\JBOQ種々の機械学習手法を用いた多義解消実験\JBCQ\\newblock\Jem{電子情報通信学会言語理解とコミュニケーション研究会NLC2001-2}.\bibitem[\protect\BCAY{村田,井佐原}{村田,井佐原}{2001e}]{murata_nl2001_henkei}村田真樹,井佐原均\BBOP2001e\BBCP.\newblock\JBOQ同義テキストの照合に基づくパラフレーズに関する知識の自動獲得\JBCQ\\newblock\Jem{情報処理学会自然言語処理研究会2001-NL-142}.\bibitem[\protect\BCAY{村田,馬,内元,井佐原}{村田\Jetal}{2001f}]{modal2001}村田真樹,馬青,内元清貴,井佐原均\BBOP2001f\BBCP.\newblock\JBOQ用例ベースによるテンス・アスペクト・モダリティの日英翻訳\JBCQ\\newblock\Jem{人工知能学会誌},{\Bbf16}(1).\bibitem[\protect\BCAY{村田,井佐原}{村田,井佐原}{2001g}]{murata_kaiho_2001}村田真樹,井佐原均\BBOP2001g\BBCP.\newblock\JBOQ話し言葉と書き言葉のdiff\JBCQ\\newblock\Jem{ワークショップ「話し言葉の科学と工学」}.\bibitem[\protect\BCAY{Murata,Utiyama\BBA\Isahara}{Murataet~al.}{1999}]{qa_memo}Murata,M.,Utiyama,M.,\BBA\Isahara,H.\BBOP1999\BBCP.\newblock\newblock\BBOQQuestionAnsweringSystemUsingSyntacticInformation\BBCQ.\newblockhttp://xxx.lanl.gov/abs/cs.CL/9911006.\bibitem[\protect\BCAY{佐藤}{佐藤}{2001}]{iikae_jws}佐藤理史\BBOP2001\BBCP.\newblock\Jem{言語処理学会第7回年次大会ワークショップ論文集}.\bibitem[\protect\BCAY{島内,有澤,野下,浜田,伏見}{島内\Jetal}{1994}]{algo}島内剛一,有澤誠,野下浩平,浜田穂積,伏見正則\BBOP1994\BBCP.\newblock\Jem{アルゴリズム辞典}.\newblock共立出版株式会社.\bibitem[\protect\BCAY{内元,野畑,太田,村田,馬,井佐原}{内元\Jetal}{2001}]{uchimoto2001}内元清貴,野畑周,太田公子,村田真樹,馬青,井佐原均\BBOP2001\BBCP.\newblock\JBOQ予稿とその講演書き起こしの対応付けおよび書き起こしのテキストのテキスト分割\JBCQ\\newblock\Jem{言語処理学会年次大会},317--321.\end{thebibliography}\begin{biography}\biotitle{略歴}\bioauthor{村田真樹}{1993年京都大学工学部卒業．1995年同大学院修士課程修了．1997年同大学院博士課程修了，博士（工学）．同年，京都大学にて日本学術振興会リサーチ・アソシエイト．1998年郵政省通信総合研究所入所．研究官．自然言語処理，機械翻訳，情報検索の研究に従事．言語処理学会，情報処理学会，人工知能学会，ACL，各会員．}\bioreceived{受付}\bioaccepted{採録}\end{biography}\end{document}