public void DependentAdPositions() { // The phrase: I read the book. AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I), EnglishPattern.Morpheme(EnglishAttributes.I)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A)) } }; // dependents for 'read' List <IAdTree> dependentAdPositions = adTree.Right.Right.DependentAdPositions.ToList(); Assert.AreEqual(2, dependentAdPositions.Count); Assert.IsTrue(adTree.Right == dependentAdPositions[0]); Assert.IsTrue(adTree == dependentAdPositions[1]); // dependents for 'book' dependentAdPositions = adTree.Left.Right.DependentAdPositions.ToList(); Assert.AreEqual(1, dependentAdPositions.Count); Assert.IsTrue(adTree.Left == dependentAdPositions[0]); }
public void IsGovernor() { // The phrase: I read the book. AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I), EnglishPattern.Morpheme(EnglishAttributes.I)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A)) } }; // 'read' is governor. Assert.IsTrue(adTree.Right.Right.IsGovernor); // 'book'-adposition is not the governor. Assert.IsFalse(adTree.Left.IsGovernor); // root is not the governor. Assert.IsFalse(adTree.IsGovernor); }
public void RulingGrammarCharacter() { // The phrase: I read the book. AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), EnglishPattern.O2_I) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), EnglishPattern.O1_I) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)) } }; // O2-I Assert.AreEqual(GrammarCharacter.I, adTree.RulingGrammarCharacter); // O: I Assert.AreEqual(GrammarCharacter.O, adTree.Right.Left.RulingGrammarCharacter); // O1-I Assert.AreEqual(GrammarCharacter.I, adTree.Right.RulingGrammarCharacter); // A-O Assert.AreEqual(GrammarCharacter.O, adTree.Left.RulingGrammarCharacter); }
public void RightChildren() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "I", 0), new Pattern()) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "the", 0), new Pattern()) } }; List <IAdTree> rightChildren = adTree.RightChildren.ToList(); Assert.AreEqual(2, rightChildren.Count); Assert.AreEqual(adTree.Right, rightChildren[0]); Assert.AreEqual(adTree.Right.Right, rightChildren[1]); rightChildren = adTree.Right.Right.RightChildren.ToList(); Assert.AreEqual(0, rightChildren.Count); }
public void Phrase() { // The phrase: I read the book. AdTree adTree = new AdTree(new Morpheme(myAttributesModel, ".", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, IsLeftFirst = true }) { Right = new AdTree(new Morpheme(myAttributesModel, "read", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "I", 0), new Pattern()) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern() { LeftRule = EnglishMorphemeRule.A_Lexeme, IsLeftFirst = true }) { Right = new AdTree(new Morpheme(myAttributesModel, "book", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "the", 0), new Pattern()) } } }; string phrase = adTree.Phrase; Assert.AreEqual("I read the book .", phrase); }
private ITerm TryGetPredicate() { ITerm result = null; var verb = AdTree.GetRightSequence().FirstOrDefault(x => AttributesModel.IsVerb(x.Morpheme.Attributes)); if (verb != null) { IAdTree predicateAdTree; var verbValencies = AttributesModel.GetNumberOfValencies(verb.Morpheme.Attributes); if (verbValencies > 0) { predicateAdTree = verb.GetSequenceToRoot() .First(x => x.AdPosition == null || AttributesModel.IsU(x.AdPosition.Morpheme.Attributes)) .MakeDeepCopy(); // Remove the subject (i.e. remove the sub-adtree on the first valency) var firstValency = predicateAdTree.GetRightSequence().FirstOrDefault(x => x.Pattern.ValencyPosition == 1); if (firstValency != null) { firstValency.Left = null; } } else { predicateAdTree = verb.MakeDeepCopy(); result = Factory.CreateTerm(verb, StructureAttributes.Term.Predicate); } result = Factory.CreateTerm(predicateAdTree, StructureAttributes.Term.Predicate); } return(result); }
public void GetFirstAdPositionOnLeft() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "I", 0), new Pattern()) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "the", 0), new Pattern()) } }; IAdTree result = adTree.Left.Right.GetFirstAdPositionOnLeft(); Assert.IsTrue(adTree.Left == result); // It is already on left. result = adTree.Right.Left.GetFirstAdPositionOnLeft(); Assert.IsTrue(adTree.Right.Left == result); // Root. result = adTree.GetFirstAdPositionOnLeft(); Assert.IsNull(result); }
public void CanAttachToRight_ValencyPosition() { // The phrase: I read AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O1_I) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }; // Try to connect the second valency position. AdTree valency2 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O2_I); Assert.IsTrue(valency2.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the first valency position. AdTree valency1 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I); Assert.IsFalse(valency1.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the third valency position. AdTree valency3 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O3_I); Assert.IsFalse(valency3.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the verb directly to the second valency. adTree = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent)); Assert.IsFalse(valency2.CanAttachToRight(adTree, myAttributesModel)); }
public void SubjectAndPredicate_with_circumstantial() { var adTree = new AdTree(new Morpheme(myAttributesModel, ".", EnglishAttributes.U.NonLexeme.PunctuationMark.Period), EnglishPattern.MorphematicAdPosition("I-U-I", "", EnglishAttributes.U.NonLexeme.PunctuationMark, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "in", EnglishAttributes.E.Lexeme.Preposition), EnglishPattern.MorphematicAdPosition("O-E-I", "", EnglishAttributes.E.Lexeme, EnglishAttributes.O.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O2_I) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O).SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A)) } }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O).SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "room", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)) } } }; var factory = new LinguisticStructureFactory(myAttributesModel); var clause = factory.CreateClause(adTree, 0); Assert.AreEqual("I", clause.Subject.Value); Assert.AreEqual("read the book in the room", clause.Predicate.Value); }
public void GetPath() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "I", 0), new Pattern()) }, Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "the", 0), new Pattern()) } }; AttachingPosition[] path = adTree.Right.Left.GetPath(); Assert.AreEqual(2, path.Length); Assert.AreEqual(AttachingPosition.ChildOnRight, path[0]); Assert.AreEqual(AttachingPosition.ChildOnLeft, path[1]); // Root path = adTree.GetPath(); Assert.AreEqual(0, path.Length); }
public void GetNonconformities_MorphemeRule() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)); List <IAdTree> nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(0, nonconformities.Count); // Empty string does not match the rule. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)); nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(1, nonconformities.Count); // Morpheme attributes does not match the rule. adTree = new AdTree(new Morpheme(myAttributesModel, "bla", EnglishAttributes.A.NonLexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)); nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(1, nonconformities.Count); // Attached right children violates the rule. adTree = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)) { // Note: the rule is nothing so having this attached violates the rule. Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) }; nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(1, nonconformities.Count); }
private IEnumerable <IClause> TryFindClauses() { var possibleClauses = AdTree.GetAdTreesInAdTreeOrder().Where(x => AttributesModel.IsU(x.Morpheme.Attributes)); // If U grammar character is present then there can be multiple clauses. if (possibleClauses.Any()) { foreach (var possibleClause in possibleClauses) { var isClauseOnRight = Clause.IsClause(possibleClause.Right, AttributesModel); if (isClauseOnRight) { var clauseAdTree = possibleClause.Right.MakeDeepCopy(); var clause = Factory.CreateClause(clauseAdTree, 0); yield return(clause); } var isClauseOnLeft = Clause.IsClause(possibleClause.Left, AttributesModel); if (isClauseOnLeft) { var clauseAdTree = possibleClause.Left.MakeDeepCopy(); var clause = Factory.CreateClause(clauseAdTree, 0); yield return(clause); } } } else { if (Clause.IsClause(AdTree, AttributesModel)) { var clause = Factory.CreateClause(AdTree, StructureAttributes.Sentence.SimpleSentence); yield return(clause); } } }
public void Clauses_ComplexSentence() { var adTree = new AdTree(new Morpheme(myAttributesModel, ".", EnglishAttributes.U.NonLexeme.PunctuationMark), EnglishPattern.MorphematicAdPosition(".", "", EnglishAttributes.U.NonLexeme.PunctuationMark, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "and", EnglishAttributes.U.Lexeme.Conjunction.Coordinating), EnglishPattern.MorphematicAdPosition("I-U-I", "", EnglishAttributes.U.Lexeme.Conjunction.Coordinating, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "learn", EnglishAttributes.I.Lexeme.Verb), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) } } }; var factory = new LinguisticStructureFactory(myAttributesModel); var sentence = factory.CreateSentence(adTree, 0); var clauses = sentence.Clauses.ToList(); Assert.AreEqual(2, clauses.Count); Assert.AreEqual("I read", clauses[0].Value); Assert.AreEqual("I learn", clauses[1].Value); }
public void CanAttachToLeft_Substitution_Morphemic() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("O-A", "", EnglishAttributes.O.Lexeme, EnglishAttributes.A.Lexeme).SetLeftFirst()) }; IAdTree adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.Left.CanAttachToLeft(adTreeElement, myAttributesModel)); // The morpheme is not attached to the right yet - so only rules are evaluated. adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.Left.CanAttachToLeft(adTreeElement, myAttributesModel)); // Attach to the left on the root. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme).SetLeftFirst()); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Attach to the left on the root - incorrect morpheme. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void Detach() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "A1", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "A11", 0), new Pattern()), }; adTree.Right.Detach(); Assert.IsTrue(adTree.Right == null); }
public void IsComplete() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.IsComplete()); // Missing morph. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.IsComplete()); // Missing attributes. adTree = new AdTree(new Morpheme(myAttributesModel, "book", 0), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = null, Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsTrue(adTree.IsComplete()); // Right is missing. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = null, Right = null, }; Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsTrue(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = null, Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), Right = null, }; Assert.IsFalse(adTree.IsComplete()); }
public void IsAdPosition() { // The phrase: I read the book. AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsTrue(adTree.IsAdPosition); Assert.IsFalse(adTree.Right.IsAdPosition); Assert.IsFalse(adTree.Left.IsAdPosition); }
public void Phrase_Suffix() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.O.Lexeme), EnglishPattern.PairTransference("I>O_ing", "", EnglishAttributes.O.Lexeme, EnglishAttributes.I.NonLexeme.Suffix, EnglishAttributes.I.Lexeme.Verb)) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme.Verb)), Left = new AdTree(new Morpheme(myAttributesModel, "ing", EnglishAttributes.I.NonLexeme.Suffix), EnglishPattern.Morpheme(EnglishAttributes.I.NonLexeme.Suffix)), }; string phrase = adTree.Phrase; Assert.AreEqual("reading", phrase); }
public void AdPosition_IncorrectParent_Exception() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) }; AdTree adTree2 = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); // The adTree2 does not references the adTree.RightChild.RightChild therefore it shall throw the exception. Assert.Throws <InvalidOperationException>(() => adTree.AdPosition = adTree2); // Also it shall not be possible to assign null. Assert.Throws <InvalidOperationException>(() => adTree.Left.AdPosition = null); }
public void CanAttachToLeft() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); IAdTree adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Primitive transference. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.A_Lexeme, } ); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }) }; Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.A_Lexeme }); Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void MakeShallowCopy() { // The phrase: I read the book. IAdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), new Pattern()) }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.U), new Pattern()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O.Lexeme), new Pattern()), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A.Lexeme), new Pattern()) } }; // Note: the copy does not start from the root but the whole tree will be copied. IAdTree copy = adTree.Right.MakeShallowCopy(); // The copy must be set to the same position as the original. Assert.IsTrue(adTree.Right.Morpheme == copy.Morpheme); Assert.IsTrue(adTree.Right.Pattern == copy.Pattern); // Get the root - for easier testing. adTree = adTree.Root; copy = copy.Root; Assert.IsTrue(adTree.Morpheme == copy.Morpheme); Assert.IsTrue(adTree.Pattern == copy.Pattern); Assert.IsTrue(adTree.Right.Morpheme == copy.Right.Morpheme); Assert.IsTrue(adTree.Right.Pattern == copy.Right.Pattern); Assert.IsTrue(adTree.Right.Right.Morpheme == copy.Right.Right.Morpheme); Assert.IsTrue(adTree.Right.Right.Pattern == copy.Right.Right.Pattern); Assert.IsTrue(adTree.Right.Left.Morpheme == copy.Right.Left.Morpheme); Assert.IsTrue(adTree.Right.Left.Pattern == copy.Right.Left.Pattern); Assert.IsTrue(adTree.Left.Morpheme == copy.Left.Morpheme); Assert.IsTrue(adTree.Left.Pattern == copy.Left.Pattern); Assert.IsTrue(adTree.Left.Right.Morpheme == copy.Left.Right.Morpheme); Assert.IsTrue(adTree.Left.Right.Pattern == copy.Left.Right.Pattern); Assert.IsTrue(adTree.Left.Left.Morpheme == copy.Left.Left.Morpheme); Assert.IsTrue(adTree.Left.Left.Pattern == copy.Left.Left.Pattern); }
public void GetNonconformities_MonoTransference() { AdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "race", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = null, }, }; List <IAdTree> nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(0, nonconformities.Count); }
public void Words() { var adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.I)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O)), }; var factory = new LinguisticStructureFactory(myAttributesModel); var term = factory.CreateTerm(adTree, 0); var words = term.Words.ToList(); Assert.AreEqual(2, words.Count); Assert.AreEqual("I", words[0].Value); Assert.AreEqual("read", words[1].Value); }
public void Attach() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); AdTree toAppend = new AdTree(new Morpheme(myAttributesModel, "hello", 0), new Pattern()); adTree.Attach(toAppend, AttachingPosition.ChildOnLeft); Assert.AreEqual("hello", adTree.Left.Morpheme.Morph); Assert.IsNull(adTree.Right); adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); toAppend = new AdTree(new Morpheme(myAttributesModel, "hello", 0), new Pattern()); adTree.Attach(toAppend, AttachingPosition.ChildOnRight); Assert.AreEqual("hello", adTree.Right.Morpheme.Morph); Assert.IsTrue(adTree.Left == null); }
public void CanAttachToLeft_MorphemicAdPosition() { IAdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.U.Lexeme.Conjunction), EnglishPattern.MorphematicAdPosition("O-U-O", "", EnglishAttributes.U.Lexeme.Conjunction, EnglishAttributes.O.Lexeme, EnglishAttributes.O.Lexeme).SetLeftFirst() ); IAdTree adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); adTree = new AdTree(new Morpheme(myAttributesModel, "and", EnglishAttributes.U.Lexeme.Conjunction), EnglishPattern.MorphematicAdPosition("O-U-O", "", EnglishAttributes.U.Lexeme.Conjunction, EnglishAttributes.O.Lexeme, EnglishAttributes.O.Lexeme) ) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }) }; adTreeElement = new AdTree(new Morpheme(myAttributesModel, "bike", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Note: the adposition morpheme is not set therefore it should not be allowsed to attach the second child. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.U.Lexeme.Conjunction), EnglishPattern.MorphematicAdPosition("O-U-O", "", EnglishAttributes.U.Lexeme.Conjunction, EnglishAttributes.O.Lexeme, EnglishAttributes.O.Lexeme) ) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }) }; adTreeElement = new AdTree(new Morpheme(myAttributesModel, "bike", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }); Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void CanAttachToLeft_Substitution() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); IAdTree adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { UpRule = MorphemeRule.Epsilon, LeftRule = EnglishMorphemeRule.A_Lexeme, RightRule = EnglishMorphemeRule.O_Lexeme }) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.Is(MorphRules.Something, EnglishAttributes.O.Lexeme) }), }; Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Substitution is not allowed. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, }.SetSubstitutionForLeft(SubstitutionRules.Nothing) ); adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { UpRule = MorphemeRule.Epsilon, LeftRule = EnglishMorphemeRule.A_Lexeme, RightRule = EnglishMorphemeRule.O_Lexeme }) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.Is(MorphRules.Something, EnglishAttributes.O.Lexeme) }), }; Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void Clauses_SimpleSentence() { var adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb), EnglishPattern.Morpheme(EnglishAttributes.I)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O)), }; var factory = new LinguisticStructureFactory(myAttributesModel); var sentence = factory.CreateSentence(adTree, 0); var clauses = sentence.Clauses.ToList(); Assert.AreEqual(1, clauses.Count); Assert.AreEqual("I read", clauses[0].Value); Assert.AreEqual("I read", sentence.Value); }
public void LeftChild() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); Assert.IsNull(adTree.Left); AdTree leftChild = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); // Attach dependent. adTree.Left = leftChild; Assert.AreEqual(leftChild, adTree.Left); Assert.AreEqual(adTree, leftChild.AdPosition); // Detach the dependent. adTree.Left = null; Assert.IsNull(adTree.Left); Assert.IsNull(leftChild.AdPosition); }
public void GetSignature() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O2_I) { Right = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I), EnglishPattern.Morpheme(EnglishAttributes.I)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)), }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.EpsilonAdPosition("", "", EnglishAttributes.A, EnglishAttributes.O).SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A)) } }; Assert.AreEqual("OIAO", adTree.GetSignature()); }
public void RightChild() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); Assert.IsNull(adTree.Right); AdTree rightChild = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()); // Attach the governor. adTree.Right = rightChild; Assert.AreEqual(rightChild, adTree.Right); Assert.AreEqual(adTree, rightChild.AdPosition); // Detach the governor. adTree.Right = null; Assert.IsNull(adTree.Right); Assert.IsNull(rightChild.AdPosition); }