Overview
Starting with either the raw content (or the content transformed by a preceding manual or automated text pipeline element), applies the javascript, regex, or xpath transformation and writes the output to the document's full text (or description, or title, or one of the textual metadata fields).
This page has been broken down into the following sections for ease of localization:
Format
TODO convert to JSON
{ "display": string, "text": [ {} // see ManualTextExtractionSpecPojo below ] } ////////////////////////////////// public static class ManualTextExtractionSpecPojo { public String fieldName; // One of "fullText", "description", "title" public String script; // The script/xpath/javascript expression (see scriptlang below) public String flags; // Standard Java regex field (regex/xpath only), plus "H" to decode HTML public String replacement; // Replacement string for regex/xpath+regex matches, can include capturing groups as $1 etc public String scriptlang; // One of "javascript", "regex", "xpath" }
Description
Using manual text transformation you can specify the data source for your script to work on. The script is used to enrich the data from the data sources so it can be outputted as metadata for the creation of advanced entities and associations.
The following parameters are used in the configuration of manual text transformation
Parameter | Description | Note | Data Type |
---|---|---|---|
fieldName | Specifies the data source that the script will execute against "fullText," "description," or "title" | ||
script | Specify your script | ||
flags | Standard Java regex field Can have different values, based on See below. | ||
javascript: There are a few flags that provide additional variables in the javascript:
| |||
xpath (and regex, except for "O"):
| |||
replacement | If eg. You could find the instance C/M or C/F in a document and extract that it is important to note that the Race is Caucasian. The same can be done to extract M or F as a Sex meaning Male or Female. | ||
scriptlang | Specifies the language of the script that will be provided One of "javascript," "regex," or "xpath" |
Supported Script Languages
You can program manual text extraction using the following supported languages
- javascript
- regex
- xpath
javascript
For power users, metadata can be generated from the content using javascript. This gives a huge amount of flexibility to apply site/source-specific knowledge to pull out metadata that can be turned into entities or associations.
log file from file share
In the following example, manual text transformation is used to parse a log file over the web, with a script
of type javascript.
}, { "contentMetadata": [ { "fieldName": "info", "script": "var info = decode(text); info;", "scriptlang": "javascript" } ] }, { "text": [ { "fieldName": "fullText", "script": ",", "scriptlang": "regex", "flags": "md", "replacement": " , " }, { "fieldName": "description", "script": ",", "scriptlang": "regex", "flags": "md", "replacement": " , " } ] },
After "globals" has been used to define a variable called info, info can be used to capture the metadata for the sample input data. The metadata that will be captured in the example is as follows:
- info.date
- info.srcIP
- info.dstIP
- info.alert
- info.country
This captured metadata from the sample input data can then be used as output for the script.
], "fullText": "SCANNER_1 , 2012-01-01T13:43:00 , 10.0.0.1 , 66.66.66.66 , DUMMY_ALERT_TYPE_1 , United States", "mediaType": ["Log"], "metadata": {"info": [{ "alert": "DUMMY_ALERT_TYPE_1 ", "country": "United States", "date": "2012-01-01T13:43:00", "device": "SCANNER_1 ", "dstIP": "66.66.66.66", "srcIP": " 10.0.0.1" }]},
Obviously the javascript can also return more complex objects, arrays of objects, or array of primitives.
Regex
xml
The following example shows how a regex script can be used to manually parse the text of the ingested data:
}, { "contentMetadata": [ { "fieldName": "organization", "script": "believed the (.*?)(?: \\([^)]*\\))? (was|were) responsible", "scriptlang": "regex" }, { "fieldName": "organization", "script": "believed (.*?)(?: \\([^)]*\\))? (was|were) responsible", "scriptlang": "regex" }, { "fieldName": "organization", "script": ". ([^.]*?)(?: \\([^)]*\\))? claimed responsibility\\.$", "scriptlang": "regex" } ] },
In the example code snippet, the manual text transformation is defining a field name called "organization" and it uses regex to search the input XML data to find matches. In the case of this example, the XML data is an incident report.
.The sample output reports that no known "organization" was implicated.
}], "multipledays": ["No"], "organization": ["No group"], "perpetrator": [{ "characteristic": "Islamic Extremist (Sunni)", "nationality": "Unknown" }],
Xpath
Neither regex nor javascript are well suited for extracting fields from HTML and XML.
As a result, Infinit.e supports XPath 1.0 (with one minor extension to allow combined XPath regex).
In this example, an xpath script is used as part of manual text extraction, in order to convert a sample XML document into JSON.
}, { "links": { "extraMeta": [ { "context": "First", "fieldName": "convert_to_json", "flags": "o", "script": "//breakfast_menu/food[*]", "scriptlang": "xpath" } ], "script": "function convert_to_docs(jsonarray, url)\n{\n var docs = [];\n for (var docIt in jsonarray) {\n var predoc = jsonarray[docIt];\n delete predoc.content;\n var doc = {};\n doc.url = _doc.url.replace(/[?].*/,\"\") + '#' + docIt;\n doc.fullText = predoc;\n doc.title = \"TBD\";\n doc.description = \"TBD\";\n docs.push(doc);\n }\n return docs;\n}\nvar docs = convert_to_docs(_doc.metadata['convert_to_json'], _doc.url);\ndocs;", "scriptflags": "d" } },
The sample output would then return a series of JSON formatted responses. For example,
{ "communityId": ["4d38b72c054548f038a0414a"], "created": "Jun 5, 2013 09:12:15 PM UTC", "description": "TBD", "fullText": "{ \"calories\" : \"650\" , \"description\" : \"two of our famous Belgian Waffles with plenty of real maple syrup\" , \"price\" : \"$5.95\" , \"name\" : \"Belgian Waffles\"}", "mediaType": ["News"], "metadata": {"json": [{ "calories": "650", "description": "two of our famous Belgian Waffles with plenty of real maple syrup", "name": "Belgian Waffles", "price": "$5.95" }]}, "modified": "Jun 5, 2013 09:12:15 PM UTC", "publishedDate": "Jun 5, 2013 09:12:15 PM UTC", "source": ["aaa xml test"], "sourceKey": ["www.w3schools.com.xml.simple.xml"], "tags": ["tag1"], "title": "TBD", "url": "http://www.w3schools.com/xml/simple.xml#0" } { "communityId": ["4d38b72c054548f038a0414a"], "created": "Jun 5, 2013 09:12:15 PM UTC", "description": "TBD", "fullText": "{ \"calories\" : \"900\" , \"description\" : \"light Belgian waffles covered with strawberries and whipped cream\" , \"price\" : \"$7.95\" , \"name\" : \"Strawberry Belgian Waffles\"}", "mediaType": ["News"], "metadata": {"json": [{ "calories": "900", "description": "light Belgian waffles covered with strawberries and whipped cream", "name": "Strawberry Belgian Waffles", "price": "$7.95" }]}, "modified": "Jun 5, 2013 09:12:15 PM UTC", "publishedDate": "Jun 5, 2013 09:12:15 PM UTC", "source": ["aaa xml test"], "sourceKey": ["www.w3schools.com.xml.simple.xml"], "tags": ["tag1"], "title": "TBD", "url": "http://www.w3schools.com/xml/simple.xml#1" }