Freigeben über


Extrahieren einer Entität aus einer E-Mail-Nachricht mithilfe von EWS in Exchange

Erfahren Sie, wie Sie Informationen aus dem Text einer E-Mail-Nachricht mithilfe der verwalteten EWS-API oder EWS in Exchange extrahieren.

Sie können die verwaltete EWS-API oder EWS verwenden, um auf die Adressen, Kontakte, E-Mail-Adressen, Besprechungsvorschläge, Telefonnummern, Aufgaben und URLs zuzugreifen, die ein Exchange-Server aus E-Mail-Nachrichten extrahiert. Sie können diese Informationen dann für neue Anwendungen oder zum Vorschlagen von Folgeaktionen in vorhandenen Anwendungen verwenden. Wenn beispielsweise eine Kontaktentität, ein Besprechungsvorschlag oder ein Aufgabenvorschlag in einer E-Mail identifiziert wird, kann Ihre Anwendung vorschlagen, dass ein neues Element mit vorab aufgefüllten Informationen erstellt wird. Mithilfe extrahierter Entitäten können Sie die Absicht hinter den Daten nutzen und Benutzern dabei helfen, ihre E-Mail-Nachrichteninhalte nahtlos in umsetzbare Ergebnisse zu integrieren.

Die Entitätsextraktion für Adressen, Kontakte, E-Mail-Adressen, Besprechungsvorschläge, Telefonnummern, Aufgaben und URLs ist bereits in jedes Element im Exchange-Speicher integriert. Wenn Sie die verwaltete EWS-API verwenden, ruft die Item.EntityExtractionResult-Eigenschaft die Entitäten in einem Item.Bind-Methodenaufruf für Sie ab. Wenn Sie EWS verwenden, ruft das EntityExtractionResult-Element alle extrahierten Entitäten in einem GetItem-Vorgangsaufruf für Sie ab. Nachdem Sie die Ergebnisse der extrahierten Entitäten abgerufen haben, können Sie jede Entitätssammlung durchlaufen, um relevante Informationen zu sammeln. Wenn beispielsweise ein Besprechungsvorschlag extrahiert wurde, können Sie den vorgeschlagenen Besprechungsgegenstand, die Teilnehmerliste, die Startzeit und die Endzeit abrufen.

Tabelle 1. EWS Managed API-Eigenschaften und EWS-Elemente, die extrahierte Entitäten enthalten

Extrahierte Entität Eigenschaft in der verwalteten EWS-API EWS-Element
Addresses
EntityExtractionResult.Addresses
Addresses
Kontakte
EntityExtractionResult.Contacts
Kontakte
E-Mail-Adressen
EntityExtractionResult.EmailAddresses
EmailAddresses
Besprechungsvorschläge
EntityExtractionResult.MeetingSuggestions
MeetingSuggestions
Telefonnummern
EntityExtractionResult.PhoneNumbers
PhoneNumbers
Aufgabenvorschläge
EntityExtractionResult.TaskSuggestions
TaskSuggestions
URLs
EntityExtractionResult.Urls
Urls

Da die Entitätsextraktion von der Erkennung natürlicher Sprache abhängt, kann die Erkennung von Entitäten nicht deterministisch sein, und der Erfolg hängt manchmal vom Kontext ab. Um zu veranschaulichen, wie die Erkennung natürlicher Sprache funktioniert, verwenden die Beispiele in diesem Artikel die folgende E-Mail als Eingabe.

From: Ronnie Sturgis

To: Sadie Daniels

Subject: Dinner party

Hi Sadie

Are you free this Friday at 7 to join us for a dinner party at our house?

We're at 789 International Blvd, St Paul MN 55104.

Our number is 612-555-0158 if you have trouble finding it.

