public static SentenceSummary SummarizeAnswer(List <ReversedToken> reversedTokens) { var summary = new SentenceSummary() { Phrase = reversedTokens, Names = TextAnalysisUtils.FindNames(reversedTokens), Type = SentenceType.Answer, KeyWords = new List <string>() .AddIfNotNull(reversedTokens.Where(x => x.OriginalToken.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.X).ToList()), Answer = new Answer() { HasAffirmation = reversedTokens.Any(x => Constants.AffirmativeAnswerWords.CaseInsensitiveContains(TextAnalysisUtils.GetTokenText(x))), Numbers = TextAnalysisUtils.FindNumbers(reversedTokens), } }; return(summary); }
public static List <SentenceSummary> AssignCityAnswer(SentenceSummary question, List <SentenceSummary> summaries) { var answer = summaries .Skip(question.Position + 1) .TakeWhile(x => !Constants.InitialWordsToIgnore.CaseInsensitiveContains(TextAnalysisUtils.GetTokenText(x.Phrase.First())) && x.Answer != null); var extras = new List <SentenceSummary>(); var fullAnswerText = answer.First().Phrase.GetPhraseText(); var lastCharPosition = fullAnswerText.Length - 1; var firstComma = fullAnswerText.IndexOf(','); var cityPart = answer.First().Phrase.TakeWhile(x => !TextAnalysisUtils.GetTokenText(x).CaseInsensitiveEquals(",")); var city = TextAnalysisUtils.FindNames(cityPart.ToList()).First(); var state = null as string; if (firstComma != -1) { state = fullAnswerText.Substring(firstComma + 1, lastCharPosition - firstComma - 1); } if (state != null) { extras.Add(new SentenceSummary() { KeyWords = new List <string>() { "state" }, CombinedAnswerText = state, Position = question.Position }); } question.CombinedAnswerText = city; if (!question.KeyWords.CaseInsensitiveContains("city")) { question.KeyWords.Add("city"); } return(extras); }
public static SentenceSummary SummarizeSpecialQuestion(List <ReversedToken> reverseTokens) { var root = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Root); var rootRedirection = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Prep && root.Relations.Any(rel => rel == x.OriginalToken)); var type = root.Relations.FirstOrDefault(x => x.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Verb || x.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Adv || x.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Det); var subject = reverseTokens.FirstOrDefault(x => x.OriginalToken.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Pron && x.Relations.Any(rel => rel == root.OriginalToken)); if (subject == null) { subject = reverseTokens.FirstOrDefault(x => x.OriginalToken.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Noun && root.Relations.Any(rel => rel == x.OriginalToken)); if (subject == null) { subject = root; } } else if (rootRedirection != null && subject.OriginalToken.PartOfSpeech.Tag == PartOfSpeech.Types.Tag.Pron) { subject = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Pobj && rootRedirection.Relations.Any(rel => rel == x.OriginalToken)); } var subjectSpecificationPointer = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Prep && subject.Relations.Any(rel => rel == x.OriginalToken)); ReversedToken subjectSpecification = null; if (subjectSpecificationPointer != null) { subjectSpecification = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Pobj && subjectSpecificationPointer.Relations.Any(rel => rel == x.OriginalToken)); } else { subjectSpecification = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Nn && subject.Relations.Any(rel => rel == x.OriginalToken)); } if (subjectSpecification == null) { subjectSpecification = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Amod && subject.Relations.Any(rel => rel == x.OriginalToken)); } var subjectOwner = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Poss && subject.Relations.Any(rel => rel == x.OriginalToken)); ReversedToken subjectSpecificationOwner = null; if (subjectSpecification != null) { subjectSpecificationOwner = reverseTokens.FirstOrDefault(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Nn && subjectSpecification.Relations.Any(rel => rel == x.OriginalToken)); } var ownerAlternatives = new List <ReversedToken>() { subjectOwner, subjectSpecificationOwner }; var ownerCanBeEitherAlternative = false; if (subjectOwner != null) { ownerAlternatives.AddRange(reverseTokens.Where(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Conj && subjectOwner.Relations.Any(rel => rel == x.OriginalToken))); if (ownerAlternatives.Any()) { ownerCanBeEitherAlternative = reverseTokens.Any(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Cc && x.OriginalToken.Text.Content.Equals("or", StringComparison.InvariantCultureIgnoreCase) && subjectOwner.Relations.Any(rel => rel == x.OriginalToken)); } } if (subjectSpecificationOwner != null) { ownerAlternatives.AddRange(reverseTokens.Where(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Conj && subjectSpecificationOwner.Relations.Any(rel => rel == x.OriginalToken))); if (ownerAlternatives.Any()) { ownerCanBeEitherAlternative = reverseTokens.Any(x => x.OriginalToken.DependencyEdge.Label == DependencyEdge.Types.Label.Cc && x.OriginalToken.Text.Content.Equals("or", StringComparison.InvariantCultureIgnoreCase) && subjectSpecificationOwner.Relations.Any(rel => rel == x.OriginalToken)); } } var alternativeModifierText = ownerAlternatives.Count > 1 ? (ownerCanBeEitherAlternative ? " any" : " all") : ""; var specialQuestion = new SpecialQuestion { Subject = subject, SubjectSpecification = subjectSpecification, ResponseOwnershipRestrictionAlternatives = ownerAlternatives, ResponseOwnershipRestrictionAnyAlternative = ownerCanBeEitherAlternative, }; return(new SentenceSummary { KeyWords = new List <string>() .AddIfNotNull(root) .AddIfNotNull(subject) .AddIfNotNull(subjectSpecification) .AddIfNotNull(ownerAlternatives), Phrase = reverseTokens, Names = TextAnalysisUtils.FindNames(reverseTokens), Type = SentenceType.SpecialQuestion, SpecialQuestion = specialQuestion }); }