前のページ|次のページ

COMPGED関数

2つの文字列間の一般化編集距離を返します。

カテゴリ: 文字
制限事項: この関数は、I18Nレベル0準拠しており、SBCSデータ向けに設計されています。この関数をDBCSまたはMBCSデータの処理に使用しないでください。

構文

COMPGED(string-1, string-2 <, cutoff> <, modifier(s)>)

必須引数

string–1

文字定数、変数または式を指定します。

string-2

文字定数、変数または式を指定します。

オプション引数

cutoff

数値定数、変数または式です。実際の一般化編集距離がcutoffの値よりも大きい場合、cutoffと等しい値が返されます。

ヒント
cutoffに小さい値を使用すると、string–1およびstring–2の値が長い場合にCOMPGEDの効率が向上します。

modifier

COMPGED関数のアクションを変更できる文字列を指定します。次の1つ以上の文字を有効な修飾子として使用できます。

iまたはI string–1およびstring–2の大文字と小文字を区別しません。
lまたはL 値を比較する前にstring–1およびstring–2の先頭の空白を削除します。
nまたはN n-literalであるすべての引数から引用符を削除し、string–1およびstring–2の大文字と小文字の区別をしません。
:(コロン) string–1string–2の短い方の文字列の長さまたは1文字(どちらか大きい方)になるように長い方の文字列を切り捨てます。
ヒント
COMPGEDは修飾子に使用される空白を無視します。

詳細

修飾子の出現順序

COMPGED関数では、修飾子の出現順序に意味があります。
  • "LN"は各文字列から先頭の空白を削除した後、n-literalから引用符を削除します。
  • "NL"はn-literalから引用符を削除した後、各文字列から先頭の空白を削除します。

一般化編集距離の定義

一般化編集距離はLevenshteinの編集距離を一般化し、2つの文字列間の相違を測定したものです。Levenshteinの編集距離は、string-1string-2に変換するために必要な単独文字の削除、挿入または置換の回数です。

一般化編集距離の計算

COMPGED関数はstring-1およびstring-2の間の一般化編集距離を返します。一般化編集距離は、string-2からstring-1を作るためのコストが最小限の一連の演算です。
コストの和を計算するアルゴリズムは、string-2(入力文字列)内の文字を指すポインタを使用します。ポインタを進める、1文字以上の文字を出力文字列に追加する、またはその両方を行う一連の演算によって出力文字列を作ります。開始時は、ポインタは入力文字列の最初の文字を指しており、出力文字列は空です。
演算とそれぞれのコストを次の表に示します。
演算
デフォルトコスト単位
演算の内容
APPEND
50
出力文字列が入力文字列より長いとき、ポインタを移動せずに1文字を出力文字列の末尾に追加します。
BLANK
10
次の操作のいずれかを行います。
  • ポインタを移動せずに出力文字列の末尾に空白文字を1つ追加します。
  • ポインタ位置の文字がスペース文字のとき、出力文字列を変更せずにポインタの位置を1つ進めます。
  • ポインタ位置の文字がスペース文字のとき、出力文字列の末尾にスペース文字を1文字追加し、ポインタの位置を1つ進めます。
COMPCOST関数でBLANKのコストがゼロに設定されている場合、COMPGED関数は比較を行う前に、両方の文字列からすべてのスペース文字を削除します。
DELETE
100
出力文字列を変更せずにポインタの位置を1つ進めます。
DOUBLE
20
ポインタを移動せずに出力文字列の末尾に文字を追加します。
FDELETE
200
出力文字列が空のとき、出力文字を変更せずにポインタの位置を1つ進めます。
FINSERT
200
ポインタが第1位置にあるとき、ポインタを移動せずに1文字を出力文字列の末尾に追加します。
FREPLACE
200
ポインタが第1位置にあり、出力文字列が空のとき、出力文字列の末尾に1文字を追加し、ポインタの位置を1つ進めます。
INSERT
100
ポインタを移動せずに出力文字列の末尾に1文字を追加します。
MATCH
0
入力文字列のポインタ位置の文字をコピーして出力文字列の末尾に追加し、ポインタの位置を1つ進めます。
PUNCTUATION
30
次の操作のいずれかを行います。
  • ポインタを移動せずに出力文字列の末尾に句読空白文字を1つ追加します。
  • ポインタ位置の文字が句読文字のとき、出力文字列を変更せずにポインタの位置を1つ進めます。
  • ポインタ位置の文字が句読文字のとき、出力文字列の末尾に句読文字を1文字追加し、ポインタの位置を1つ進めます。
