All Downloads are FREE. Search and download functionalities are using the official Maven repository.

epic.trees.DependencyTree.scala Maven / Gradle / Ivy

The newest version!
package epic.trees

/**
 * root index is words.length
 * @author dlwh
 */
case class DependencyTree[+L, +W](dependencies: IndexedSeq[(L, Int)], words: IndexedSeq[W]) {
  def render : String = {
    for(((label, head),dep) <- dependencies.zipWithIndex) yield {
      if(head == words.length) s"ROOT(${words(dep)}-$dep)" else s"$label(${words(head)}-$head, ${words(dep)}-$dep)"
    }
  }.mkString("\n")

  def arcs = for( ((_, head),dep) <- dependencies.zipWithIndex) yield (head, dep)
}

object DependencyTree {
  def fromTreeInstance[L, W](ti: TreeInstance[L, W], finder: HeadFinder[L] = HeadFinder.collins): DependencyTree[L, W] = {
    fromTree(ti.tree, ti.words, finder)
  }

  def fromTree[L, W](tree: Tree[L], words: IndexedSeq[W], headFinder: HeadFinder[L]=HeadFinder.collins): DependencyTree[L, W] = {
    val annotated = headFinder.annotateHeadIndices(tree)
    val deps = new Array[(L, Int)](words.length)
    for( subtree <- annotated.allChildren) {
      for(t <- subtree.children if t.label._2 != subtree.label._2) {
        deps(t.label._2) = (t.label._1 -> subtree.label._2)
      }
    }
    deps(annotated.label._2) = (annotated.label._1 -> words.length)
    DependencyTree(deps, words)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy