|
from graph import Graph; |
|
|
|
def read_matrix(file): |
|
rows = []; |
|
for line in file: |
|
line = line.rstrip(); |
|
if len(line) == 0: |
|
return rows; |
|
else: |
|
rows.append(line.split("\t")); |
|
return rows or None |
|
|
|
def read_matrices(file): |
|
file.readline().rstrip(); |
|
matrix = read_matrix(file); |
|
while matrix: |
|
yield matrix; |
|
matrix = read_matrix(file); |
|
|
|
def matrix2graph(matrix, framework = None, text = None): |
|
graph = Graph(matrix[0][0][1:], flavor = 0, framework = framework); |
|
predicates = []; |
|
for id, row in enumerate(matrix[1:]): |
|
lemma, pos, frame, top = row[2], row[3], row[6], row[4] == '+'; |
|
if lemma == "_": lemma = row[1]; |
|
properties = {"pos": pos}; |
|
if frame != "_": properties["frame"] = frame; |
|
node = graph.add_node(id, label = lemma, |
|
properties = list(properties.keys()), |
|
values = list(properties.values()), |
|
top = top, anchors = [row[1]] if text else None); |
|
if row[5] == '+': |
|
predicates.append(id); |
|
for tgt, row in enumerate(matrix[1:]): |
|
for pred, label in enumerate(row[7:]): |
|
if label != '_': |
|
src = predicates[pred]; |
|
edge = graph.add_edge(src, tgt, label); |
|
if text: |
|
graph.add_input(text); |
|
graph.anchor(); |
|
|
|
|
|
|
|
graph.nodes = [node for node in graph.nodes if not node.is_singleton()]; |
|
return graph; |
|
|
|
def read(fp, framework = None, text = None): |
|
for matrix in read_matrices(fp): |
|
yield matrix2graph(matrix, framework, text), None; |
|
|