Giter VIP home page Giter VIP logo

Comments (2)

dmcc avatar dmcc commented on August 15, 2024

from bllip-parser.

jofatmofn avatar jofatmofn commented on August 15, 2024

I am using pynaf to generate NAF output and I need to call naf_document.add_constituency_tree. Have decided to use extracted dependencies and walk up the tree. Sharing the code, with the hope that it is useful to someone.

def constituent_tree_to_naf(parent_node, parent_tid, is_parent_root):
	# Depth first tree navigation
	# This method will NOT be called with parent_node a preterminal. Hence it is assured that all the child_nodes are nonterminals.
	global tid, terminals, ntid, non_terminals, edgeid, edges, direct_head_less, edge_idx
	head_in_child = False
	for child_node in parent_node.__iter__():
		if parent_node.head().__str__() == child_node.__str__():
			head_in_child = True
			break
	if not head_in_child:
		direct_head_less.append((parent_node, None, True))	# Headless node, edge_id to put header attribute, if head is yet to be found

	for child_node in parent_node.__iter__():

		# non_terminals (constituent_id, constituent_Label)
		ntid += 1
		non_terminals.append(("nter" + str(ntid), child_node.label))

		for i, dhl_t in enumerate(direct_head_less):
			if dhl_t[2] and dhl_t[0].head().__str__() == child_node.__str__():
				edges[dhl_t[1]] = edges[dhl_t[1]] + ("yes",) 
				direct_head_less[i] = (dhl_t[0], dhl_t[1], False)

		# edges. (edge_id, from_id,to_id, head)
		edgeid += 1
		edge_idx += 1
		if is_parent_root or parent_node.head().__str__() == child_node.__str__():
			edges.append(("tre" + str(edgeid), "nter" + str(ntid), "nter" + str(parent_tid), "yes"))
		else:
			edges.append(("tre" + str(edgeid), "nter" + str(ntid), "nter" + str(parent_tid)))

		if child_node.is_preterminal():
			# terminals. (constituent_id, [term_id])
			tid = tid + 1
			terminals.append(("ter" + str(tid), ["t" + str(tid)])) # TODO: Check if there can be a situation where term_id <> terminal id

			# edges. (edge_id, from_id,to_id, head)
			edgeid += 1
			edge_idx += 1
			edges.append(("tre" + str(edgeid), "ter" + str(tid), "nter" + str(ntid)))
		else:	# non terminal, but not pre terminal
			for i, dhl_t in enumerate(direct_head_less):
				if dhl_t[2] and parent_node.__str__() == dhl_t[0].__str__():
					direct_head_less[i] = (dhl_t[0], edge_idx, dhl_t[2])
			
			constituent_tree_to_naf(child_node, ntid, False)

The calling method has this code (where tokens is the list of tokens and postags is the corresponding POS tags):

	global tid, terminals, ntid, non_terminals, edgeid, edges, direct_head_less, edge_idx
	tid = -1
	ntid = -1
	edgeid = -1

For each sentence

		terminals = []
		non_terminals = []
		edges = []
		direct_head_less = []
		edge_idx = -1
		ntid += 1
		non_terminals.append(("nter" + str(ntid), "ROOT"))
		constituency_lisp_string = str(rrp.parse_tagged(tokens, possible_tags=dict(enumerate(postags)))[0].ptb_parse)
		tree = Tree(constituency_lisp_string)
		head = tree.head()
		constituent_tree_to_naf(tree, ntid, True)
		naf_document.add_constituency_tree(non_terminals, terminals, edges)

from bllip-parser.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.