Extract entities with ML Kit on iOS

To analyze a piece of text and extract the entities in it, invoke the ML Kit entity extraction API by passing the text directly to its annotateText:completion: method. It is also possible to pass in an optional EntityExtractionParams object which contains other configuration options such as a reference time, timezone, or a filter to limit the search for a subset of entity types. The API returns a list of EntityAnnotation objects containing information about each entity.

The entity extraction base detector assets are statically linked at app run time. They add about 10.7MB to your app.

Try it out

  • Play around with the sample app to see an example usage of this API.

Before you begin

  1. Include the following ML Kit libraries in your Podfile:

     pod 'GoogleMLKit/EntityExtraction', '8.0.0' 
    
  2. After you install or update your project's Pods, open your Xcode project using its .xcworkspace. ML Kit is supported in Xcode version 13.2.1 or higher.

Extract entities from text

To extract entities from text, first create an EntityExtractorOptions object by specifying the language and use that to instantiate an EntityExtractor :

Swift

 // Note: You can specify any of the 15 languages entity extraction supports here. 
 let 
  
 options 
  
 = 
  
 EntityExtractorOptions 
 ( 
 modelIdentifier 
 : 
  
  
 EntityExtractionModelIdentifier 
 . 
 english 
 ) 
 let 
  
 entityExtractor 
  
 = 
  
 EntityExtractor 
 . 
 entityExtractor 
 ( 
 options 
 : 
  
 options 
 ) 

Objective-C

 // Note: You can specify any of the 15 languages entity extraction supports here. 
 MLKEntityExtractorOptions 
  
 * 
 options 
  
 = 
  
  
 [[ 
 MLKEntityExtractorOptions 
  
 alloc 
 ] 
  
  
 initWithModelIdentifier 
 : 
 MLKEntityExtractionModelIdentifierEnglish 
 ]; 
 MLKEntityExtractor 
  
 * 
 entityExtractor 
  
 = 
  
  
 [ 
 MLKEntityExtractor 
  
 entityExtractorWithOptions 
 : 
 options 
 ]; 

Next, ensure that the required language model is downloaded to the device:

Swift

 entityExtractor 
 . 
 downloadModelIfNeeded 
 ( 
 completion 
 : 
  
 { 
  
 // If the error is nil, the download completed successfully. 
 }) 

Objective-C

 [ 
 entityExtractor 
  
 downloadModelIfNeededWithCompletion 
 :^ 
 ( 
 NSError 
  
 * 
 _Nullable 
  
 error 
 ) 
  
 { 
  
 // If the error is nil, the download completed successfully. 
 }]; 

Once the model has been downloaded, pass a string and an optional MLKEntityExtractionParams to the annotate method.

Swift

 // The EntityExtractionParams parameter is optional. Only instantiate and 
 // configure one if you need to customize one or more of its params. 
 var 
  
 params 
  
 = 
  
 EntityExtractionParams 
 () 
 // The params object contains the following properties which can be customized on 
 // each annotateText: call. Please see the class's documentation for a more 
 // detailed description of what each property represents. 
 params 
 . 
 referenceTime 
  
 = 
  
 Date 
 (); 
 params 
 . 
 referenceTimeZone 
  
 = 
  
 TimeZone 
 ( 
 identifier 
 : 
  
 "GMT" 
 ); 
 params 
 . 
 preferredLocale 
  
 = 
  
 Locale 
 ( 
 identifier 
 : 
  
 "en-US" 
 ); 
 params 
 . 
 typesFilter 
  
 = 
  
 Set 
 ([ 
 EntityType 
 . 
 address 
 , 
  
 EntityType 
 . 
 dateTime 
 ]) 
 extractor 
 . 
 annotateText 
 ( 
  
 text 
 . 
 string 
 , 
  
 params 
 : 
  
 params 
 , 
  
 completion 
 : 
  
 { 
  
 result 
 , 
  
 error 
  
 in 
  
 // If the error is nil, the annotation completed successfully and any results 
  
 // will be contained in the `result` array. 
  
 } 
 ) 

