Package com.clearnlp.generation

Source Code of com.clearnlp.generation.LGAsk

/**
* Copyright (c) 2009/09-2012/08, Regents of the University of Colorado
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
*    list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
*    this list of conditions and the following disclaimer in the documentation
*    and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* Copyright 2012/09-2013/04, 2013/11-Present, University of Massachusetts Amherst
* Copyright 2013/05-2013/10, IPSoft Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.clearnlp.generation;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipFile;

import com.clearnlp.constant.english.ENAux;
import com.clearnlp.constant.english.ENModal;
import com.clearnlp.constant.english.ENPronoun;
import com.clearnlp.constant.universal.UNConstant;
import com.clearnlp.constant.universal.UNPunct;
import com.clearnlp.constituent.CTLibEn;
import com.clearnlp.dependency.DEPArc;
import com.clearnlp.dependency.DEPFeat;
import com.clearnlp.dependency.DEPLib;
import com.clearnlp.dependency.DEPLibEn;
import com.clearnlp.dependency.DEPNode;
import com.clearnlp.dependency.DEPTree;
import com.clearnlp.dependency.srl.SRLLib;
import com.clearnlp.morphology.MPLibEn;
import com.google.common.collect.Lists;

/**
* Used for Eliza.
* @since 1.4.0
* @author Jinho D. Choi ({@code jdchoi77@gmail.com})
*/
public class LGAsk
{
  private final String USER        = "user";
  private final String PLEASE        = "please";
  private final String NON_FINITE    = "non-finite";
  private final String WH_NON_FINITE  = "wh-non-finite";
 
  private LGVerbEn g_verb;
 
  public LGAsk()
  {
    g_verb = new LGVerbEn();
  }
 
  public LGAsk(ZipFile file)
  {
    g_verb = new LGVerbEn(file);
  }
 
