Basic Example of Using Entity Extraction
The example in this section provides a very basic example of entity extraction. The example assumes that a CLOB contains the following text:
New York, United States of America
The Dow Jones Industrial Average climbed by 5% yesterday on news of a new software release from database giant Oracle Corporation.
The example uses CTX_ENTITY.EXTRACT to find the entities in CLOB value. (For now, do not worry about how the text got into the CLOB or how we provide the output CLOB.)
Entity extraction requires a new type of policy, an “extract policy,” which enables you to specify options. For now, create a default policy:
ctx_entity.create_extract_policy( 'mypolicy' );
Now you can call extract to do the work. It needs four arguments: the policy name, the document to process, the language, and the output CLOB (which you should have initialized, for example, by calling dbms_lob.createtemporary).
ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob )
In the previous example, outclob contains the XML that identifies extracted entities. When you display the contents (preferably by selecting it as XMLTYPE so that it is formatted nicely), here is what you see:
<entities>
<entity id="0" offset="0" length="8" source="SuppliedDictionary">
<text>New York</text>
<type>city</type>
</entity>
<entity id="1" offset="150" length="18" source="SuppliedRule">
<text>Oracle Corporation</text>
<type>company</type>
</entity>
<entity id="2" offset="10" length="24" source="SuppliedDictionary">
<text>United States of America</text>
<type>country</type>
</entity>
<entity id="3" offset="83" length="2" source="SuppliedRule">
<text>5%</text>
<type>percent</type>
</entity>
<entity id="4" offset="113" length="8" source="SuppliedDictionary">
<text>software</text>
<type>product</type>
</entity>
<entity id="5" offset="0" length="8" source="SuppliedDictionary">
<text>New York</text>
<type>state</type>
</entity>
</entities>
This display is fine if you process it with an XML-aware program. However, if you want it in a more “SQL friendly” view, use Oracle XML Database (XML DB) functions to convert it as follows:
select xtab.offset, xtab.text, xtab.type, xtab.source
from xmltable( '/entities/entity'
PASSING xmltype(outclob)
COLUMNS
offset number PATH '@offset',
lngth number PATH '@length',
text varchar2(50) PATH 'text/text()',
type varchar2(50) PATH 'type/text()',
source varchar2(50) PATH '@source'
) as xtab order by offset;
Here is the output:
OFFSET TEXT TYPE SOURCE
---------- ------------------------- -------------------- --------------------
0 New York city SuppliedDictionary
0 New York state SuppliedDictionary
10 United States of America country SuppliedDictionary
83 5% percent SuppliedRule
113 software product SuppliedDictionary
150 Oracle Corporation company SuppliedRule
If you do not want to fetch all entity types, you can select the types by adding a fourth argument to the “extract” procedure, with a comma-separated list of entity types. For example:
ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob, 'city, country' )
That would give us the XML
<entities>
<entity id="0" offset="0" length="8" source="SuppliedDictionary">
<text>New York</text>
<type>city</type>
</entity>
<entity id="2" offset="10" length="24" source="SuppliedDictionary">
<text>United States of America</text>
<type>country</type>
</entity>
</entities>