Objective-C

 // The MLKEntityExtractionParams property is optional. Only instantiate and 
 // configure one if you need to customize one or more of its params. 
 MLKEntityExtractionParams 
  
 * 
 params 
  
 = 
  
 [[ 
 MLKEntityExtractionParams 
  
 alloc 
 ] 
  
 init 
 ]; 
 // The params object contains the following properties which can be customized on 
 // each annotateText: call. Please see the class's documentation for a fuller 
 // description of what each property represents. 
 params 
 . 
 referenceTime 
  
 = 
  
 [ 
 NSDate 
  
 date 
 ]; 
 params 
 . 
 referenceTimeZone 
  
 = 
  
 [ 
 NSTimeZone 
  
 timeZoneWithAbbreviation 
 : 
 @"GMT" 
 ]; 
 params 
 . 
 preferredLocale 
  
 = 
  
 [ 
 NSLocale 
  
 localWithLocaleIdentifier 
 : 
 @"en-US" 
 ]; 
 params 
 . 
 typesFilter 
  
 = 
  
  
 [ 
 NSSet 
  
 setWithObjects 
 : 
 MLKEntityExtractionEntityTypeAddress 
 , 
  
  
 MLKEntityExtractionEntityTypeDateTime 
 , 
  
 nil 
 ]; 
 [ 
 extractor 
  
 annotateText 
 : 
 text 
 . 
 string 
  
 withParams 
 : 
 params 
  
 completion 
 : 
 ^ 
 ( 
 NSArray 
   
 * 
 _Nullable 
  
 result 
 , 
  
 NSError 
  
 * 
 _Nullable 
  
 error 
 ) 
  
 { 
  
 // If the error is nil, the annotation completed successfully and any results 
  
 // will be contained in the `result` array. 
 } 
 

Loop over the annotation results to retrieve information about the recognized entities.

Swift

 // let annotations be the Array ! returned from EntityExtractor 
 
 for 
  
 annotation 
  
 in 
  
 annotations 
  
 { 
  
 let 
  
 entities 
  
 = 
  
 annotation 
 . 
 entities 
  
 for 
  
 entity 
  
 in 
  
 entities 
  
 { 
  
 switch 
  
 entity 
 . 
 entityType 
  
 { 
  
 case 
  
 EntityType 
 . 
 dateTime 
 : 
  
 guard 
  
 let 
  
 dateTimeEntity 
  
 = 
  
 entity 
 . 
 dateTimeEntity 
  
 else 
  
 { 
  
 print 
 ( 
 "This field should be populated." 
 ) 
  
 return 
  
 } 
  
 print 
 ( 
 "Granularity: %d" 
 , 
  
 dateTimeEntity 
 . 
 dateTimeGranularity 
 ) 
  
 print 
 ( 
 "DateTime: %@" 
 , 
  
 dateTimeEntity 
 . 
 dateTime 
 ) 
  
 case 
  
 EntityType 
 . 
 flightNumber 
 : 
  
 guard 
  
 let 
  
 flightNumberEntity 
  
 = 
  
 entity 
 . 
 flightNumberEntity 
  
 else 
  
 { 
  
 print 
 ( 
 "This field should be populated." 
 ) 
  
 return 
  
 } 
  
 print 
 ( 
 "Airline Code: %@" 
 , 
  
 flightNumberEntity 
 . 
 airlineCode 
 ) 
  
 print 
 ( 
 "Flight number: %@" 
 , 
  
 flightNumberEntity 
 . 
 flightNumber 
 ) 
  
 case 
  
 EntityType 
 . 
 money 
 : 
  
 guard 
  
 let 
  
 moneyEntity 
  
 = 
  
 entity 
 . 
 moneyEntity 
  
 else 
  
 { 
  
 print 
 ( 
 "This field should be populated." 
 ) 
  
 return 
  
 } 
  
 print 
 ( 
 "Currency: %@" 
 , 
  
 moneyEntity 
 . 
 integerPart 
 ) 
  
 print 
 ( 
 "Integer Part: %d" 
 , 
  
 moneyEntity 
 . 
 integerPart 
 ) 
  
 print 
 ( 
 "Fractional Part: %d" 
 , 
  
 moneyEntity 
 . 
 fractionalPart 
 ) 
  
 // Add additional cases as needed. 
  
 default 
 : 
  
 print 
 ( 
 "Entity: %@" 
 , 
  
 entity 
 ); 
  
 } 
  
 } 
 } 

Objective-C

 NSArray 
   
 * 
 annotations 
 ; 
  
 // Returned from EntityExtractor 
 for 
  
 ( 
 MLKEntityAnnotation 
  
 * 
 annotation 
  
 in 
  
 annotations 
 ) 
  
 { 
  
 NSArray 
   
 * 
 entities 
  
 = 
  
 annotation 
 . 
 entities 
 ; 
  
 NSLog 
 ( 
 @"Range: [%d, %d)" 
 , 
  
 ( 
 int 
 ) 
 annotation 
 . 
 range 
 . 
 location 
 , 
  
 ( 
 int 
 )( 
 annotation 
 . 
 range 
 . 
 location 
  
 + 
  
 annotation 
 . 
 range 
 . 
 length 
 )); 
  
 for 
  
 ( 
 MLKEntity 
  
 * 
 entity 
  
 in 
  
 entities 
 ) 
  
 { 
  
 if 
  
 ([ 
 entity 
 . 
 entityType 
  
 isEqualToString 
 : 
 MLKEntityExtractionEntityTypeDateTime 
 ]) 
  
 { 
  
 MLKDateTimeEntity 
  
 * 
 dateTimeEntity 
  
 = 
  
 entity 
 . 
 dateTimeEntity 
 ; 
  
 NSLog 
 ( 
 @"Granularity: %d" 
 , 
  
 ( 
 int 
 ) 
 dateTimeEntity 
 . 
 dateTimeGranularity 
 ); 
  
 NSLog 
 ( 
 @"DateTime: %@" 
 , 
  
 dateTimeEntity 
 . 
 dateTime 
 ); 
  
 break 
 ; 
  
 } 
  
 else 
  
 if 
  
 ([ 
 entity 
 . 
 entityType 
  
 isEqualToString 
 : 
 MLKEntityExtractionEntityTypeFlightNumber 
 ]) 
  
 { 
  
 MLKFlightNumberEntity 
  
 * 
 flightNumberEntity 
  
 = 
  
 entity 
 . 
 flightNumberEntity 
 ; 
  
 NSLog 
 ( 
 @"Airline Code: %@" 
 , 
  
 flightNumberEntity 
 . 
 airlineCode 
 ); 
  
 NSLog 
 ( 
 @"Flight number: %@" 
 , 
  
 flightNumberEntity 
 . 
 flightNumber 
 ); 
  
 break 
 ; 
  
 } 
  
 else 
  
 if 
  
 ([ 
 entity 
 . 
 entityType 
  
 isEqualToString 
 : 
 MLKEntityExtractionEntityTypeMoney 
 ]) 
  
 { 
  
 MLKMoneyEntity 
  
 * 
 moneyEntity 
  
 = 
  
 entity 
 . 
 moneyEntity 
 ; 
  
 NSLog 
 ( 
 @"Currency: %@" 
 , 
  
 moneyEntity 
 . 
 unnormalizedCurrency 
 ); 
  
 NSLog 
 ( 
 @"Integer Part: %d" 
 , 
  
 ( 
 int 
 ) 
 moneyEntity 
 . 
 integerPart 
 ); 
  
 NSLog 
 ( 
 @"Fractional Part: %d" 
 , 
  
 ( 
 int 
 ) 
 moneyEntity 
 . 
 fractionalPart 
 ); 
  
 break 
 ; 
  
 } 
  
 else 
  
 { 
  
 // Add additional cases as needed. 
  
 NSLog 
 ( 
 @"Entity: %@" 
 , 
  
 entity 
 ); 
  
 } 
  
 } 
 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: