10 CTX_ENTITYパッケージ
CTX_ENTITY
PL/SQL パッケージを使用し、ワードおよび句を検索して個人や企業などのカテゴリに分類します。
CTX_ENTITY
には、次のストアド・プロシージャおよびファンクションが含まれています。
名前 | 説明 |
---|---|
単一の抽出ルールを抽出ポリシーに追加します。 |
|
抽出されない特定のエンティティ参照またはエンティティ・タイプをマークします。 |
|
追加された抽出ルールを抽出ポリシーにコンパイルします。 |
|
使用する抽出ポリシーを作成します。 |
|
抽出ポリシーを削除します。 |
|
入力ドキュメントで検出されたエンティティを示すXMLドキュメントを生成します。 |
|
エンティティ抽出ユーザー・ディクショナリをOracle Text表にインポートします。 |
|
抽出ポリシーから単一の抽出ルールを削除します。 |
|
抽出ポリシーからストップ・エンティティを削除します。 |
ノート:
CTX_ENTITY
パッケージのAPIは、スキーマまたは所有者名を接頭辞として使用する識別子をサポートしていません。
10.1 ADD_EXTRACT_RULE
ADD_EXTRACT_RULE
プロシージャは、単一の抽出ルールを抽出ポリシーに追加します。インボーカは、ルールを独自の抽出ポリシーに追加します。抽出ルールは、文全体のスコープを含みます。抽出ルールでは、ルール式のエンティティ・タイプおよびルール演算子を除いて大/小文字を区別する必要があります。ルール追加の順序は重要ではありません。ルールの追加は、CTX_ENTITY.COMPILE
が実行されるまで有効ではありません。このプロシージャは、コミットを発行します。
構文
CTX_ENTITY.ADD_EXTRACT_RULE( policy_name IN VARCHAR2, rule_id IN INTEGER, extraction_rule IN VARCHAR2);
- policy_name
-
ポリシーの名前を指定します。
- rule_id
-
抽出ポリシー内の一意のルールIDを指定します。ルールIDは0(ゼロ)より大きくする必要があります。
- extraction_rule
-
XML形式のルール・テキストは、言語、式、および抽出するエンティティを指定します。ルール・テキストは、次のXMLスキーマに準拠します。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="rule"> <xsd:sequence> <xsd:element name="expression" type="xsd:string"/> <xsd:complexType> </xsd:complexType> <xsd:element name="comments type="xsd:string" default="\0"/> </xsd:sequence> </xsd:attribute name="language" type="xsd:string" default="ALL"/> </xsd:element> </xsd:schema>
詳細は次のとおりです。
-
ルール・タグの言語属性は、ルールに適用される言語を指定します。ルールは、指定された言語のドキュメントにのみ適用されます。言語属性は、省略することも、ルールがすべてのドキュメントに一致する場合には「ALL」に設定することもできます。
-
式タグには、マッチングで使用されるposix正規表現が含まれます。
-
コメント・タグを使用すると、ユーザーはコメントをこのユーザー・ルールと関連付けることができます。
-
タイプ・タグは、抽出されたエンティティ・テキストを所定のエンティティ・タイプに割り当てます。エンティティ・タイプは、表10 -1にリストされているOracle提供のルール・タイプのいずれかにすることも、ユーザー定義タイプにすることもできます。
ノート:
Oracle Databaseリリース20c以降、抽出ルールのXML形式には次の変更があります。-
タイプ・タグの
refid
属性はサポートされていません。 -
ユーザー定義のタイプには、先頭に文字「x」を付ける必要はありません。
-
'\c(<type>)'
は、ユーザー定義のタイプおよびオラクル社提供のタイプをルールで使用する場合に使用する必要があります。
表10-1 提供されるエンティティ・タイプ
提供されるエンティティ・タイプ タイプ 説明 例 building
Oracle提供ディクショナリ
建物の名前
ホワイトハウス
city
Oracle提供ディクショナリ
市区町村の名前
ニューヨーク
company
Oracle提供ディクショナリ
会社名
オラクル社
country
Oracle提供ディクショナリ
国名
米国
currency
Oracleが提供するルール
通貨
ドル
date
Oracleが提供するルール
日付
7月4日
day
Oracle提供ディクショナリ
曜日
月曜日、火曜日
email_address
Oracleが提供するルール
電子メール・アドレス
person@example.com
geo_political
Oracle提供ディクショナリ
政治組織または戦略組織
国際連合
holiday
Oracle提供ディクショナリ
国別の休日の名前
労働者の日
location_other
Oracle提供ディクショナリ
他のタイプの場所
大西洋
month
Oracleが提供するルール
月
6月、7月
non_profit
Oracle提供ディクショナリ
非営利組織
赤十字社
organization_other
Oracle提供ディクショナリ
他のタイプの組織
最高裁判所
percent
Oracleが提供するルール
数字と%で表される
10%
person_jobtitle
Oracle提供ディクショナリ
肩書で参照される個人
社長、教授
person_name
Oracleが提供するルール
名前で参照される個人
John Doe
person_other
Oracle提供ディクショナリ
他のタイプの個人
他のタイプの個人(犯罪者など)
phone_number
Oracleが提供するルール
電話番号
(123)-456-7890
postal_address
Oracleが提供するルール
郵送先住所
Redwood Shores, CA
product
Oracle提供ディクショナリ
製品名
Oracle Text
region
Oracle提供ディクショナリ
地域名
北アメリカ
ssn
Oracleが提供するルール
社会保障番号
123-45-6789
state
Oracle提供ディクショナリ
州や県
カリフォルニア
time_duration
Oracleが提供するルール
時間の長さ
10秒
tod
Oracleが提供するルール
時刻
午前8時
url
Oracleが提供するルール
Webアドレス
www.example.com
zip_code
Oracleが提供するルール
郵便番号
CA 94065
-
例10-1 ドキュメントの電子メール・アドレスを検索する抽出ルールの定義
次の例は、抽出ルールの定義方法およびエンティティ抽出ポリシーへの関連付け方法を示しています。次に、ドキュメントの電子メール・アドレスを検索する簡単な抽出ルールを定義します。
begin
ctx_entity.add_extract_rule('pol1', 1,
'<rule>
<expression>email is (\w+@\w+\.\w+)</expression>
<type>email_address</type>
</rule>');
end;
/
詳細は次のとおりです。
-
「My email address is jdoe@company.com」という文の場合、この抽出ルールは
email_address
エンティティ・タイプとして「jdoe@company.com」を抽出します。 -
ルールが
pol1
という抽出ポリシーに追加されます。 -
ルールIDに1が使用されて、ルールが追加されます。
-
このルールのXMLの説明は、次のとおりです。
-
ルール・タグの言語属性は空のままです。このため、ルールがすべての言語に適用されます。
-
式タグは、抽出で使用する正規表現を含みます。
-
例10-2 ドキュメントの電話番号を検索する抽出ルールの定義
次に、ドキュメントの電話番号を検索する簡単な抽出ルールを定義します。
begin
ctx_entity.add_extract_rule('pol1', 2,
'<rule language="english">
<expression>(\(d{3}\) \d{3}-\d{3}-\d{4})</expression>
<comments>Rule for phone numbers</comments>
<type>email_address</type>
</rule>');
end;
/
詳細は次のとおりです。
-
「I can be contacted at (123) 456-7890」という文の場合、この抽出ルールは
phone_number
エンティティ・タイプとして「(123) 456-7890」を抽出します。 -
ルールが
pol1
という抽出ポリシーに追加されます。 -
ルールIDに2が使用されて、ルールが追加されます。
-
ルールのXMLの説明は、次のとおりです。
-
ルール・タグの言語属性はenglishに設定されます。このため、ルールが英語のドキュメントにのみ適用されます。
-
式タグは、抽出で使用する正規表現を含みます。
-
説明のコメントがこのルールと関連付けられます。
-
例10-3 ユーザー定義のタイプを使用している抽出ルールの定義
次の例では、ユーザー定義のタイプを使用してドキュメントのエンティティを検索する抽出ルールを定義する方法を示します。
begin
ctx_entity.add_extract_rule('pol1', 1,
'<rule>
<expression>([a-z]+)</expression>
<type>my_type</type>
</rule>');
end;
/
begin
ctx_entity.add_extract_rule('pol1', 2,
'<rule>
<expression>(\d\c(my_type)?\s^\c(my_type))</expression>
<type>type_comp</type>
<comments>Rule with nested type</comments>
</rule>');
end;
/
10.2 ADD_STOP_ENTITY
このプロシージャを使用して、抽出されない特定のエンティティ参照またはエンティティ・タイプをマークします。インボーカは、独自の抽出ポリシーにストップ・エンティティを追加します。CTX_ENTITY.COMPILE
を実行するまで有効になりません。entity_name
とentity_type
のいずれか一方をNULL
にできますが、両方をそう設定することはできません。あるストップ・エンティティ別のストップ・エンティティのサブセットである場合、CTX_ENTITY.COMPILE
の後にサブセットとしてマークされ、抽出には使用されません。このプロシージャは、コミットを発行します。
構文
CTX_ENTITY.ADD_STOP_ENTITY( policy_name IN VARCHAR2, entity_name IN INTEGER, entity_type IN VARCHAR2 DEFAULT NULL, comments IN VARCHAR2 DEFAULT NULL);
- policy_name
-
追加されるストップ・エンティティのポリシー名を指定します。
- entity_name
-
ストップ・エンティティとしてリストするエンティティ名を指定します。
entity_type
がNULL
の場合、このentity_name
のすべての参照がストップ・エンティティとしてリストされます。大/小文字が区別されます。 - entity_type
-
entity_name
がNULL
の場合、エンティティ・タイプ全体をストップ・エンティティとしてリストするように指定されます。entity_name
がNULL
でない場合、<entity_type, entity_name>
のみがストップ・エンティティとして指定されます。大/小文字を区別しません。最大バイト長は、4000バイトです。 - comments
-
最大バイト長は、4000バイトです。
例
次の例は、すべての個人に対応するストップ・エンティティを追加します。コンパイル後、抽出でperson
エンティティ・タイプの参照はレポートされません。
exec ctx_entity.add_stop_entity('pol1', NULL, 'person');
次の例は、<'person', 'john doe'>
に対応するストップ・エンティティを追加します。コンパイル後、抽出で<'person', 'john doe'>
のペアはレポートされなくなります。このストップ・エンティティは、実際には最初に追加されたストップ・エンティティのサブセットです。CTX_USER_EXTRACT_STOP_ENTITIES
ビューでサブセットとマークされ、抽出では使用されません。
exec ctx_entity.add_stop_entity('pol1', 'john doe', 'person');
次の例は、ford
のすべての参照に対応するストップ・エンティティを追加します。コンパイル後、エンティティ・タイプの参照に関係なく、抽出でford
エンティティの参照がレポートされません。たとえば、ford
と個人が対応するルールの場合、抽出でこの一致はレポートされません。fordと企業が対応するルールの場合も、抽出でこの一致はレポートされません。
exec ctx_entity.add_stop_entity('pol1', 'ford', NULL);
10.3 COMPILE
このプロシージャは、追加された抽出ルールを抽出ポリシーにコンパイルします。これを使用して、追加されたストップ・エンティティを抽出ポリシーにコンパイルすることもできます。ポリシーにルールまたはストップ・エンティティを追加した場合は、このプロシージャを呼び出す必要があります。
インボーカは、ルールおよびストップ・エンティティを独自の抽出ポリシーにコンパイルします。ユーザーは、追加されたルールまたはストップ・エンティティおよび両方のコンパイルを選択できます。
コンパイル後、エンティティ抽出で使用されているルール、ストップ・エンティティおよびタイプがCTX_USER_EXTRACT_RULES
、CTX_USER_EXTRACT_STOP_ENTITIES
およびCTX_USER_EXTRACT_TYPE
の各ビューに表示されます。
構文
CTX_ENTITY.COMPILE( policy_name IN VARCHAR2, compile_choice IN NUMBER DEFAULT COMPILE_ALL, locking IN NUMBER DEFAULT LOCK_NOWAIT_ERROR, storing IN BOOLEAN DEFAULT TRUE);
- policy_name
-
コンパイルされるポリシー名を指定します。
- compile_choice
-
ストップ・エンティティとしてリストするエンティティ名を指定します。
entity_type
がNULL
の場合、このentity_name
のすべての参照がストップ・エンティティとしてリストされます。大/小文字が区別されます。オプションは、
COMPILE_ALL
、COMPILE_RULES
、およびCOMPILE_STOP_ENTITIES
です。COMPILE_ALL
は、ルールおよびストップ・エンティティをコンパイルします。COMPILE_RULES
は、ルールのみコンパイルします。COMPILE_STOP_ENTITIES
は、ストップ・エンティティのみコンパイルします。 - locking
-
最大バイト長は、4000バイトです。別の
COMPILE
が同じポリシーですでに実行されている場合のCOMPILE
の対応を構成します。lockingのオプションは、次のとおりです。
-
CTX_ENTITY.LOCK_WAIT
別のコンパイルが実行されている場合は、実行中のコンパイルが完了するまで待機してからコンパイルを開始します。(ロックを取得できない場合は無制限に待機し、maxtime設定は無視されます。)
-
CTX_ENTITY.LOCK_NOWAIT
別のコンパイルが実行されている場合は、エラーなしで即時に戻ります。
-
CTX_ENTITY.LOCK_NOWAIT_ERROR
別の同期化が実行されている場合は、「DRG-51313: DMLまたは最適化ロックを待機中にタイムアウトになりました」というエラーが発生します。
-
- storing
-
デフォルト値は
TRUE
です。エンティティ抽出で使用されるデータは、エンティティ抽出のパフォーマンスを向上させるために格納されます。エンティティ抽出で使用されたデータの格納を停止するには、FALSE
を指定します。
例
次の例は、デフォルト設定を使用してポリシーをコンパイルします。
exec ctx_entity.compile('pol1');
次の例は、ポリシーのストップ・エンティティのみコンパイルします。
exec ctx_entity.compile('pol1', CTX_ENTITY.COMPILE_STOP_ENTITIES);
次の例は、ルールおよびストップ・エンティティをコンパイルします。ロックが存在する場合、ファンクションが即時に戻されますが、エラーは発生しません。
exec ctx_entity.compile('pol1', CTX_ENTITY.COMPILE_ALL, CTX_ENTITY.LOCK_NOWAIT);
10.4 CREATE_EXTRACT_POLICY
CREATE_EXTRACT_POLICY
プロシージャは、使用する抽出ポリシーを作成します。ポリシーの所有者のみ、このポリシーを使用できます。
構文
CTX_ENTITY.CREATE_EXTRACT_POLICY( policy_name IN VARCHAR2, lexer IN VARCHAR2 DEFAULT NULL, include_supplied_rules IN BOOLEAN DEFAULT TRUE, include_supplied_dictionary IN BOOLEAN DEFAULT TRUE );
- policy_name
-
新しい抽出ポリシーの名前を指定します。
- lexer
-
レクサー・プリファレンスの名前を指定します。AUTO_LEXERのみがサポートされています。指定しない場合、
CTXSYS.DEFAULT_EXTRACT_LEXER
が使用されます。index_stems
およびderiv_stems
属性は使用できません。 - include_supplied_rules
-
Oracleから提供されるルールがエンティティ抽出に含まれるかどうかを指定します。falseの場合、自動的な頭字語解決がオフになります。デフォルトは
true
です。 - include_supplied_dictionary
-
Oracleから提供されるディクショナリがエンティティ抽出に含まれるかどうかを指定します。デフォルトは
true
です。
例
次の例は、デフォルト設定を使用した抽出ポリシーを作成します。デフォルトでは、ルールとディクショナリなどのOracleから提供される機能が使用可能です。
exec CTX_ENTITY.CREATE_EXTRACT_POLICY('pol1');
次の例は、明示的に特定のパラメータを指定する抽出ポリシーを作成します。使用するレクサーをmylex
として指定しており、それをAUTO_LEXERプリファレンスとして実行する必要があります。Oracleが提供するルールも含まれますが、Oracleが提供するディクショナリは無効化されます。
exec CTX_ENTITY.CREATE_EXTRACT_POLICY('pol2', 'mylex', TRUE, FALSE);
10.6 EXTRACT
EXTRACT
プロシージャは、指定されたドキュメントのエンティティ抽出を実行し、ドキュメントで検出されたエンティティを示すXMLドキュメントを生成します。XMLドキュメントは、エンティティのテキスト、タイプ、およびドキュメント内の場所を提供します。抽出には、指定された抽出ポリシーで定義された設定(ルール、ストップ・エンティティ、ディクショナリ)を使用します。
エンティティ・タイプ名の結果は大文字になります。インボーカは、独自の抽出ポリシーを使用して抽出を実行できます。
実行前に、CTX_ENTITY.COMPILE
を発行する必要があります。
構文
CTX_ENTITY.EXTRACT( policy_name IN VARCHAR2, document IN CLOB, language IN VARCHAR2, result IN OUT NOCOPY CLOB, entity_type_list IN CLOB DEFAULT NULL );
- policy_name
-
指定されたポリシーを使用して、抽出を実行します。
- document
-
抽出を実行する入力ドキュメント。
entity_type
がNULL
の場合、このentity_name
のすべての参照がストップ・エンティティとしてリストされます。大/小文字が区別されます。 - language
-
英語のみがサポートされています。
- result
-
ドキュメントから抽出されたエンティティのXMLを含む
CLOB
。entity_type
がNULL
の場合、このentity_name
のすべての参照がストップ・エンティティとしてリストされます。大/小文字が区別されます。 - entity_type_list
-
抽出にエンティティタイプのサブセットのみを考慮する場合に指定します。
entity_type_list
は、カンマで区切られたリストです。entity_type_list
が指定されない場合、エンティティ抽出にすべてのエンティティタイプが考慮されます。
例
次の例は、サンプルのドキュメントのエンティティ抽出の結果を示しています。pol1
という抽出ポリシーを作成した場合、入力ドキュメントは次のようになります。
Sam A. Schwartz retired as executive vice president of Hupplewhite INc. in New York.
次に、ctx_entity.extract
プロシージャをコールして、このドキュメントのエンティティを含むXMLドキュメントを生成します。今後の参照のために結果のCLOB
をentities
という表に挿入します。
declare myresults clob; begin select txt into mydoc from docs where id=1; ctx_entity.extract('p1', mydoc, null, myresults); insert into entities values(1, myresults); commit; end; /
これで、entities
表から抽出されたエンティティを調査できます。エンティティの分類に使用されるソースとともに、各エンティティに入力ドキュメントの場所がタグ付けされます。
<entities> <entity id="0" offset="75" length="8" source="SuppliedDictionary"> <text>New York</text> <type>city</type> </entity> <entity id="1" offset="55" length="16" source="SuppliedRule"> <text>Hupplewhite Inc.</text> <type>company</type> </entity> <entity id="2" offset="27" length="24" source="SuppliedDictionary"> <text>Sam A. Schwartz</text> <type>person_name</type> </entity> <entity id="4" offset="75" length="8" source="SuppliedDictionary"> <text>New York</text> <type>state</type> </entity> </entities>
10.7 IMPORT_DICTIONARY
CTX_ENTITY.IMPORT_DICTIONARY
プロシージャを使用して、エンティティ抽出ユーザー辞書をOracle Text表にインポートします。
インポート・ディクショナリは、関連付けられている型と代替形式を使用した、エンティティのエントリを含むXMLです。XML Schemaは、エンティティ抽出ユーザー・ディクショナリ・ローダー(ctxload
)で使用されるXML Schemaと同じです。ポリシーごとにロードできるユーザー・ディクショナリは1つのみです。
構文
CTX_ENTITY.IMPORT_DICTIONARY(
policy_name IN VARCHAR2,
data IN CLOB,
isdrop IN BOOLEAN DEFAULT FALSE);
- policy_name
-
ポリシーの名前を指定します。
- data
-
XMLディクショナリを指定します。
XML Schemaは次のとおりです。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="dictionary"> <xsd:complexType> <xsd:sequence> <xsd:element name="entities" type="entityType" maxOccurs="unbounded"/> </xsd:sequence> <xsd:complexType> </xsd:element> <xsd:complexType name="entityType"> <xsd:sequence> <xsd:element name="entity" type="entType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:attribute name="language" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="entType"> <xsd:sequence> <xsd:element name="value" type="xsd:string"/> <xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> <xsd:element name="alternate" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
- isdrop
-
現在のユーザー・ディクショナリを削除する必要があるかどうかを指定します。デフォルト値は
FALSE
です。
例10-4 Oracle Text表へのエンティティ抽出ユーザー・ディクショナリのインポート
この例では、CTX_ENTITY.IMPORT_DICTIONARY
プロシージャを使用してOracle Text表にエンティティ抽出ユーザー・ディクショナリをインポートする方法を示します。
デフォルト設定を使用して抽出ポリシーを作成します。デフォルトでは、ルールとディクショナリなどのOracleから提供される機能が使用可能です。
exec ctx_entity.create_extract_policy('mypol')
エンティティ抽出ユーザー・ディクショナリをインポートし、抽出ポリシーをコンパイルします。次に、入力ドキュメントでエンティティ抽出を実行します。現在のユーザー・ディクショナリを削除する必要があるかどうかを指定することもできます。
declare
datadic clob;
doc clob;
res clob;
begin
datadic := '<dictionary>
<entities language="english">
<entity>
<value>NewEntry</value>
<type>MyType</type>
</entity>
</entities>
</dictionary>';
ctx_entity.import_dictionary('mypol', datadic);
ctx_entity.compile('mypol');
doc := 'NEWENTRY';
ctx_entity.extract('mypol', doc, 'english', res);
dbms_output.put_line(res);
-- Dropping dictionary
ctx_entity.import_dictionary('mypol', null, isdrop=>true);
ctx_entity.compile('mypol');
ctx_entity.extract('mypol', doc, 'english', res);
dbms_output.put_line(res);
end;
/
10.8 REMOVE_EXTRACT_RULE
REMOVE_EXTRACT_RULE
プロシージャは、指定されたポリシーからrule_id
の抽出ルールを削除します。指定されたポリシーの所有者のみ、ポリシーから抽出ルールを削除できます。CTX_ENTITY.COMPILE
の実行後、抽出ルールの削除が有効になります。
構文
CTX_ENTITY.REMOVE_EXTRACT_RULE( policy_name IN VARCHAR2, rule_id IN INTEGER );
例
次の例は、pol1
ポリシーからIDが1の抽出ルールを削除します。
exec ctx_entity.remove_extract_rule('pol1', 1);
10.9 REMOVE_STOP_ENTITY
REMOVE_STOP_ENTITY
プロシージャは、抽出ポリシーからストップ・エンティティを削除します。指定されたポリシーの所有者のみ、ポリシーからストップ・エンティティを削除できます。ストップ・エンティティの削除は、CTX_ENTITY.COMPILE
の実行後に有効になります。entity_name
またはentity_type
にNULLを指定できますが、両方には指定できません。
構文
CTX_ENTITY.REMOVE_STOP_ENTITY( policy_name IN VARCHAR2, entity_name IN INTEGER DEFAULT NULL, entity_type IN VARCHAR2 DEFAULT NULL );
- policy_name
-
指定されたポリシーから
stop_entity
を削除します。 - entity_name
-
ストップ・エンティティ・リストから削除される名前を指定します。
CTX_ENTITY.ADD_STOP_ENTITY
を使用して、あらかじめstop_entity
がstop_entity
リストに追加されている必要があります。 - entity_type
-
ストップ・エンティティ・リストから削除されるエンティティのタイプを指定します。
CTX_ENTITY.ADD_STOP_ENTITY
を使用して、あらかじめstop_entity
がストップ・エンティティ・リストに追加されている必要があります。
例
exec ctx_entity.remove_stop_entity('pol1', NULL, 'person_name');
例の文は、pol1
ポリシーからentity_type
person_name
のすべての参照に対応するストップ・エンティティを削除します。実行後、このストップ・エンティティは、CTX_USER_EXTRACT_STOP_ENTITIES
ビューで「to be deleted」としてマークされます。ユーザーがCTX_ENTITY.COMPILE
を実行すると、ストップ・エンティティの削除が有効になります。