Back to Blog
3 min read

Entity Extraction with AI Builder: Mining Structured Data from Text

Entity extraction identifies and classifies named entities in text - people, organizations, locations, dates, and more. It transforms unstructured text into structured, actionable data.

Pre-built Entity Types

supported_entities:
  - Person: Names of people
  - Organization: Company names, institutions
  - Location: Places, addresses
  - DateTime: Dates, times, durations
  - Quantity: Numbers, measurements
  - PhoneNumber: Phone numbers
  - Email: Email addresses
  - URL: Web addresses

Basic Usage

// Extract entities from text
ExtractBtn.OnSelect =
    Set(
        EntityResult,
        AIBuilder.ExtractEntities(InputText.Text)
    );

// Display by entity type
ClearCollect(
    PersonEntities,
    Filter(EntityResult.entities, type = "Person")
);

ClearCollect(
    OrgEntities,
    Filter(EntityResult.entities, type = "Organization")
);

ClearCollect(
    LocationEntities,
    Filter(EntityResult.entities, type = "Location")
);

// Create contact from extracted entities
CreateContactBtn.OnSelect =
    Patch(
        Contacts,
        Defaults(Contacts),
        {
            FullName: First(PersonEntities).text,
            Company: First(OrgEntities).text,
            Email: First(Filter(EntityResult.entities, type = "Email")).text,
            Phone: First(Filter(EntityResult.entities, type = "PhoneNumber")).text
        }
    )

Email Processing

{
    "actions": {
        "Extract_From_Email": {
            "type": "AIBuilder",
            "inputs": {
                "model": "prebuilt-entityExtraction",
                "text": "@{triggerBody()?['body']}"
            }
        },
        "Process_Contacts": {
            "type": "ForEach",
            "foreach": "@body('Extract_From_Email')?['entities']",
            "actions": {
                "Check_Entity_Type": {
                    "type": "Switch",
                    "expression": "@items('Process_Contacts')?['type']",
                    "cases": {
                        "Person": {
                            "actions": {
                                "Create_Contact_If_New": {
                                    "type": "Condition",
                                    "expression": {
                                        "equals": [
                                            "@length(body('Check_Existing_Contact')?['value'])",
                                            0
                                        ]
                                    }
                                }
                            }
                        },
                        "Organization": {
                            "actions": {
                                "Link_To_Account": {}
                            }
                        }
                    }
                }
            }
        }
    }
}

Custom Entity Extraction

Train models to extract domain-specific entities:

custom_entities_example:
  insurance_domain:
    - PolicyNumber
    - ClaimAmount
    - IncidentDate
    - VehicleMake
    - VehicleModel

  healthcare_domain:
    - PatientID
    - Diagnosis
    - Medication
    - Dosage
    - Provider

Practical Applications

Meeting Notes Parser

// Parse meeting notes for action items
ParseMeetingNotes.OnSelect =
    Set(
        MeetingEntities,
        AIBuilder.ExtractEntities(MeetingNotesText.Text)
    );

    // Extract attendees (Person entities)
    ClearCollect(
        Attendees,
        Filter(MeetingEntities.entities, type = "Person")
    );

    // Extract mentioned dates for follow-ups
    ClearCollect(
        MentionedDates,
        Filter(MeetingEntities.entities, type = "DateTime")
    );

    // Extract mentioned companies
    ClearCollect(
        Companies,
        Filter(MeetingEntities.entities, type = "Organization")
    );

// Create meeting record
SaveMeetingBtn.OnSelect =
    Patch(
        Meetings,
        Defaults(Meetings),
        {
            Date: Today(),
            Notes: MeetingNotesText.Text,
            Attendees: Concat(Attendees, text, ", "),
            FollowUpDate: If(
                CountRows(MentionedDates) > 0,
                DateValue(Last(MentionedDates).text),
                DateAdd(Today(), 7, TimeUnit.Days)
            )
        }
    )

Contract Analysis

{
    "actions": {
        "Extract_Contract_Entities": {
            "type": "AIBuilder",
            "inputs": {
                "model": "prebuilt-entityExtraction",
                "text": "@{body('Extract_Text_From_PDF')}"
            }
        },
        "Identify_Parties": {
            "type": "Filter",
            "inputs": {
                "from": "@body('Extract_Contract_Entities')?['entities']",
                "where": "@equals(item()?['type'], 'Organization')"
            }
        },
        "Extract_Dates": {
            "type": "Filter",
            "inputs": {
                "from": "@body('Extract_Contract_Entities')?['entities']",
                "where": "@equals(item()?['type'], 'DateTime')"
            }
        },
        "Create_Contract_Record": {
            "type": "CreateRecord",
            "inputs": {
                "table": "contracts",
                "item": {
                    "party_a": "@{first(body('Identify_Parties'))?['text']}",
                    "party_b": "@{last(body('Identify_Parties'))?['text']}",
                    "effective_date": "@{first(body('Extract_Dates'))?['text']}",
                    "expiration_date": "@{last(body('Extract_Dates'))?['text']}"
                }
            }
        }
    }
}

Combining with Key Phrase Extraction

// Comprehensive text analysis
AnalyzeDocument.OnSelect =
    // Extract entities
    Set(
        Entities,
        AIBuilder.ExtractEntities(DocumentText.Text)
    );

    // Extract key phrases
    Set(
        KeyPhrases,
        AIBuilder.ExtractKeyPhrases(DocumentText.Text)
    );

    // Combine for document summary
    ClearCollect(
        DocumentSummary,
        {
            People: Concat(Filter(Entities.entities, type = "Person"), text, ", "),
            Organizations: Concat(Filter(Entities.entities, type = "Organization"), text, ", "),
            Topics: Concat(KeyPhrases.phrases, Value, ", "),
            Dates: Concat(Filter(Entities.entities, type = "DateTime"), text, ", ")
        }
    )

Best Practices

accuracy_tips:
  text_quality:
    - Clear, well-formatted text
    - Proper punctuation
    - Consistent formatting

  entity_handling:
    - Validate extracted entities
    - Handle duplicates
    - Normalize formats (dates, phones)

  edge_cases:
    - Abbreviations
    - Nicknames
    - Informal references

Conclusion

Entity extraction turns unstructured text into structured data:

  • Automatically identify people, organizations, locations
  • Extract dates, quantities, and contact information
  • Enable intelligent document processing
  • Power automated workflows

Combined with other AI Builder capabilities, it enables comprehensive text understanding.

Resources

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.