From: Martin F. <mar...@us...> - 2008-01-17 01:06:10
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/parser In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv27263/src/games/stendhal/server/entity/npc/parser Modified Files: Sentence.java Log Message: - when matching expressions types, use start string matching - implement isCompoundNoun() for better compound noun detection Index: Sentence.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/parser/Sentence.java,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** Sentence.java 14 Jan 2008 07:54:24 -0000 1.31 --- Sentence.java 17 Jan 2008 01:06:13 -0000 1.32 *************** *** 738,745 **** // loop until no more simplification can be made do { Iterator<Expression> it = expressions.iterator(); - boolean prevConditional = false; ! changed = false; if (it.hasNext()) { --- 738,747 ---- // loop until no more simplification can be made do { + changed = false; + Iterator<Expression> it = expressions.iterator(); ! boolean prevConditional = false; ! boolean precedingVerb = false; if (it.hasNext()) { *************** *** 773,782 **** if (curType != null && nextType != null) { ! // check the expression types for concrete subject or object names (no pronouns) ! boolean currIsName = curType.isObject() || (curType.isSubject() && !curType.isPronoun()); ! boolean nextIsName = nextType.isObject() || (nextType.isSubject() && !nextType.isPronoun()); ! ! // left-merge nouns with preceding adjectives and composite nouns ! if ((curType.isAdjective() || currIsName) && nextIsName) { // special case for "ice cream" -> "ice" if (curr.getNormalized().equals("ice") && next.getNormalized().equals("cream")) { --- 775,780 ---- if (curType != null && nextType != null) { ! // left-merge composite nouns and nouns with preceding adjectives or verbs ! if (isCompoundNoun(curType, nextType, precedingVerb)) { // special case for "ice cream" -> "ice" if (curr.getNormalized().equals("ice") && next.getNormalized().equals("cream")) { *************** *** 799,814 **** break; } ! // right-merge consecutive verbs, preserving only the main verb else if (curType.isVerb() && nextType.isVerb()) { - // handle "would like" if (prevConditional) { next.mergeLeft(curr, false); expressions.remove(curr); ! } else { ! curr.mergeRight(next, false); ! expressions.remove(next); ! } ! changed = true; ! break; } // right-merge consecutive words of all other same main types, --- 797,808 ---- break; } ! // left-merge "would like", preserving only the main verb else if (curType.isVerb() && nextType.isVerb()) { if (prevConditional) { next.mergeLeft(curr, false); expressions.remove(curr); ! changed = true; ! break; ! } } // right-merge consecutive words of all other same main types, *************** *** 838,841 **** --- 832,844 ---- break; } + + // manage precedingVerb flag to detect compound verb/noun constructs + if (curr.getBreakFlag()) { + precedingVerb = false; + } else if (curType.isVerb()) { + precedingVerb = true; + } else if (curType.isSubject()) { + precedingVerb = false; + } } } *************** *** 843,846 **** --- 846,885 ---- } + /** + * Decide if the given two expressions form a compound noun. + * + * @param curType + * @param nextType + * @param precedingVerb + * @return + */ + private static boolean isCompoundNoun(ExpressionType curType, ExpressionType nextType, boolean precedingVerb) { + // check the next expression type for concrete subject or object names (no pronouns) + boolean nextIsName = nextType.isObject() || (nextType.isSubject() && !nextType.isPronoun()); + + // left-merge composite nouns and nouns with preceding adjectives or verbs + if (nextIsName) { + // check the current expression type for concrete subject or object names (no pronouns) + boolean currIsName = curType.isObject() || (curType.isSubject() && !curType.isPronoun()); + + // handle compound words like "fire sword" + if (currIsName) { + return true; + } + + // handle compound words like "golden sword" + if (curType.isAdjective()) { + return true; + } + + // handle compound words like "summon scroll" + if (curType.isVerb() && precedingVerb) { + return true; + } + } + + return false; + } + private void mergeThreeWordExpressions(boolean isForMatching) { boolean changed; *************** *** 1060,1064 **** if (matchString.equals(JOKER)) { // Type string matching is identified by a single "*" as normalized string expression. ! if (!matchesJokerString(e1.getTypeString(), e2.getTypeString())) { return false; } --- 1099,1103 ---- if (matchString.equals(JOKER)) { // Type string matching is identified by a single "*" as normalized string expression. ! if (!matchesJokerString(e1.getTypeString(), e2.getTypeString()+"*")) { return false; } |