示例#1
0
  /**
   * ************************************************************************************************************
   * Attempt to perform natural language generation on this object.
   *
   * @return a sentence in natural language, or empty string on failure
   */
  public String toNaturalLanguage() {

    formulateNaturalSubject();
    formulateNaturalVerb();
    formulateNaturalDirectObject();
    formulateNaturalIndirectObject();

    if (subject.getSurfaceForm().isEmpty()) {
      reset();
      doPassiveVoice();
    }

    // If no subject, perform no NLG.
    if (subject.getSurfaceForm().isEmpty()) {
      return "";
    }

    String indirectObjectStr = concatenateIndirectObjects();
    String cleanedStr =
        (subject.getSurfaceForm()
            + " "
            + verb.getSurfaceForm()
            + " "
            + directObject.getSurfaceForm()
            + " "
            + indirectObjectStr);

    return cleanedStr.replaceAll("\\s+", " ").trim();
  }
示例#2
0
  /**
   * ************************************************************************************************************
   * Put the "direct object" of this process into natural language.
   */
  void formulateNaturalDirectObject() {
    StringBuilder sBuild = new StringBuilder();

    VerbProperties verbProperties = new VerbPropertiesSimpleImpl();
    List<CaseRole> caseRolesToUse =
        verbProperties.getCaseRolesForGrammarRole(
            getVerb().getVerb(), SVOElement.SVOGrammarPosition.DIRECT_OBJECT);

    // It's possible that the direct object slot has already been filled, e.g. by the verb if we
    // didn't know how
    // to translate the process into natural language. Since only one direct object is allowed, in
    // this case we need to
    // precede any objects formulated here with a prefix, and add the data to the indirect object
    // list.
    String prefix = "";
    SVOElement element = directObject;
    if (!directObject.getSurfaceForm().isEmpty()) {
      prefix = "on ";
      element = new SVOElement(SVOGrammarPosition.INDIRECT_OBJECT);
      indirectObjects.add(element);
    }

    for (CaseRole role : caseRolesToUse) {
      String obj = formulateNounPhraseForCaseRole(role, directObject, kb);
      if (!obj.isEmpty()) {
        sBuild.append(prefix).append(" ").append(obj).append(" ");
        getCaseRolesScratchpad().removeAll(role);
        break;
      }
    }

    element.setSurfaceForm(sBuild.toString().replaceAll("\\s+", " ").trim());
  }
示例#3
0
  /**
   * ************************************************************************************************************
   */
  private String concatenateIndirectObjects() {
    StringBuilder sBuild = new StringBuilder();

    for (SVOElement element : indirectObjects) {
      sBuild.append(element.getSurfaceForm()).append(" ");
    }

    return sBuild.toString().trim();
  }