COMPCOST関数でPUNCTUATIONのコストがゼロに設定されている場合、COMPGED関数は比較を行う前に、両方の文字列からすべての句読文字を削除します。
REPLACE
100
出力文字列の末尾に1文字を追加し、ポインタの位置を1つ進めます。
SINGLE
20
ポインタ位置の文字が入力文字列の続く文字と同じとき、出力文字列を変更せずにポインタの位置を1つ進めます。
SWAP
20
入力文字列からポインタに続く文字をコピーし、出力文字列に追加します。次に、入力文字列からポインタ位置の文字をコピーし、出力文字列に追加します。ポインタ位置を2つ進めます。
TRUNCATE
10
出力文字列が入力文字列より短いとき、出力文字を変更せずにポインタの位置を1つ進めます。
文字列演算のコストを設定するには、CALL COMPCOSTルーチンを使用するか、デフォルトコストを使用できます。デフォルトのコストを使用する場合、COMPGEDから返される値は、COMPLEVから返される値のおよそ100倍の大きさです。

エラー例

一般化編集距離を求める原理は、タイプミスによって起こる可能性があるエラーの数と種類に基づいています。COMPGEDはそれぞれのエラーにコストを割り当て、発生する可能性のあるコストの最小和を求めます。エラーの中には、他のエラーよりも重大であるものもあります。たとえば、文字列の先頭に余分な文字が入るのは、文字列の末尾の文字が除外されることよりも重大である可能性があります。もう1つの例は、string-2に含まれる語句を入力するときにタイプミスをして、string-2ではなくstring-1を生成してしまう場合があります。

一般化編集距離を対称にする

一般化編集距離は必ずしも対称ではありません。言い換えれば、COMPGED(string1, string2)で返される値は必ずしもCOMPGED(string2, string1)で返される値とは同じではありません。一般化編集距離を対称にするには、CALL COMPCOSTルーチンを使って、次のペアにおける演算に同等のコストを割り当てます。
  • INSERT, DELETE
  • FINSERT, FDELETE
  • APPEND, TRUNCATE
  • DOUBLE, SINGLE

比較

Levenshteinの編集距離は、COMPLEV関数を使用して計算できます。一般化編集距離は、CALL COMPCOSTルーチンおよびCOMPGED関数を使用して計算できます。一般化編集距離の計算は、Levenshteinの編集距離の計算よりもかなり長い時間がかかります。ただし、ファジーファイルマージやテキストマイニングなど、一般化編集距離ではLevenshteinの編集距離よりも、通常は有用な測定が可能です。

次の例では、デフォルトコストを使用して一般化編集距離を計算します。
data test;
   infile datalines missover;
   input String1 $char8. +1 String2 $char8. +1 Operation $40.;
   GED=compged(string1, string2);
   datalines;
baboon   baboon   match
baXboon  baboon   insert
baoon    baboon   delete
baXoon   baboon   replace
baboonX  baboon   append
baboo    baboon   truncate
babboon  baboon   double
babon    baboon   single
baobon   baboon   swap
bab oon  baboon   blank
bab,oon  baboon   punctuation
bXaoon   baboon   insert+delete
bXaYoon  baboon   insert+replace
bXoon    baboon   delete+replace
Xbaboon  baboon   finsert
aboon    baboon   trick question: swap+delete
Xaboon   baboon   freplace
axoon    baboon   fdelete+replace
axoo     baboon   fdelete+replace+truncate
axon     baboon   fdelete+replace+single
baby     baboon   replace+truncate*2
balloon  baboon   replace+insert
;

proc print data=test label;
   label GED='Generalized Edit Distance';
   var String1 String2 GED Operation;
run;
演算に基づく一般化編集距離
演算に基づく一般化編集距離

関連項目:

CALLルーチン:
前のページ|次のページ|ページの先頭へ