OpenAmplify utviklerens dagbok - del tre: Sammenligning av emneintensjoner

I del to av denne serien diskuterte jeg sammenligning av forfatterinformasjonen ("Demographics" og "Style") som OpenAmplify-utdataene gir. I del tre skyter jeg etter et mye mer ambisiøst mål, "Emneintensjoner." Målet mitt er å kunne gi en tilnærming av hvor like de to dokumentene er når det gjelder hva de diskuterer og hvordan de diskuterer det.

Hvorfor vil jeg gjøre dette? Vel, søknaden min, Rat Catcher, gir meg det jeg kaller en "Semantic Match Score" (SM-score). SM-poengsum brukes til å vise alle likheter mellom innholdet i de to dokumentene. Fra min første testing er SM-poengsummen et flott supplement til den eksisterende prosentandelen som viser antall matchede "setninger" i dokumentene. Det som gjør SM-poengsum så nyttig for dette, er at det hjelper brukeren med å finne dokumenter som kan være en "kreativ omformulering" og som et resultat ikke vil ha en veldig høy setningsprosent.

I fremtiden planlegger jeg å ta SM-poengsummen mye lenger. Til å begynne med, vil jeg bruke en høy SM-poengsum for å utløse en "tesaurus-sammenligning" av dokumenter der individuelle setninger blir delt ned til stammeord. Derfra kan det opprettes varianter fra en tesaurus og hver variant så etter i måldokumentet. Unødvendig å si at dette vil være en beregningsmessig brutal øvelse, så hvis SM-poengsummen kan brukes til å filtrere ut dokumenter som er kvalifisert for denne behandlingen, vil jeg være mye lykkeligere.

