朝尾幸次郎
二言語のデータを用意しておき、一方から文字列を検索し、ヒットしたレコードとともに、対応するファイルのレコードを表示します。コマンドラインから操作するため、動作が軽快で、フィルタ、リダイレクションにより自由に出力の加工ができます。簡単なスクリプトですが、検索には正規表現が使えるので複雑な検索も可能です。■ 配布条件
GNU 一般公衆利用許諾契約書(GNU General Public License)にしたがって公開します。つまり、自由にお使いいただけ、改変は自由です。ただし、改変して公開する場合にはGNU 一般公衆利用許諾契約書にしたがわなければなりません。■ スクリプトの仕様
Perlによるスクリプトです。■ データの仕様
二言語のテキストをレコードごとに対応するようテキストファイルで用意しておきます。たとえば、サンプルデータの「日本国憲法」では次のように対応させています。この対応は自由に決めることができます。なお、このスクリプトは日本語と英語のパラレル・コーパスを念頭に作ったものですが、たとえば、英語と日本語の単語などのように、対応するものであれば、どのようなものでもデータとして利用できます。言語も英語、日本語に限りません。■ ダウンロード
日本語 英語 これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。 This is a universal principle of mankind upon which this Constitution is founded. われらは、これに反する一切の憲法、法令及び詔勅を排除する。 We reject and revoke all constitutions, laws, ordinances, and rescripts in conflict herewith.
不用意にPerlスクリプトを動かしてしまうことがないよう、pconc.pl.txt という名前で置いてあります。ファイルを保存した後、pconc.pl(あるいは別のファイル名)に変更してお使いください。「日本国憲法(日本語版)」以下はサンプルデータです。意味がまとまる最小の単位で対応させてあります。ファイルの文字コードはEUCです。■ 使用方法
スクリプト pconc.pl.txt 日本国憲法(日本語版) jconst_j.txt 日本国憲法(英語版) jconst_e.txt 教育基本法(日本語版) fle_j.txt 教育基本法(英語版) fle_e.txt モルグ街の殺人事件(英語) morgue_e.txt モルグ街の殺人事件(日本語訳) morgue_j.txt
Perlのパスは/usr/bin/perlに設定してあります。お使いのシステムにあわせてスクリプトの第1行目を変更してください。■ 正規表現による検索
次のように引数をつけて使います。
$ ./pconc.pl [-i] 検索文字列 ファイル1 ファイル2
オプションに -i を指定すると、大文字、小文字を区別せずに検索します。「ファイル1」は検索ファイル、「ファイル2」は対応するファイルです。たとえば、日本国憲法で「但し」という表現が英語版にどのように現れるかを調べるには次のように指定します。
$ ./pconc.pl 但し jconst_j.txt jconst_e.txt
逆に、英語版の日本国憲法でhoweverという語で表される部分が日本語原文にどのように現れるかを調べるには次のように指定します。
$ ./pconc.pl however jconst_e.txt jconst_j.txt
英語版の日本国憲法でhoweverという語を大文字、小文字に関係なく検索するには、次のようにオプション -i をつけて指定します。
$ ./pconc.pl -i however jconst_e.txt jconst_j.txt
上で検索した結果をファイル output.txt に出力するには次ようにリダイレクションにより指定します。
$ ./pconc.pl -i however jconst_e.txt jconst_j.txt > output.txt
検索文字列は正規表現が可能です。正規表現を使う場合は検索文字列を' '(シングルクオート)で囲みます。たとえば、「モルグ街の殺人事件」の英語原文から give, gives, gave, given, giving が現れる個所と日本語訳で対応する個所を調べたい場合には次のように指定します。(ただし、gives は give を検索すれば検索できるので次の例では検索文字列に指定していません。)■ 制限
$ ./pconc.pl 'give|gave|given|giving' morgue_e.txt morgue_j.txt
このスクリプトでは検索文字列が行の中に複数現れた場合、複数回表示しません。行の中にヒットした文字列があると、その行を表示し、次の行を検索します。つまり、検索結果からヒットした行数を数えた場合、必ずしもそれが検索文字列の数にはなりません。ただし、検索結果にはヒットすべき文字列はすべて含まれていますので、ヒットする文字列の数を調べたい場合には、検索結果から対象となる文字列を数えることで解決することができます。■ スクリプトの改変
検索結果には行番号をつけて出力しています。行番号を表示したくない場合には、56, 57, 69, 70行から"$lineno",": ",を削除します。