OpenAmplify ontwikkelaarsdagboek - deel drie: Vergelijkingen van onderwerpintenties

In deel twee van deze serie besprak ik de vergelijking van de auteursinformatie ("Demografie" en "Stijl") die de OpenAmplify-uitvoer biedt. In deel drie fotografeer ik voor een veel ambitieuzer doel, 'Onderwerpintenties'. Mijn doel is om een ​​schatting te kunnen geven van hoe vergelijkbaar de twee documenten zijn in termen van wat ze bespreken en hoe ze het bespreken.

Waarom wil ik dit doen? Nou, mijn applicatie, Rat Catcher, geeft me wat ik een "Semantic Match Score" (SM-score) noem. De SM-score wordt gebruikt om eventuele overeenkomsten tussen de inhoud van de twee documenten weer te geven. Vanaf mijn eerste test is de SM-score een geweldige aanvulling op het bestaande percentage dat het aantal overeenkomende "zinnen" in de documenten aangeeft. Wat SM-score hier zo nuttig maakt, is dat het de gebruiker helpt documenten te vinden die een "creatieve herformulering" kunnen zijn en als gevolg daarvan geen zeer hoog percentage voor zoektermen zullen hebben.

In de toekomst ben ik van plan om de SM-score veel verder te brengen. Om te beginnen zou ik een hoge SM-score willen gebruiken om een ​​"thesaurusvergelijking" te genereren van documenten waarin afzonderlijke woordgroepen worden opgesplitst in woordstammen. Van daaruit kunnen variaties worden gemaakt op basis van een thesaurus en wordt elke variatie gezocht in het doeldocument. Onnodig te zeggen dat dit een computationeel brute oefening zal zijn, dus als de SM-score kan worden gebruikt om documenten uit te filteren die in aanmerking komen voor deze behandeling, zal ik veel gelukkiger zijn.

