Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #5
0
        // 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;
            }
        }