Min logikk i denne metoden er å gjøre følgende:

  1. Opprett en "Emneintensjon" poengsum for "Toppemner" fra 0 til 100. ("0" betyr "ingen Toppemner fra originaldokumentet vises i sammenligningsdokumentet" og "100" indikerer "alle Toppemner i originalen vises i sammenligningsdokumentet) og samsvar med Polaritet, ber om veiledning og tilby veiledning. "
  2. Repliker denne logikken for ordentlige navn.
  3. Repliker denne logikken for Locations, men i stedet for å bruke en dyptgående sammenligning av Emneintensjon, må du bare sjekke om det eksisterer i hvert dokument.
  4. Kombiner de tre score til en sammensatt poengsum ved å legge dem sammen og dele med 3.
  5. Eventuelle feil resulterer i umiddelbar avslutning og et resultat av 0, av hensyn til hensiktsmessigheten.

For nå, la oss se på SM-poengsummen og hvordan den uttrykkes som en flottør, med et område fra 0 til 100 (0 er "ingen kamp" og 100 som betyr "perfekt match").

Her er metodedeklarasjonen min:

private float CompareOpenAmplifyContent (XDocument Original, XDocument CompareTo)

Koden for å utføre sammenligningen mellom Toppemnene og koden for Riktige Substantiv er identisk, annet enn XML-elementene det er referert til, så jeg skal bare vise hvordan jeg sammenligner Toppemner:

var topOriginalTopics =

fra emne i

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

( "TopTopics").

Elementer ()

velg emne;

var topCompareToTopics =

fra emne i

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

( "TopTopics").

Elementer ()

velg emne;

float topTopicsResult = 0;

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

{

foreach (var originalTopic in topOriginalTopics)

{

XElement sammenligneToTopisk = null;

foreach (var emne i topCompareToTopics)

{

if (topic.Element ("Emne"). Element ("Navn"). Verdi.ToLower (). Trim () == originalTopic.Element ("Emne"). Element ("Navn"). Verdi.ToLower () .Listverk())

{

sammenligneToTopisk = emne;

gå i stykker;

}

}

if (sammenligneToTopic == null)

{

Fortsette;

}

topTopicsResult + = CompareOpenAmplifyTopicIntentionResults

(originalTopic, sammenligneToTopic) *

(100 / topOriginalTopics.Count ());

}

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

}

if (topOriginalTopics.Count () == 0)

{

topTopicsResult = 100;

}

Jeg lager en liste over de viktigste emnene i hvert dokument. Deretter itererer jeg listen over originale Toppemner og søker etter noder i sammenligningen Toppemner med samme navn. Hvis de stemmer, bryter jeg ut av løkken. På slutten av løkken, hvis jeg finner noe (ved hjelp av noen negativ logikk; fortsetter jeg til neste iterasjon hvis ingenting ble funnet), beregner jeg emnet Intensjonsresultat (XML-noden som inneholder detaljene om et element innen emneintensjoner) likhet og del det med antall toppemner i originaldokumentet (så en 100% kamp vektes til antall emner) og legg den til gjeldende poengsum for toppemnene. Hvis det ikke var noen Toppemner (usannsynlig), gir jeg det en 100% kamp. Her er min kode for å sammenligne emnets intensjoner:

private float CompareOpenAmplifyTopicIntentionResultater (XElement Original, XElement CompareTo)

{

if (Original == null || CompareTo == null)

{

retur 0;

}

var matchedItems = 0;

if (Original.Element ("Polaritet"). Element ("Min"). Element ("Navn") == CompareTo.Element ("Polaritet"). Element ("Min"). Element ("Navn"))

{

matchedItems ++;

}

if (Original.Element ("Polaritet"). Element ("Gjennomsnitt"). Element ("Navn") == CompareTo.Element ("Polaritet"). Element ("Gjennomsnitt"). Element ("Navn"))

{

matchedItems ++;

}

if (Original.Element ("Polaritet"). Element ("Max"). Element ("Navn") == CompareTo.Element ("Polaritet"). Element ("Max"). Element ("Navn"))

{

matchedItems ++;

}

var polarityRating = (float) matchedItems / 3;

var offerGuidanceRating = 0;

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

{

offeringGuidanceRating ++;

}

var requestingGuidanceRating = 0;

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

{

requestingGuidanceRating ++;

}

var resultat = Math.Min (((polarityRating + offersGuidanceRating + requestingGuidanceRating) / 3), 1);

tilbake resultat;

}

Som du kan se, er det ingenting spesielt kompleks eller spennende med denne koden; det er bare å gjøre en rask og skitten sammenligning fra element til element mellom de to emnene om emneintensjon. Hvis du ser nøye, vil du se at Polaritetsvurderingen har tre komponenter for de tre polaritetsresultatene (Gjennomsnitt, Min og Maks). Jeg sparker tilbake resultatene som en verdi mellom 0 og 1.

Slik utfører du sammenligningen av steder:

var originalLokasjoner =

fra emne i

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

Element ( "Steder").

Elementer ()

velg emne;

var sammenligneToLokasjoner =

fra emne i

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

Element ( "Steder").

Elementer ()

velg emne;

float locationsResult = 0;

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

{

foreach (var originalTopic in originalProperNouns)

{

foreach (var emne i sammenligne lokasjoner)

{

if (topic.Element ("Resultat"). Element ("Navn"). Verdi.ToLower (). Trim () == originalTopic.Element ("Resultat"). Element ("Navn"). Verdi.ToLower () .Listverk())

{

locationsResult + = 100 / originalLocations.Count ();

gå i stykker;

}

}

}

}

if (originalLocations.Count () == 0)

{

lokasjonerResult = 100;

}

Igjen, det er ikke noe veldig sammensatt her. Jeg går bare igjennom og sjekker for å se hvor mange elementer i originaldokumentet som vises i sammenligningen.

I del fire vil jeg dykke ned i SOAP-grensesnittet til OpenAmplify, som vil være av spesiell interesse for Java- og .NET-utviklerne der miljøene er veldig sterkt rettet mot SOAP-interaksjon.

J.Ja

© Copyright 2021 | pepebotifarra.com