Mijn logica in deze methode is om het volgende te doen:

  1. Maak een "Topic Intention" -score voor de "Topics" van 0 tot 100. ("0" betekent "geen Topics uit het originele document verschijnen in het vergelijkingsdocument" en "100" geeft aan "alle Topics in het originele verschijnen in het vergelijkingsdocument) en match Polariteit, Verzoek om begeleiding en Aanbod begeleiding. "
  2. Repliceer deze logica voor juiste naamwoorden.
  3. Repliceer deze logica voor locaties, maar controleer in plaats van de diepgaande vergelijking van onderwerpintenties gewoon het bestaan ​​in elk document.
  4. Combineer de drie scores in een samengestelde score door ze bij elkaar op te tellen en te delen door 3.
  5. Eventuele fouten resulteren in onmiddellijke beëindiging en een resultaat van 0, voor het gemak.

Laten we nu eens kijken naar de SM-score en hoe deze wordt uitgedrukt als een float, met een bereik van 0 tot 100 (0 is "geen match" en 100 betekent "perfecte match").

Hier is mijn methodeverklaring:

private float CompareOpenAmplifyContent (XDocument Original, XDocument CompareTo)

De code om de vergelijking tussen de Topics en de code voor de Proper Nouns uit te voeren is identiek, behalve de XML-elementen waarnaar wordt verwezen, dus ik ga alleen laten zien hoe ik de Topics vergelijk:

var topOriginalTopics =

van onderwerp in

Original.Root.Element ( "AmplifyReturn"). Element ( "TopicIntentions"). Element

( "TopTopics").

Elementen ()

selecteer onderwerp;

var topCompareToTopics =

van onderwerp in

CompareTo.Root.Element ( "AmplifyReturn"). Element ( "TopicIntentions"). Element

( "TopTopics").

Elementen ()

selecteer onderwerp;

float topTopicsResult = 0;

if (topOriginalTopics.Count ()> 0 && topCompareToTopics.Count ()> 0)

{

foreach (var originalTopic in topOriginalTopics)

{

XElement vergelijkToTopic = null;

foreach (var topic in topCompareToTopics)

{

if (topic.Element ("Topic"). Element ("Name"). Value.ToLower (). Trim () == originalTopic.Element ("Topic"). Element ("Name"). Value.ToLower () .Trim ())

{

vergelijkToTopic = onderwerp;

breken;

}

}

if (vergelijkToTopic == null)

{

doorgaan met;

}

topTopicsResult + = CompareOpenAmplifyTopicIntentionResults

(origineelTopisch, vergelijkToTopisch) *

(100 / topOriginalTopics.Count ());

}

topTopicsResult = (float) Math.Max ​​(Math.Round (topTopicsResult), 100);

}

if (topOriginalTopics.Count () == 0)

{

topTopicsResult = 100;

}

Ik maak een lijst met de onderwerpen in elk document. Vervolgens doorzoek ik de lijst met originele onderwerpen en zoek ik naar knooppunten in de vergelijking met dezelfde naam. Als ze overeenkomen, breek ik uit de lus. Aan het einde van de lus als ik iets vind (met behulp van enige negatieve logica; ik ga door naar de volgende iteratie als er niets werd gevonden) Ik bereken het resultaat van de onderwerpintentie (de XML-knoop die de details van een item binnen de onderwerpintenties bevat) gelijkenis en deel het door het aantal Topics in het originele document (dus een 100% match wordt gewogen naar het aantal topics) en voeg het toe aan de huidige score voor de Topics. Als er geen Top Topics waren (onwaarschijnlijk) geef ik het een 100% match. Hier is mijn code om onderwerpintenties te vergelijken:

private float Vergelijken Openen AmplifyTopicIntentionResults (XElement Original, XElement CompareTo)

{

if (Origineel == null || CompareTo == null)

{

terugkeer 0;

}

var matchedItems = 0;

if (Original.Element ("Polarity"). Element ("Min"). Element ("Name") == CompareTo.Element ("Polarity"). Element ("Min"). Element ("Name"))

{

matchedItems ++;

}

if (Original.Element ("Polarity"). Element ("Mean"). Element ("Name") == CompareTo.Element ("Polarity"). Element ("Mean"). Element ("Name"))

{

matchedItems ++;

}

if (Original.Element ("Polarity"). Element ("Max"). Element ("Name") == CompareTo.Element ("Polarity"). Element ("Max"). Element ("Name"))

{

matchedItems ++;

}

var polarityRating = (float) matchedItems / 3;

var offeringGuidanceRating = 0;

if (Original.Element ("OffersGuidance"). Element ("Name") == CompareTo.Element ("OffersGuidance"). Element ("Name"))

{

offeringGuidanceRating ++;

}

var requestingGuidanceRating = 0;

if (Original.Element ("RequestingGuidance"). Element ("Nam e") == CompareTo.Element ("RequestingGuidance"). Element ("Name"))

{

requestingGuidanceRating ++;

}

var result = Math.Min (((polarityRating + offeringGuidanceRating + requestingGuidanceRating) / 3), 1);

retourresultaat;

}

Zoals u kunt zien, is er niets bijzonders aan deze code; het is gewoon een snelle en vuile vergelijking maken op een element-voor-element basis tussen de twee Topic Intention-knooppunten. Als je goed kijkt, zie je dat de polariteitsbeoordeling drie componenten heeft voor de drie polariteitsresultaten (gemiddelde, min en max). Ik schop de resultaten terug als een waarde tussen 0 en 1.

Om de Locatievergelijking uit te voeren:

var originalLocations =

van onderwerp in

originalXml.Root.Element ( "AmplifyReturn"). Element ( "TopicIntentions").

Element ( "Locations").

Elementen ()

selecteer onderwerp;

var vergelijkToLocations =

van onderwerp in

compareToXml.Root.Element ( "AmplifyReturn"). Element ( "TopicIntentions").

Element ( "Locations").

Elementen ()

selecteer onderwerp;

zweeflocaties Resultaat = 0;

if (originalLocations.Count ()> 0 && vergelijkToLocations.Count ()> 0)

{

foreach (var originalTopic in originalProperNouns)

{

foreach (var topic in CompareToLocations)

{

if (topic.Element ("Result"). Element ("Name"). Value.ToLower (). Trim () == originalTopic.Element ("Result"). Element ("Name"). Value.ToLower () .Trim ())

{

locationsResult + = 100 / originalLocations.Count ();

breken;

}

}

}

}

if (originalLocations.Count () == 0)

{

locatiesresultaat = 100;

}

Nogmaals, er is hier niets verschrikkelijk complex. Ik loop er gewoon doorheen en controleer om te zien hoeveel items in het originele document in de vergelijking worden weergegeven.

In deel vier duik ik in de SOAP-interface naar OpenAmplify, die met name interessant zal zijn voor de Java- en .NET-ontwikkelaars waar de omgevingen zeer sterk zijn gericht op SOAP-interactie.

J.Ja

© Copyright 2020 | mobilegn.com