public GenderAttribute GuessGender(InformedPhrase word, IWordLookup informer) { List <string> parts = word.Generate(); string part = parts[0]; ProbableStrength given = IsGivenName(informer, part); if (given.strength < .25 && given.weight > 0.75) { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Neuter); attr.Strength = given.InverseProbability(); return(attr); } ProbableStrength female = IsFemaleName(part); if (female.strength > 0.5) { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Female); attr.Strength = (new ProbableStrength(2.0 * (female.strength - 0.5), female.weight)).Relative(given); return(attr); } else if (female.strength < 0.5 && female.weight > 0.25) { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Male); attr.Strength = (new ProbableStrength(2.0 * (0.5 - female.strength), female.weight)).Relative(given); return(attr); } else { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Human); attr.Strength = given; return(attr); } }
public GenderAttribute MergeGenderAttributes(GenderAttribute byname, GenderAttribute bypart) { if (byname.Gender == GenderAttribute.GenderOptions.Neuter && bypart.Gender == GenderAttribute.GenderOptions.Neuter) { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Neuter); attr.Strength = byname.Strength.Combine(bypart.Strength); return(attr); } // Human likelihood ProbableStrength human = byname.Match(GenderAttribute.IsHuman).Combine(bypart.Match(GenderAttribute.IsHuman)); if (human.strength > 0.5) { if (byname.Gender == GenderAttribute.GenderOptions.Neuter) { // we don't have male/female info bypart.Strength = human; return(bypart); } else { // use male/female info or just human byname.Strength = human; return(byname); } } else { GenderAttribute attr = new GenderAttribute(GenderAttribute.GenderOptions.Neuter); attr.Strength = human.InverseProbability(); return(attr); } }
public override PhraseAttribute Guess(InformedPhrase word) { List <KeyValuePair <SpeechPart, double> > kvparts = word.SpeechParts(); if (kvparts.Count != 1) { GenderAttribute attr = new GenderAttribute(GenderOptions.Neuter); attr.strength = new ProbableStrength(0.0, 0.0); // we don't know anything return(attr); } // If it's a proper noun, we guess it might be a human SpeechPart part = kvparts[0].Key; if (part == SpeechPart.ProperNoun) { GenderAttribute attr = new GenderAttribute(GenderOptions.Human); attr.strength = new ProbableStrength(1.0, 0.5); return(attr); } else { GenderAttribute attr = new GenderAttribute(GenderOptions.Neuter); attr.strength = new ProbableStrength(1.0, 0.1); return(attr); } }
// Does this attribute conform to ours? public override ProbableStrength IsMatch(PhraseAttribute attribute) { if (attribute is GenderAttribute) { // It's a gender attribute-- it might! GenderAttribute genderAttribute = (GenderAttribute)attribute; if (genderAttribute.gender == gender) { return(ProbableStrength.Full); // perfect match } else if (gender == GenderOptions.OneOfUs || genderAttribute.gender == GenderOptions.OneOfUs) { return(ProbableStrength.Zero); // nothing matches us! (for now) } else if ((genderAttribute.gender == GenderOptions.Male && gender == GenderOptions.Female) || (genderAttribute.gender == GenderOptions.Female && gender == GenderOptions.Male)) { return(ProbableStrength.Zero); // male != female } else if ((genderAttribute.gender == GenderOptions.Human && (gender == GenderOptions.Male || gender == GenderOptions.Female)) || (gender == GenderOptions.Human && (genderAttribute.gender == GenderOptions.Male || genderAttribute.gender == GenderOptions.Female))) { return(ProbableStrength.Full); // human matches male or female } else if ((genderAttribute.gender == GenderOptions.Human && gender == GenderOptions.Neuter) || (gender == GenderOptions.Human && genderAttribute.gender == GenderOptions.Neuter)) { return(ProbableStrength.Zero); // human doesn't match neuter } else { // one or the other is neuter return(ProbableStrength.Half); // neuter attribute is applied only as a suggestion } } return(ProbableStrength.None); }
// Given a noun phrase sense public void GenderInform(PhraseSense sense, IWordLookup informer) { // Drill down to the first noun word, looking for a current attribute PhraseSense first = sense; GenderAttribute bypart = (GenderAttribute)first.FindAttribute(typeof(GenderAttribute)); while (bypart == null) { // Find a noun sub-phrase PhraseSense next = null; foreach (InformedPhrase subfirst in first.Phrases) { foreach (KeyValuePair <PhraseSense, double> firstsense in subfirst.Senses) { if (nounparts.Contains(firstsense.Key.SpeechPart())) { next = firstsense.Key; break; } } if (next != null) { break; } } if (next == null) { break; } bypart = (GenderAttribute)next.FindAttribute(typeof(GenderAttribute)); if (next.Phrases.Count == 0) { break; } first = next; } if (first.SpeechPart() != SpeechPart.ProperNoun) { if (bypart != null && bypart.Strength.weight > 0.5) { return; // we seem to know! } List <string> words; if (first.Phrases.Count > 0) { words = first.Phrases[0].Generate(); } else { words = new List <string>(); words.Add(first.Name()); } if (informer.GetWeight(words[0], false) < 0.5) { return; // not worth the lookup } if (bypart == null) { GenderAttribute dummy = new GenderAttribute(); bypart = (GenderAttribute)dummy.Guess(sense.Phrases[0]); } } // Now guess using the given name InformedPhrase tocheck; if (first.Phrases.Count > 0) { tocheck = first.Phrases[0]; } else { List <KeyValuePair <PhraseSense, double> > senses = new List <KeyValuePair <PhraseSense, double> >(); senses.Add(new KeyValuePair <PhraseSense, double>(first, 1.0)); tocheck = new InformedPhrase(sense.Name(), senses); } GenderAttribute gender = GuessGender(tocheck, informer); if (bypart != null) { gender = MergeGenderAttributes(gender, bypart); } // Update relevant gender attributes sense.AddOrUpdateAttribute(gender); if (sense != first) { first.AddOrUpdateAttribute(gender); } }
public override PhraseAttribute Guess(InformedPhrase word) { List<KeyValuePair<SpeechPart, double>> kvparts = word.SpeechParts(); if (kvparts.Count != 1) { GenderAttribute attr = new GenderAttribute(GenderOptions.Neuter); attr.strength = new ProbableStrength(0.0, 0.0); // we don't know anything return attr; } // If it's a proper noun, we guess it might be a human SpeechPart part = kvparts[0].Key; if (part == SpeechPart.ProperNoun) { GenderAttribute attr = new GenderAttribute(GenderOptions.Human); attr.strength = new ProbableStrength(1.0, 0.5); return attr; } else { GenderAttribute attr = new GenderAttribute(GenderOptions.Neuter); attr.strength = new ProbableStrength(1.0, 0.1); return attr; } }