クエリでは、文書に含まれている必要がある単語や単語の組み合わせを指定します。抽出スクリプトで使用されるクエリ言語は XML ベースです。
<Form><Text>first</Text></Form>
<Form><Text>second</Text></Form>
<Form><Text>third</Text></Form>
<Form><Text>fourth</Text></Form>
- <Request> — クエリのルート要素です。
- <Query> — 基本クエリを表します。基本クエリには、検索対象の単語の組み合わせが満たす必要のある条件を指定するクエリツリーが含まれます。基本クエリは、上位レベルのクエリで単語形の組み合わせの一部として使用されることがあります。これは必須要素です。
- <Contain> — 文書に含まれている必要がある単語や単語の組み合わせを指定します。1 つのクエリに含められる <Contain> 要素は 1 つだけです。これは必須要素です。この要素には、次の要素を任意の順序でいくつでも含めることができます。
- <Required> — 単語の組み合わせに含まれている必要がある単語形またはサブクエリを指定します。これはオプション要素です。
- <Optional> — 単語の組み合わせに含まれていてもよい単語形またはサブクエリを指定します。これはオプション要素です。
- <Except> — 単語の組み合わせに含まれていてはならない単語形またはサブクエリを指定します。これはオプション要素です。
上記の各要素には、次のいずれかの要素を含める必要があります。
- <Query> — 単語形の並びを単語の組み合わせに含めるか、単語の組み合わせから除外するかを指定します。
- <Form> — 単語形を単語の組み合わせに含めるか、単語の組み合わせから除外するかを指定します。
<Contain> 要素には、少なくとも 1 つの <Required> 要素または <Optional> 要素が含まれている必要があります。
単語形の組み合わせに対する追加の制約は、<Contain> タグの属性で指定できます。
単語形の組み合わせに含める最小項目数は、MinCount 属性で指定できます。各項目には、単語形、またはサブクエリによって返される単語形の文字列を指定します。この属性の既定値は 1 です。このパラメーターの値は、指定した単語形の組み合わせに含まれる <Required> 要素と <Optional> 要素の合計数を超えることはできません。
このパラメーターは、単語形の組み合わせに 1 つ以上の <Optional> 要素が含まれている場合に役立ちます。
まず、最初のパラメーターまたは 2 番目のパラメーターのいずれかを検索するクエリの例を示します
<Form><Text>first</Text></Form>
<Form><Text>second</Text></Form>
次のクエリは、クエリで指定した 4 つの単語のうち少なくとも 3 つを見つけるようプログラムに指示します。このうち 2 つの単語は必須です。
<Form><Text>US</Text></Form>
<Form><Text>President</Text></Form>
<Form><Text>Barack</Text></Form>
<Form><Text>Obama</Text></Form>
上記のクエリでは、次の語句が見つかります: “US President Barack Obama”、“President Barack Obama”、および “US President Obama”。
単語形の組み合わせで項目の順序を固定するには、Boolean 型の KeepOrder 属性を使用します。この属性のデフォルト値は false です。
項目の順序を固定することを指定したクエリの例を次に示します。
<Contain KeepOrder="true">
<Form><Text>first</Text></Form>
<Form><Text>second</Text></Form>
<Form><Text>third</Text></Form>
“first third second third” という組み合わせは、必要な順序で並んだ単語列を含んでいても、このクエリには一致しません。
KeepOrder は <Except> 要素にも適用されます。クエリ内の <Except> 要素に対応する単語は、その要素がクエリ内で区切る単語の間に現れてはなりません。ただし、固定順序のクエリ文字列以外の位置であれば、どこに現れてもかまいません。
たとえば、上記のクエリで単語形 “second” を <Required> ではなく <Except> 要素に入れるように変更した場合、単語形の組み合わせ “first third second” を含む文書はクエリに一致します (ただし、単語形 “second” は結果に含まれません) 。さらに、上記のクエリから KeepOrder 属性を削除すると、単語形の組み合わせ “first third second” を含む文書は結果に含まれなくなります。これは、単語形 “second” が文書のテキスト内のどこにも現れてはならないためです。
距離の指定に使用する MinDistance 属性と MaxDistance 属性
MinDistance 属性と MaxDistance 属性は、クエリ内の単語間の最小距離と最大距離を指定します。これらの属性には既定値がありません。いずれか一方の属性が指定されていない場合、距離の制限は適用されません。
単語間の距離は単語数で表され、対応する 2 つの単語の位置の差として計算されます。隣り合う 2 つの単語間の距離は 1 であるため、いずれの属性の最小値も 1 です。MaxDistance は MinDistance 以上でなければなりません。
2 つの単語列間の距離は、次のように計算されます。単語列が重なっていない場合、右側の単語列の最も左にある単語の位置と、左側の単語列の最も右にある単語の位置との差として計算されます。単語列が重なっている場合、距離は 0 と見なされます。
たとえば、句 “The quick brown fox jumped over the lazy dog,” では、“quick fox” と “lazy dog” の単語列間の距離は 4 であり、“quick fox” と “brown lazy dog” の単語列間の距離は 0 です。
<Except> 要素では、単語間の距離は次のように計算されます。
- KeepOrder=“true,” の場合、その単語は単語列内の隣接する単語 (つまり、クエリ内でその単語の前後にある単語) から指定された距離内に出現してはなりません。同時に、<Except> 要素の前後の単語間の距離は、指定された範囲内である必要があります。
- **KeepOrder=“**false,” の場合、その単語は単語列内の他のどの単語に対しても、指定された距離内に出現してはなりません。
<Contain KeepOrder="true" MaxDistance="2">
<Form><Text>sodium /Text></Form>
<Form><Text>tetraborate</Text></Form>
<Form><Text>carborate</Text></Form>
<Form><Text>sulfate</Text></Form>
<Form><Text>decahydrate</Text></Form>
このクエリでは、“sodium carborate decahydrate” や “sodium sulfate decahydrate” などの句が見つかります。
<Contain KeepOrder="false" MaxDistance="2">
<Form><Text>sodium /Text></Form>
<Form><Text>tetraborate</Text></Form>
<Form><Text>carborate</Text></Form>
<Form><Text>sulfate</Text></Form>
<Form><Text>decahydrate</Text></Form>
このクエリで見つかるのは “sodium sulfate decahydrate” だけです。これは、単語 “tetraborate” が <Except></Except> タグ内に配置されており、“tetraborate” と “sodium” の最大距離が 2 単語だからです。
1 つの単語形に対するクエリは、<Form> 要素を使用して指定します。この要素には、次の要素を含めることができます。
-
<Attributes> — 単語形の属性に対するクエリを含む省略可能な要素です。
-
<Text> — 単語形の Unicode テキストを含む省略可能な要素です。
テキストで単語が指定されていない場合は、属性クエリに一致する任意の単語がクエリに一致します。この場合、属性クエリは必須です。
-
単語形の追加の検索条件は、<Form> タグの属性で指定できます。
単語の単語形検索の種類は、<Form> タグの SearchType 属性で指定できます。この属性には次の値を指定できます。
- AllFormsSearch – プログラムは、指定した単語のすべての単語形を検索します。
- ExactSearch – プログラムは、指定した単語形のみを検索します。
- PrefixSearch – プログラムは、指定した文字列で始まる任意の単語形を検索します。
- FuzzySearch – プログラムは、指定した単語に対してあいまい検索を実行します。テキストにOCR誤認識が含まれている可能性があり、ExactSearch ではうまく検索できない場合に、FuzzySearch が役立つことがあります。FuzzySearch を使用できるのは、3 文字以上の単語だけです。3~5 文字の単語では、FuzzySearch で 1 件のOCR誤認識が許容されます。5 文字を超える単語では、FuzzySearch で最大 2 件のOCR誤認識が許容されます。
- FuzzyPrefixSearch – プログラムは、指定した文字列で始まる任意の単語に対してあいまい検索を実行します。
SearchType 属性は省略可能で、既定では AllFormsSearch に設定されています。
大文字と小文字を区別する検索のための CaseSensitive 属性
大文字と小文字を区別する検索では、<Form> タグの CaseSensitive 属性を使用できます。この属性は省略可能で、既定値は false です。
<Contain KeepOrder="true">
<Form SearchType="ExactSearch" CaseSensitive="true">
このクエリは、略語 WHO をこの表記どおりに正確に検索します。これにより、「who」「whom」「whose」を含む不要な結果が大量に返されるのを防げます。
単語形属性のクエリは、AND、OR、NOT 演算子で構成される論理式です。NOT は単項演算子であるのに対し、AND と OR は n 項演算子です。この論理式のオペランドは Bool 型の値です。この論理式は木構造で記述されます。クエリの結果は、この論理式を満たす文書テキスト内の単語形となります。
単語形属性を取得するには、<Attributes> 要素を使用します。この要素には、次の要素を含めることができます。
- <Attribute> — この要素には、必要な単語属性のテキストが含まれます。これは論理式ツリーの葉に当たります。
- <Or> — OR 演算子はツリー内のノードです。
- <And> — AND 演算子はツリー内のノードです。
- <Not> — NOT 演算子はツリー内のノードです。
<Not> 要素は <Attributes> 要素と同じ方法で構成され、上記の要素のうち 1 つだけを含めることができます。
<Or> 要素と <And> 要素には、上記の要素のうち少なくとも 2 つを含める必要があります。
<Attribute> タグには、省略可能な SearchType 属性があります。これは属性検索の種類を指定します。この属性には次の値を設定できます。
- ExactSearch — プログラムは、クエリで指定されたものとまったく同じ形式の属性を検索します。
- PrefixSearch — プログラムは、指定したテキストを接頭辞として持つ任意の属性を検索します。
属性検索では、常に大文字と小文字が区別されます。SearchType 属性の既定値は ExactSearch です。
すでに次のものを特定済みの文書があるとします。
- NER オブジェクト (ExtractNerObjects function を呼び出して)
- “dictionary” という名前の user dictionary からの単語形 (ExtractWordsFromUserDictionary function を呼び出して)
- パラメーターとして渡した regular expression を満たすすべてのオブジェクト (ExtractRegularExpression function を呼び出して)
また、これらのオブジェクトの結果コレクション名を “regExp” とします。
コレクション名は、インデックス化された文書に対して実行される XML クエリで使用できます。結果コレクション自体にも、その名前でアクセスできます。
このクエリは 2 語から成るフレーズを検索します。最初の単語は指定した regular expression に一致する必要があり、2 番目の単語は許可された organization 名である必要があります。
属性名の後ろの数字は、それぞれの属性でインデックス化された複数語の検出済みオブジェクト内で、必要な単語を区別するために使われます。たとえば、“date” という名前の regular expression は、“May 31, 2019” 形式の日付を見つける場合があります。この場合、date 1 は単語 “May” に対応し、date 2 は “31” に、date 3 は “2019” に対応します。
複数の単語形に対するクエリは、<FormSet> 要素を使って指定します。
この型のクエリは、単一の単語形に対する複数のクエリを OR で組み合わせたものです。これは、すべてのサブクエリが省略可能な単語形クエリである <Query> クエリと同等です。
ただし、<FormSet> クエリでは、すべての単語形に共通する属性クエリを指定できます。これにより、ExactSearch を使用してすべての単語形を検索する際、各単語形に属性クエリがあり、それらの属性クエリに共通部分がある場合、より効率的に検索できます。
<FormSet> 要素には、次の要素が含まれます。
- <Attributes> — 省略可能な要素で、単語形属性に対するクエリを含みます。このクエリは、単語形属性クエリと AND で結合されます。
- <Form> — 単語形に対するクエリを含む必須要素です。<FormSet> 要素には、少なくとも 1 つの <Form> 要素が含まれている必要があります。
住所抽出クエリの XML サンプル
住所抽出クエリの結果は、国名の先頭の単語、住所の先頭の単語、市区町村名の先頭の単語、州名の先頭の単語、ZIP コードの先頭の単語を含む文字列になります (この順で、かつ各単語の間隔が 5 語以内である場合) 。
構成要素 (たとえば通り名) を構成する連続した単語の文字列には、さらにインデックス内で 1 から始まる番号が付けられます。
var xmlQuery = "<Request> \
<Query> \
<Contain MaxDistance=\"5\" KeepOrder=\"true\"> \
<Optional> \
<Form><Attributes><Attribute>NerCountry1</Attribute></Attributes></Form> \
</Optional> \
<Optional> \
<Form><Attributes><Attribute>NerStreet1</Attribute></Attributes></Form> \
</Optional> \
<Optional> \
<Form><Attributes><Attribute>NerCity1</Attribute></Attributes></Form> \
</Optional> \
<Optional> \
<Form><Attributes><Attribute>NerState1</Attribute></Attributes></Form> \
</Optional> \
<Required> \
<Form><Attributes><Attribute>NerZipCode1</Attribute></Attributes></Form> \
</Required> \
</Contain> \
</Query> \
</Request>";
住所抽出クエリの結果は、繰り返しフィールドである xmlQueryResult field に記録されます。
this.RunQueryAndSaveToField( xmlQuery, “query”, “xmlQueryResult” );