  /** Generates a declarative sentence with "ask" from a question. */
  public DEPTree generateAskFromQuestion(DEPTree tree)
  {
    tree = tree.clone();
    tree.setDependents();
   
    DEPNode root = tree.getFirstRoot();
    return (root == null) ? null : generateAskFromQuestionAux(tree, root);
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private DEPTree generateAskFromQuestionAux(DEPTree tree, DEPNode verb)
  {
    LGLibEn.convertFirstFormToLowerCase(tree);
    DEPNode ref = getReferentArgument(verb);
   
    if (ref == null || !ref.isLabel(DEPLibEn.P_SBJ))
      relocateAuxiliary(tree, verb);
   
    addPrefix(tree, verb, ref);
    convertYouToUser(tree, verb);
    addPeriod(tree, verb);
   
    tree.resetIDs();
    tree.resetDependents();
    normalizeBe(tree);
   
    return tree;
  }
 
  private void normalizeBe(DEPTree tree)
  {
    int i, size = tree.size();
    DEPNode node;
   
    for (i=1; i<size; i++)
    {
      node = tree.get(i);
      if (node.isLemma("be"))
      {
             if (node.isForm("'s"))    node.form = "is";
        else if (node.isForm("'re"))  node.form = "are";
      }
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private DEPNode getReferentArgument(DEPNode verb)
  {
    DEPNode dep;
   
    for (DEPArc arc : verb.getDependents())
    {
      dep = arc.getNode();
     
      if (dep.containsSHead(verb, SRLLib.P_ARG_REF))
        return dep;
    }
   
    return null;
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void relocateAuxiliary(DEPTree tree, DEPNode verb)
  {
    List<DEPNode> auxes = new ArrayList<DEPNode>();
    DEPNode sbj = null;

    for (DEPArc arc : verb.getDependents())
    {
      if (arc.isLabel(DEPLibEn.P_AUX))
        auxes.add(arc.getNode());
      else if (arc.isLabel(DEPLibEn.P_SBJ))
        sbj = arc.getNode();
    }
   
    if (sbj != null)
    {
      if (!auxes.isEmpty() && auxes.get(0).id < sbj.id)
      {
        relocateAuxiliaryAux(tree, verb, auxes, sbj);
      }
      else if (verb.isLemma(ENAux.BE) && verb.id < sbj.id)
      {
        tree.remove(verb);
        tree.add(sbj.getLastNode().id, verb);
        setBeVerbForm(verb, sbj);
      }
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void relocateAuxiliaryAux(DEPTree tree, DEPNode verb, List<DEPNode> auxes, DEPNode sbj)
  {
    DEPNode aux = auxes.get(0);
    tree.remove(aux);
   
    if (aux.isLemma(ENAux.DO))
    {
      if (auxes.size() > 1)
      {
        DEPNode node = auxes.get(1);
       
        if (MPLibEn.isVerb(node.pos))
          verb = node;
      }
     
      verb.pos = aux.pos;
     
      if (aux.isPos(CTLibEn.POS_VBD))
        verb.form = g_verb.getPastForm(verb.lemma);
      else if (aux.isPos(CTLibEn.POS_VBZ))
        verb.form = LGVerbEn.get3rdSingularForm(verb.lemma);
      else if (aux.isPos(CTLibEn.POS_VBP) && sbj.isLemma(ENPronoun.YOU))
      {
        verb.form = LGVerbEn.get3rdSingularForm(verb.lemma);
        verb.pos  = CTLibEn.POS_VBZ;
      }
    }
    else
    {
      tree.add(sbj.getLastNode().id, aux);
     
      if (aux.isLemma(ENAux.BE))
        setBeVerbForm(aux, sbj);
      else if (aux.isLemma(ENAux.HAVE))
        set3rdSingularVerbForm(aux, sbj);
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void setBeVerbForm(DEPNode verb, DEPNode sbj)
  {
    if (sbj.isLemma(ENPronoun.YOU))
    {
      if (verb.isPos(CTLibEn.POS_VBD))
        verb.form = ENAux.WAS;
      else if (verb.isPos(CTLibEn.POS_VBP))
      {
        verb.form = ENAux.IS;
        verb.pos  = CTLibEn.POS_VBZ;
      }
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void set3rdSingularVerbForm(DEPNode verb, DEPNode sbj)
  {
    if (sbj.isLemma(ENPronoun.YOU))
    {
      if (verb.isPos(CTLibEn.POS_VBP))
      {
        verb.form = LGVerbEn.get3rdSingularForm(verb.lemma);
        verb.pos  = CTLibEn.POS_VBZ;
      }
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void addPrefix(DEPTree tree, DEPNode verb, DEPNode ref)
  {
    DEPNode ask = getNode(tree.get(0), "Ask", "ask", CTLibEn.POS_VB, DEPLibEn.DEP_ROOT, null);
    verb.setHead(ask, DEPLibEn.DEP_CCOMP);
    tree.add(1, ask);
   
    if (ref == null && !DEPLibEn.containsRelativizer(verb))
    {
      DEPNode complm = getNode(verb, "whether", "whether", CTLibEn.POS_IN, DEPLibEn.DEP_COMPLM, null);
      tree.add(2, complm);     
    }
  }
 
  /** {@link LGAsk#generateAskFromQuestion(DEPTree, String)}. */
  private void convertYouToUser(DEPTree tree, DEPNode head)
  {
    if (head.isLemma(ENPronoun.YOU) || head.isLemma(ENPronoun.YOURSELF))
    {
      head.form = head.lemma = USER;
      head.pos  = CTLibEn.POS_NN;
      matchUserVerb(head);
      tree.add(tree.indexOf(head), getNode(head, UNConstant.THE, UNConstant.THE, CTLibEn.POS_DT, DEPLibEn.DEP_DET, null));
    }
    else if (head.isLemma(ENPronoun.YOUR) || head.isLemma(ENPronoun.YOURS))
    {
      int idx = tree.indexOf(head);
     
      head.form = head.lemma = USER;
      head.pos  = CTLibEn.POS_NN;
     
      tree.add(idx  , getNode(head, UNConstant.THE, UNConstant.THE, CTLibEn.POS_DT, DEPLibEn.DEP_DET, null));
      tree.add(idx+2, getNode(head, UNConstant.APOSTROPHE_S, UNConstant.APOSTROPHE_S, CTLibEn.POS_POS, DEPLibEn.DEP_POSSESSIVE, null));
    }
   
    for (DEPArc arc : head.getDependents())
      convertYouToUser(tree, arc.getNode());
  }
 
  private void matchUserVerb(DEPNode node)
  {
    if (node.isLabel(DEPLibEn.P_SBJ))
    {
      DEPNode verb = node.getHead();
     
      if (verb != null && MPLibEn.isVerb(verb.pos))
      {
        DEPNode aux = verb.getFirstDependentByLabel(DEPLibEn.P_AUX);
       
        if (aux != nullto3rdNumber(aux);
        else        to3rdNumber(verb);
      }
    }
  }
 
  private void to3rdNumber(DEPNode verb)
  {
    if (verb.isPosAny(CTLibEn.POS_VB, CTLibEn.POS_VBP, CTLibEn.POS_VBZ))
    {
      verb.form = LGVerbEn.get3rdSingularForm(verb.lemma);
      verb.pos  = CTLibEn.POS_VBZ;
    }
  }
 
  private void addPeriod(DEPTree tree, DEPNode root)
  {
    DEPNode last = tree.get(tree.size()-1);
   
    if (last.isPos(CTLibEn.POS_PERIOD))
      last.form = last.lemma = UNPunct.PERIOD;
    else
      tree.add(getNode(root, UNPunct.PERIOD, UNPunct.PERIOD, CTLibEn.POS_PERIOD, DEPLibEn.DEP_PUNCT, null));
  }
 
//  private boolean hasRelativizer(DEPTree tree, DEPNode verb)
//  {
//    int i, size = tree.size();
//    DEPNode node;
//   
//    for (i=1; i<size; i++)
//    {
//      node = tree.get(i);
//     
//      if (node == verb)
//        break;
//     
//      if (node.containsSHead(SRLLib.P_ARG_REF))
//        return true;
//    }
//   
//    return false;
//  }
 
  /** Generates a question from a declarative sentence with "ask". */
  public DEPTree generateQuestionFromAsk(DEPTree tree)
  {
    tree = tree.clone();
    tree.setDependents();
   
    DEPNode root = tree.getFirstRoot();
    if (root == null) return null;
    DEPNode dep, dobj = null;
   
    for (DEPArc arc : root.getDependents())
    {
      dep = arc.getNode();
     
      if (MPLibEn.isVerb(dep.pos))
        return generateQuestion(dep, getPrevDependents(tree, root, dep));
      else if (dep.isLabel(DEPLibEn.DEP_DOBJ))
        dobj = dep;
    }
   
    if (dobj != null && (dep = dobj.getFirstDependentByLabel(DEPLibEn.DEP_CCOMP)) != null)
      return generateQuestion(dep, null);
   
    return null;
  }
 
  private List<DEPNode> getPrevDependents(DEPTree tree, DEPNode root, DEPNode verb)
  {
    List<DEPNode> list = Lists.newArrayList();
    int i, size = root.id;
    DEPNode node;
   
    for (i=1; i<size; i++)
    {
      node = tree.get(i);
     
      if (node.isDependentOf(root))
      {
        node.setHead(verb);
        list.addAll(node.getSubNodeSortedList());       
      }
    }
   
    return list;
  }
 
  /** Generates a question from a declarative sentence. */
  public DEPTree generateQuestionFromDeclarative(DEPTree tree, boolean convertUnI)
  {
    tree = tree.clone();
    tree.setDependents();
   
    LGLibEn.convertFirstFormToLowerCase(tree);
    if (convertUnILGLibEn.convertUnI(tree);
   
    DEPNode root = tree.getFirstRoot();
    if (root == nullreturn null;
   
    return generateQuestion(root, getPrevDependents(tree, root));
  }
 
  private List<DEPNode> getPrevDependents(DEPTree tree, DEPNode verb)
  {
    List<DEPNode> list = Lists.newArrayList();
    int i, bIdx = -1;
    DEPNode node;
       
    for (i=verb.id-1; i>0; i--)
    {
      node = tree.get(i);
     
      if (DEPLibEn.getRefDependentNode(node) != null)
      {
        bIdx = node.getSubNodeSortedList().get(0).id;
        break;
      }
    }
   
    for (i=1; i<bIdx; i++)
      list.add(tree.get(i));
   
    return list;
  }
 
  /** Generates a question from a declarative sentence. */
  public DEPTree generateQuestionFromDeclarative(DEPNode root, boolean convertUnI)
  {
    DEPTree tree = new DEPTree();
   
    for (DEPNode node : root.getSubNodeSortedList())
      tree.add(node);
   
    return generateQuestionFromDeclarative(tree, convertUnI);
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  public DEPTree generateQuestion(DEPNode verb, List<DEPNode> prevNodes)
  {
    Set<DEPNode> added = new HashSet<DEPNode>();
    DEPTree tree = new DEPTree();
    DEPNode rel, aux;
   
    if (prevNodes != null)
    {
      tree.addAll(prevNodes);
      added.addAll(prevNodes);
    }
   
    verb.setHead(tree.get(0), DEPLibEn.DEP_ROOT);
    rel = setRelativizer(tree, verb, added);
   
    aux = setAuxiliary(tree, verb, added, rel);
    setRest(tree, verb, added);
    resetDEPTree(tree, verb);
    if (aux != null) matchNumber(verb, aux);
   
    return tree;
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private DEPNode setRelativizer(DEPTree tree, DEPNode verb, Set<DEPNode> added)
  {
    DEPNode dep, rel, head;
   
    for (DEPArc arc : verb.getDependents())
    {
      dep = arc.getNode();
      rel = DEPLibEn.getRefDependentNode(dep);
     
      if (rel != null)
      {
        if (verb.id < rel.id)
        {
          head = rel.getHead();
         
          while (head != verb && !head.isPos(CTLibEn.POS_IN) && !MPLibEn.isVerb(head.pos))
          {
            rel  = head;
            head = head.getHead();
          }
        }
        else
        {
          head = rel.getHead();
         
          while (head != verb && head.id < verb.id)
          {
            rel  = head;
            head = head.getHead();
          }
        }
       
        addSubtree(tree, rel, added);
        return rel;
      }
    }
   
    return null;
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private DEPNode setAuxiliary(DEPTree tree, DEPNode verb, Set<DEPNode> added, DEPNode rel)
  {
    if (!verb.isLabel(DEPLibEn.DEP_XCOMP) && verb.getFirstDependentByLabel(DEPLibEn.P_SBJ) == null)
      return null;
   
    if (rel != null && DEPLibEn.P_SBJ.matcher(rel.getLabel()).find())
      return null;

    DEPNode dep;
   
    for (DEPArc arc : verb.getDependents())
    {
      dep = arc.getNode();
     
      if (arc.isLabel(DEPLibEn.P_AUX) && !dep.isPos(CTLibEn.POS_TO))
      {
        if (dep.isLemma(ENAux.GET))
          return addDoAuxiliary(tree, dep, verb);
        else
        {
          addSubtree(tree, dep, added);
          return dep;
        }
      }
    }

    if (verb.isLabel(DEPLibEn.DEP_XCOMP))
    {
      toNonFinite(verb);
     
      if (rel != null)
      {
        dep = getNode(verb, ENModal.SHOULD, ENModal.SHOULD, CTLibEn.POS_MD, DEPLibEn.DEP_AUX, SRLLib.ARGM_MOD);
        tree.add(dep);
        tree.add(getNode(verb, ENPronoun.I, ENPronoun.I, CTLibEn.POS_PRP, DEPLibEn.DEP_NSUBJ, SRLLib.ARG0));
        verb.addFeat(DEPLib.FEAT_VERB_TYPE, WH_NON_FINITE);
        return dep;
      }
      else
      {
        verb.addFeat(DEPLib.FEAT_VERB_TYPE, NON_FINITE);
        return null;
      }
    }
     
    if (verb.isLemma(ENAux.BE))
    {
      tree .add(verb);
      added.add(verb);
      return verb;
    }
    else
      return addDoAuxiliary(tree, verb, verb);
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private DEPNode addDoAuxiliary(DEPTree tree, DEPNode verb, DEPNode head)
  {
    DEPNode aux;
   
    if (verb.isPos(CTLibEn.POS_VBZ))
      tree.add(aux = getNode(head, ENAux.DOES, ENAux.DO, verb.pos, DEPLibEn.DEP_AUX, null));
    else if (verb.isPos(CTLibEn.POS_VBD) || verb.isPos(CTLibEn.POS_VBN))
      tree.add(aux = getNode(head, ENAux.DID , ENAux.DO, CTLibEn.POS_VBD, DEPLibEn.DEP_AUX, null));
    else
      tree.add(aux = getNode(head, ENAux.DO  , ENAux.DO, verb.pos, DEPLibEn.DEP_AUX, null));
   
    toNonFinite(verb);
    return aux;
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void setRest(DEPTree tree, DEPNode verb,  Set<DEPNode> added)
  {
    for (DEPNode node : verb.getSubNodeSortedList())
    {
      if (added.contains(node))
        continue;
      else if (node.isDependentOf(verb) && (node.isPos(CTLibEn.POS_TO) || node.isLabel(DEPLibEn.DEP_COMPLM) || node.isLabel(DEPLibEn.DEP_MARK)))
        continue;
      else
        tree.add(node);
    }
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void resetDEPTree(DEPTree tree, DEPNode root)
  {
    List<DEPNode> remove = new ArrayList<DEPNode>();
    convertUserToYou(root, remove);
    tree.removeAll(remove);
   
    resetDEPTreePost(tree, root);
    tree.resetIDs();
    tree.resetDependents();
  }

  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void resetDEPTreePost(DEPTree tree, DEPNode root)
  {
    String end = UNPunct.QUESTION_MARK;
    String vtype;
   
    if ((vtype = root.getFeat(DEPLib.FEAT_VERB_TYPE)) != null && vtype.equals(NON_FINITE))
    {
      tree.add(1, getNode(root, PLEASE, PLEASE, CTLibEn.POS_UH, DEPLibEn.DEP_INTJ, SRLLib.ARGM_DIS));
      end = UNPunct.PERIOD;
    }
   
    DEPNode last = root.getLastNode();
   
    if (last.isPos(CTLibEn.POS_PERIOD))
    {
      last.form  = end;
      last.lemma = end;
    }
    else
      tree.add(getNode(root, end, end, CTLibEn.POS_PERIOD, DEPLibEn.DEP_PUNCT, null));
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void addSubtree(DEPTree tree, DEPNode head, Set<DEPNode> added)
  {
    List<DEPNode> list = head.getSubNodeSortedList();
   
    tree .addAll(list);
    added.addAll(list);
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void toNonFinite(DEPNode verb)
  {
    verb.form = verb.lemma;
    verb.pos  = CTLibEn.POS_VB;
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private DEPNode getNode(DEPNode head, String form, String lemma, String pos, String deprel, String label)
  {
    DEPNode aux = new DEPNode(0, form, lemma, pos, new DEPFeat());
    aux.initXHeads();
    aux.initSHeads();
   
    aux.setHead(head, deprel);
    if (label != nullaux.addSHead(head, label);

    return aux;
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void matchNumber(DEPNode verb, DEPNode aux)
  {
    for (DEPArc arc : verb.getDependents())
    {
      if (arc.isLabel(DEPLibEn.P_SBJ))
      {
        DEPNode dep = arc.getNode();
       
        if (dep.isLemma(ENPronoun.YOU))
        {
          if (aux.isLemma(ENAux.DO))
          {
            if (!aux.isPos(CTLibEn.POS_VBD) && !aux.isPos(CTLibEn.POS_VBN))
            {
              aux.form = ENAux.DO;
              aux.pos  = CTLibEn.POS_VBP;
            }
          }
          else if (aux.isLemma(ENAux.BE))
          {
            if (aux.isPos(CTLibEn.POS_VBD) || aux.isPos(CTLibEn.POS_VBN))
            {
              aux.form = ENAux.WERE;
              aux.pos  = CTLibEn.POS_VBD;
            }
            else
            {
              aux.form = ENAux.ARE;
              aux.pos  = CTLibEn.POS_VBP;
            }
          }
          else if (aux.isLemma(ENAux.HAVE))
          {
            if (!aux.isPos(CTLibEn.POS_VBD) && !aux.isPos(CTLibEn.POS_VBN))
            {
              aux.form = ENAux.HAVE;
              aux.pos  = CTLibEn.POS_VBP;
            }
          }
        }
       
        break;
      }
    }
  }
 
  /** Called by {@link LGAsk#generateQuestionFromAsk(DEPTree, String)}. */
  private void convertUserToYou(DEPNode node, List<DEPNode> remove)
  {
    List<DEPArc> deps = node.getDependents();
   
    if (node.isPos(CTLibEn.POS_PRPS) && !ENPronoun.is1stSingular(node.lemma))
    {
      node.form = node.lemma = ENPronoun.YOUR;
    }
    else if (node.isLabel(DEPLibEn.DEP_POSS) && isUser(node))
    {
      node.form = node.lemma = ENPronoun.YOUR;
      node.pos = CTLibEn.POS_PRPS;
      remove.addAll(node.getDependentNodeList());
    }
    else if (node.isPos(CTLibEn.POS_PRP) && !ENPronoun.is1stSingular(node.lemma) && !node.isLemma("it"))
    {
      if (node.lemma.endsWith("self"))
        node.form = node.lemma = ENPronoun.YOURSELF;
      else if (node.lemma.endsWith("s"))
        node.form = node.lemma = ENPronoun.YOURS;
      else
      {
        node.form = node.lemma = ENPronoun.YOU;
        matchYouVerb(node);
      }
    }
    else if (isUser(node))
    {
      node.form = node.lemma = ENPronoun.YOU;
      node.pos = CTLibEn.POS_PRP;
      matchYouVerb(node);
      remove.addAll(node.getDependentNodeList());
    }
    else if (!deps.isEmpty())
    {
      DEPNode poss = node.getFirstDependentByLabel(DEPLibEn.DEP_POSS);
      boolean hasPoss = (poss != null) && isUser(poss);
      DEPNode dep;
     
      for (DEPArc arc : deps)
      {
        dep = arc.getNode();
       
        if (hasPoss && arc.isLabel(DEPLibEn.DEP_DET))
          remove.add(dep);
        else
          convertUserToYou(dep, remove);
      }
     
      deps.removeAll(remove);
    }
  }
 
  private void matchYouVerb(DEPNode node)
  {
    if (node.isLabel(DEPLibEn.P_SBJ))
    {
      DEPNode verb = node.getHead();
     
      if (verb != null && MPLibEn.isVerb(verb.pos))
      {
        DEPNode aux = verb.getFirstDependentByLabel(DEPLibEn.P_AUX);
       
        if (aux != nullto2ndNumber(aux);
        else        to2ndNumber(verb);
      }
    }
  }
 
  private void to2ndNumber(DEPNode verb)
  {
    if (verb.isPosAny(CTLibEn.POS_VB, CTLibEn.POS_VBP, CTLibEn.POS_VBZ))
    {
      verb.form = verb.isLemma(ENAux.BE) ? ENAux.ARE : verb.lemma;
      verb.pos  = CTLibEn.POS_VBP;
    }
    else if (verb.isPosAny(CTLibEn.POS_VBD))
    {
      if (verb.isLemma(ENAux.BE)) verb.form = ENAux.WERE;
    }
  }
 
  private boolean isUser(DEPNode node)
  {
    if (!USER.equalsIgnoreCase(node.form))
      return false;
   
    for (DEPArc arc : node.getDependents())
    {
      if (!arc.isLabel(DEPLibEn.DEP_DET) && !arc.isLabel(DEPLibEn.DEP_POSSESSIVE))
        return false;
    }
   
    return true;
  }
}
TOP

Related Classes of com.clearnlp.generation.LGAsk

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.