Please RSVP to either myself or Mara (mara@contoso.com) before Friday morning. Best for you organics (http://www.bestforyouorganics.com) will be catering so we can fully enjoy ourselves!

Also, can you forward this to Magdalena? I don't have her contact information.

See you then!

Ronnie

Extrahieren aller Entitäten aus einer E-Mail mithilfe der verwalteten EWS-API

Im folgenden Codebeispiel wird gezeigt, wie sie alle vom Server extrahierten Entitäten mithilfe der Item.Bind-Methode anzeigen und dann jede der extrahierten Entitäten und deren Eigenschaften auflisten.

In diesem Beispiel wird davon ausgegangen, dass service ein gültiges ExchangeService-Objekt ist, und dass ItemId die ID der zu verschiebenden oder kopierenden E-Mail-Nachricht ist.

public static void ExtractEntities(ExchangeService service, ItemId ItemId)
{
    // Create a property set that limits the properties returned 
    // by the Bind method to only those that are required.
    PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.EntityExtractionResult);
    // Get the item from the server.
    // This method call results in an GetItem call to EWS.
    Item item = Item.Bind(service, ItemId, propSet);
    Console.WriteLine("The following entities have been extracted from the message:");
    Console.WriteLine(" ");
    // If address entities are extracted from the message, print the results.
    if (item.EntityExtractionResult != null)
    {
        if (item.EntityExtractionResult.Addresses != null)
        {
            Console.WriteLine("--------------------Addresses---------------------------");
            foreach (AddressEntity address in item.EntityExtractionResult.Addresses)
            {
                Console.WriteLine("Address: {0}", address.Address);
            }
            Console.WriteLine(" ");
        }
        // If contact entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.Contacts != null)
        {
            Console.WriteLine("--------------------Contacts----------------------------");
            foreach (ContactEntity contact in item.EntityExtractionResult.Contacts)
            {
                Console.WriteLine("Addresses:       {0}", contact.Addresses);
                Console.WriteLine("Business name:   {0}", contact.BusinessName);
                Console.WriteLine("Contact string:  {0}", contact.ContactString);
                Console.WriteLine("Email addresses: {0}", contact.EmailAddresses);
                Console.WriteLine("Person name:     {0}", contact.PersonName);
                Console.WriteLine("Phone numbers:   {0}", contact.PhoneNumbers);
                Console.WriteLine("URLs:            {0}", contact.Urls);
            }
            Console.WriteLine(" ");
        }
        // If email address entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.EmailAddresses != null)
        {
            Console.WriteLine("--------------------Email addresses---------------------");
            foreach (EmailAddressEntity email in item.EntityExtractionResult.EmailAddresses)
            {
                Console.WriteLine("Email addresses: {0}", email.EmailAddress);
            }
            Console.WriteLine(" ");
        }
        // If meeting suggestion entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.MeetingSuggestions != null)
        {
            Console.WriteLine("--------------------Meeting suggestions-----------------");
            foreach (MeetingSuggestion meetingSuggestion in item.EntityExtractionResult.MeetingSuggestions)
            {
                Console.WriteLine("Meeting subject:  {0}", meetingSuggestion.Subject);
                Console.WriteLine("Meeting string:   {0}", meetingSuggestion.MeetingString);
                foreach (EmailUserEntity attendee in meetingSuggestion.Attendees)
                {
                    Console.WriteLine("Attendee name:    {0}", attendee.Name);
                    Console.WriteLine("Attendee user ID: {0}", attendee.UserId);
                }
                Console.WriteLine("Start time:       {0}", meetingSuggestion.StartTime);
                Console.WriteLine("End time:         {0}", meetingSuggestion.EndTime);
                Console.WriteLine("Location:         {0}", meetingSuggestion.Location);
            }
            Console.WriteLine(" ");
        }
        // If phone number entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.PhoneNumbers != null)
        {
            Console.WriteLine("--------------------Phone numbers-----------------------");
            foreach (PhoneEntity phone in item.EntityExtractionResult.PhoneNumbers)
            {
                Console.WriteLine("Original phone string:  {0}", phone.OriginalPhoneString);
                Console.WriteLine("Phone string:           {0}", phone.PhoneString);
                Console.WriteLine("Type:                   {0}", phone.Type);
            }
            Console.WriteLine(" ");
        }
        // If task suggestion entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.TaskSuggestions != null)
        {
            Console.WriteLine("--------------------Task suggestions--------------------");
            foreach (TaskSuggestion task in item.EntityExtractionResult.TaskSuggestions)
            {
                foreach (EmailUserEntity assignee in task.Assignees)
                {
                    Console.WriteLine("Assignee name:    {0}", assignee.Name);
                    Console.WriteLine("Assignee user ID: {0}", assignee.UserId);
                }
                Console.WriteLine("Task string:      {0}", task.TaskString);
            }
            Console.WriteLine(" ");
        }
        // If URL entities are extracted from the message, print the results.
        if (item.EntityExtractionResult.Urls != null)
        {
            Console.WriteLine("--------------------URLs--------------------------------");
            foreach (UrlEntity url in item.EntityExtractionResult.Urls)
            {
                Console.WriteLine("URL: {0}", url.Url);
            }
            Console.WriteLine(" ");
        }
    }
    // If no entities are extracted from the message, print the result.
    else if (item.EntityExtractionResult == null)
    {
        Console.WriteLine("No entities extracted");
    }
}

