It’s been almost a year since the release of Firebase ML Kit and the team brought some neat changes to the package: 4 new AI models to do with Natural Language and Preparation for Production.
Of course, as one who advocates the ease of use of AI so endearingly as long as it doesn’t destroy the human race, I must spread the word on this fine art in the way I do best.
This week, we’re heading back into the ML Kit series strong covering the Natural Language models! Split into two parts, Language Identification and Smart Replies.
Prerequisites
If you’re new to Firebase and don’t yet have it in your app, you’ll have to connect it to Firebase like so, then you’ll need these dependencies in your app/build.gradle.
implementation 'com.google.firebase:firebase-ml-natural-language:18.1.1' implementation 'com.google.firebase:firebase-ml-natural-language-language-id-model:18.0.2' implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:18.0.0'
Additionally for the Smart Reply model, you also need to disable tflite compression in your app/build.gradle.
android { // ... aaptOptions { noCompress "tflite" } }
Language Identification
Simple language identification | |
---|---|
“My hovercraft is full of eels.” | en (English) |
“ph’nglui mglw’nafh TensorFlow Google wgah’nagl fhtagn” | und (Unidentified) |
Table stolen from Firebase Docs
If it’s not already obvious enough, this model takes in a string of text and attempts to identify the language it’s written in. This works just like the other ML Kit AI models, it returns all the possible languages of the string in varying confidence levels with the highest the most likely to be the language it’s written in.
The model supports 103 different languages in their native scripts and can identify romanized text for the languages Arabic, Bulgarian, Chinese, Greek, Hindi, Japanese, and Russian.
Identify String Language
Fortunately, the new models are super easy to use, especially compared with the original set of ML Kit models.
All you need to do is get a LanguageIdentification from an instance of FirebaseNaturalLanguage.
val languageIdentifier = FirebaseNaturalLanguage.getInstance().getLanguageIdentification()
Then call languageIdentifier.identifyLanguage and add success and failure listeners. The success method will return the languageCode as a String which will be the language with the highest confidence level over 0.5. If no such language exists, ‘und’ will be returned instead.
languageIdentifier.identifyLanguage(text) .addOnSuccessListener() .addOnFailureListener()
Alternately, you can call languageIdentifier.identifyAllLanguages which will return a list of likely languages of the string as IdentifiedLanguage, an object that contains the language code and its confidence level.
The confidence threshold for a language to be returned in this list is 0.01. Again, if no language meets the threshold, the list will have one item and it’ll be ‘und’.
Change Confidence Thresholds
Optionally, when you call getLanguageIdentification to make the languageIdentifier, you can pass in a FirebaseLanguageIdentificationOptions which you can use to change the confidence thresholds for these methods. The thresholds are separate for the two methods.
val options = FirebaseLanguageIdentificationOptions.Builder() .setIdentifyLanguageConfidenceThreshold(0.3f) .setIdentifyAllLanguagesConfidenceThreshold(0.2f) .build())
Smart Replies
This feature is becoming a trend in many social and email apps including Gmail, LinkedIn, and many SMS apps. Firebase Smart Replies generate up to 3 responses based on the last 10 messages from a conversation history.
The model only works for English and will not generate replies for sensitive topics.
Build the Conversation: A list of FirebaseTextMessages
The conversation you’ll be passing into the Smart Reply object is a List of FirebaseTextMessage. When the user sends a message, add the message by calling FirebaseTextMessage.createForLocalUser, passing in the message and its timestamp.
conversation.add(FirebaseTextMessage.createForLocalUser("heading out now", System.currentTimeMillis()))
Then when the user receives a message, call FirebaseTextMessage.createForRemoteUser, passing in the message, timestamp, and a userID to uniquely identify the sender. This userID doesn’t need to correspond to any user data (so it doesn’t have to relate to the Auth UID, though it can) and doesn’t even need to be consistent between separate invocations of the Smart Reply.
conversation.add(FirebaseTextMessage.createForRemoteUser("Are you coming back soon?", System.currentTimeMillis(), userId))
A sample conversation list can look like this:
Timestamp | User ID | Local User? | Message |
---|---|---|---|
Thu Feb 21 13:13:39 PST 2019 | true | are you on your way? | |
Thu Feb 21 13:15:03 PST 2019 | FRIEND0 | false | Running late, sorry! |
Table also stolen from Firebase Docs
Generate the Replies
To generate the suggestions based on the conversation list built, instantiate a FirebaseSmartReply and call suggest, passing in the conversation.
val smartReply = FirebaseNaturalLanguage.getInstance().smartReply smartReply.suggest(conversation)
As per usual, add success and failure listeners. the Success method returns a SmartReplySuggestionResult. This contains a list of strings contained in result.suggestions. You can also use result.getStatus to find out if your operation was successful.
if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) val replies = result.suggestions
For the conversation history above, you might get these replies.
- No worries
- ?
- No problem!
Note that 3 is the max number of generated replies. ML Kit might not return results if the model isn’t confident in the relevance of the suggested replies, the input conversation isn’t in English, or if the model detects sensitive subject matter.