Während der Entwicklung meines aktuellsten Skills für Alexa wollte ich verschiedene Synonyme eines bestimmten Wortes abfangen und in meinem Code als einzelne Entität nutzen. Die Entity Resolution nimmt einem diese Zuordnung der Synonyme ab, wenn man sie vorher in seinem Intent Schema festgelegt hat.
Anforderung: mehrere Synonyme für denselben Slot Value
Mit dem genannten Skill können Nutzer an Alexa melden, was sie gerade getrunken haben. Sie erfahren dann, wie viel ihres eigenen Tagesbedarfs an Flüssigkeit sie heute schon erreicht haben. (Wer mehr über den Sittmacher erfahren möchte, findet hier die Landingpage des Skills. Gerade befindet er sich noch in der Zertifizierungsphase)
Zum Hinzufügen der Getränke sollen Nutzer neben Angaben in Millilitern oder Litern auch normale physische Gefäße (Glas, Tasse, Becher,…) benutzen können. Ein Becher (eine große Tasse, ca. 250ml) hat in verschiedenen Gegenden aber unterschiedliche Namen. Zum Beispiel „Haferl“ oder auch „Pott“. Diese möchte ich alle unterstützen.
Wenn ein Nutzer also einen der folgenden Sätze sagt, soll jedes Mal die Menge eines Bechers hinzugefügt werden:
- Alexa, sag Sittmacher, dass ich einen Becher Kaffee getrunken habe.
- Alexa, sag Sittmacher, dass ich ein Haferl Kaffee getrunken habe.
- Alexa, sag Sittmacher, dass ich einen Pott Kaffee getrunken habe.
Synonyme im Intent Schema festlegen
Anfangs habe ich das JSON des Intent Schemas jedes Skills noch manuell erstellt und angepasst. Mittlerweile nutze ich aber lieber den Skill Builder (beta). Dort kann man für einen Slot Value auch gleich die Synonyme eintragen:
Über die id (hier: becher) kann ich später eindeutig zuordnen, welches Gefäß gemeint ist.
Implementierung der Entity Resolution
Im nodeJS-Code kann die entsprechende id des Slots dann ermittelt werden. Aktuell ist die Abfrage noch etwas mühsam. Es ist aber davon auszugehen, dass das Alexa Skills Kit da in Zukunft noch Hilfestellung liefert.
let unityValue = unity.value; let resolution = (unity.resolutions && unity.resolutions.resolutionsPerAuthority && unity.resolutions.resolutionsPerAuthority.length > 0) ? unity.resolutions.resolutionsPerAuthority[0] : null; if (resolution && resolution.status && resolution.status.code === 'ER_SUCCESS_MATCH' && resolution.values && resolution.values.length > 0) { const slot = resolution.values[0].value; unityValue = slot.id; }
Zeile 1: Den unity.value setze ich als Fallback, falls der Slot keine Entity Resolutions nutzt oder keine passende gefunden wird.
Zeile 7: Wenn der genutzte Wert des Nutzers mit einem meiner Slot Values oder deren Synonymen übereinstimmt, dann ist der Status ER_SUCCESS_MATCH.
Würde ein Nutzer nun sagen: „Alexa, sag Sittmacher, dass ich einen Pott Kaffee getrunken habe“, würde im Code folgendes ankommen:
Zeile 1: In unity.value steht ‚Pott‘.
Zeile 11: slot.id gibt im Pott-Beispiel die id ‚becher‘ zurück. Hätte ich slot.value genutzt, würde ich ‚Becher‘ zurückbekommen (also den Value des Slots und nicht des Synonyms).
Im folgenden Request wird das nochmal klarer.
Intent Request inkl. Entity Resolution
{ "type": "IntentRequest", "intent": { "name": "AddBeverageIntent", "slots": { "unity": { "name": "unity", "value": "Pott", "resolutions": { "resolutionsPerAuthority": [ { "authority": "amzn1.er-authority.echo-sdk.<skill_id>.UNITY", "status": { "code": "ER_SUCCESS_MATCH" }, "values": [ { "value": { "name": "Becher", "id": "becher" } } ] } ] } } } } }
Testen im Service Simulator
Der Service Simulator (auf der Test-Seite deines Alexa Skills) unterstützt derzeit (Februar 2018) noch keine Resolutions.
Weiterführende Links
- Alexa Blogs: Announcing Alexa Entity Resolution
- Alexa Blogs: Entity Resolution in Skill Builder
- Alexa Skills Kit Docs: Define Synonyms and IDs for Slot Type Values (Entity Resolution)
Wie sind deine Erfahrungen mit den Entity Resolutions? Schreib es gerne in die Kommentare!