Die folgende Ausgabe wird in der Konsole angezeigt.

The following entities have been extracted from the message:
 
--------------------Addresses---------------------------
Address: 789 International Blvd, St Paul MN 55104
 
--------------------Contacts----------------------------
Addresses:       
Business name:   
Contact string:  Mara (mara@contoso.com)
Email addresses: mara@contoso.com
Person name:     Mara
Phone numbers:   
URLs:            
 
--------------------Email addresses---------------------
Email addresses: mara@contoso.com
 
--------------------Meeting suggestions-----------------
Meeting subject:  dinner party
Meeting string:   Are you free this Friday at 7 to join us for a dinner party at our house?
Attendee name:    Ronnie Sturgis
Attendee user ID: ronnie@contoso.com
Attendee name:    Sadie Daniels
Attendee user ID: sadie@cntoso.com
Start time:       10/1/0104 2:00:00 PM
End time:         10/1/0104 2:30:00 PM
Location:         
 
--------------------Phone numbers-----------------------
Original phone string:  612-555-0158
Phone string:           6125550158
Type:                   Unspecified
 
--------------------Task suggestions--------------------
Assignee name:    Sadie Daniels
Assignee user ID: sadie@contoso.com
Task string:      Also, can you forward this to Magdalena?
 
--------------------URLs--------------------------------
URL: http://www.bestforyouorganics.com

Beachten Sie, dass alle Adressen, Kontakte, E-Mail-Adressen, Telefonnummern, Aufgaben und URLs wie erwartet extrahiert wurden. Der Besprechungsvorschlag ist jedoch etwas komplexer. Beachten Sie, dass die Start- und Endzeit des Besprechungsvorschlags nicht ihren Erwartungen entsprechen. Die Startzeit in der E-Mail lautet "this friday at 7", aber der extrahierte Wert für die Startzeit ist 10/1/0104 14:00:00 PM. Dies liegt daran, dass die vom Server extrahierte Start- und Endzeit codierte Datumsangaben sind. Weitere Informationen zum Interpretieren von dateTime-Werten in Besprechungsvorschlägen finden Sie unter [MS-OXCEXT]: Client Extension Message Object Protocol.

Extrahieren aller Entitäten aus einer E-Mail mithilfe von EWS

Im folgenden Codebeispiel wird gezeigt, wie sie den GetItem-Vorgang und das EntityExtractionResult-Element verwenden, um die extrahierten Entitäten aus einem Element abzurufen.

Dies ist auch die XML-Anforderung, die von der verwalteten EWS-API gesendet wird, wenn Sie die Bind-Methode verwenden, um alle Entitäten aus einer E-Mail mithilfe der verwalteten EWS-API zu extrahieren.

Der Wert des ItemId-Elements wird aus Gründen der Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:EntityExtractionResult" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:ItemId Id="sVC5AAA=" />
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

Der Server antwortet auf die GetItem-Anforderung mit einer GetItemResponse-Nachricht , die den ResponseCode-WertNoError enthält, der angibt, dass die E-Mail-Nachricht erfolgreich abgerufen wurde. Die Antwort enthält auch das EntityExtractionResult für jede extrahierte Entität.

Der Wert des ItemId-Elements wird aus Gründen der Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="883"
                         MinorBuildNumber="10"
                         Version="V2_10"
                         xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:Message>
              <t:ItemId Id="sVC5AAA="
                        ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAOOqJN" />
              <t:EntityExtractionResult>
                <t:Addresses>
                  <t:AddressEntity>
                    <t:Position>LatestReply</t:Position>
                    <t:Address>789 International Blvd, St Paul MN 55104</t:Address>
                  </t:AddressEntity>
                </t:Addresses>
                <t:MeetingSuggestions>
                  <t:MeetingSuggestion>
                    <t:Position>LatestReply</t:Position>
                    <t:Attendees>
                      <t:EmailUser>
                        <t:Name>Ronnie Sturgis</t:Name>
                        <t:UserId>ronnie@contoso.com</t:UserId>
                      </t:EmailUser>
                      <t:EmailUser>
                        <t:Name>Sadie Daniels</t:Name>
                        <t:UserId>sadie@contoso.com</t:UserId>
                      </t:EmailUser>
                    </t:Attendees>
                    <t:Subject>dinner party</t:Subject>
                    <t:MeetingString>Are you free this Friday at 7 to join us for a dinner party at our house?</t:MeetingString>
                    <t:StartTime>0104-10-01T19:00:00Z</t:StartTime>
                    <t:EndTime>0104-10-01T19:30:00Z</t:EndTime>
                  </t:MeetingSuggestion>
                </t:MeetingSuggestions>
                <t:TaskSuggestions>
                  <t:TaskSuggestion>
                    <t:Position>LatestReply</t:Position>
                    <t:TaskString>Also, can you forward this to Magdalena?</t:TaskString>
                    <t:Assignees>
                      <t:EmailUser>
                        <t:Name>Sadie Daniels</t:Name>
                        <t:UserId>sadie@contoso.com</t:UserId>
                      </t:EmailUser>
                    </t:Assignees>
                  </t:TaskSuggestion>
                </t:TaskSuggestions>
                <t:EmailAddresses>
                  <t:EmailAddressEntity>
                    <t:Position>LatestReply</t:Position>
                    <t:EmailAddress>mara@contoso.com</t:EmailAddress>
                  </t:EmailAddressEntity>
                </t:EmailAddresses>
                <t:Contacts>
                  <t:Contact>
                    <t:Position>LatestReply</t:Position>
                    <t:PersonName>Mara</t:PersonName>
                    <t:EmailAddresses>
                      <t:EmailAddress>mara@contoso.com</t:EmailAddress>
                    </t:EmailAddresses>
                    <t:ContactString>Mara (mara@contoso.com</t:ContactString>
                  </t:Contact>
                </t:Contacts>
                <t:Urls>
                  <t:UrlEntity>
                    <t:Position>LatestReply</t:Position>
                    <t:Url>http://www.bestforyouorganics.com</t:Url>
                  </t:UrlEntity>
                </t:Urls>
                <t:PhoneNumbers>
                  <t:Phone>
                    <t:Position>LatestReply</t:Position>
                    <t:OriginalPhoneString>612-555-0158</t:OriginalPhoneString>
                    <t:PhoneString>6125550158</t:PhoneString>
                    <t:Type>Unspecified</t:Type>
                  </t:Phone>
                </t:PhoneNumbers>
              </t:EntityExtractionResult>
            </t:Message>
          </m:Items>
        </m:GetItemResponseMessage>
      </m:ResponseMessages>
    </m:GetItemResponse>
  </s:Body>
</s:Envelope>

Beachten Sie, dass alle Adressen, Kontakte, E-Mail-Adressen, Telefonnummern, Aufgaben und URLs wie erwartet extrahiert wurden. Der Besprechungsvorschlag ist jedoch etwas komplexer. Beachten Sie, dass die Start- und Endzeit des Besprechungsvorschlags nicht ihren Erwartungen entsprechen. Die Startzeit in der E-Mail lautete "this friday at 7", aber der extrahierte Wert für die Startzeit ist 10/1/0104 14:00:00 PM. Dies liegt daran, dass die vom Server extrahierte Start- und Endzeit codierte Datumsangaben sind. Weitere Informationen zum Interpretieren von dateTime-Werten in Besprechungsvorschlägen finden Sie unter [MS-OXCEXT]: Client Extension Message Object Protocol.

Siehe auch