-
dcz authored16cd6ffe
Argument.py 6.21 KiB
#! /usr/bin/python
# -*- coding: utf-8 -*-
from semantics.models import RelationalSelectionalPreference, PredefinedSelectionalPreference, \
SelectionalPreferenceRelation, ArgumentRole
import semantics.models
from meanings.models import Synset
class Relation:
def __init__(self, type, argument_type, to):
self._type = type
self._argument_type = argument_type
self._to = to
@classmethod
def fromTree(cls, tree):
type = tree._children[0]._children[0]._attrs['value']
argument_type = tree._children[1]._children[0]._attrs['type']
to = tree._children[1]._children[0]._attrs['sameAs'][1:]
if argument_type != 'argument':
print(argument_type, to)
raise UnknownError()
return cls(type, argument_type, to)
def store(self, frame, argument):
role = self._to._semantic_role.get()
to = frame.sorted_arguments().get(role=role)
relation = SelectionalPreferenceRelation.objects.get(key=self._type)
pref = RelationalSelectionalPreference(relation=relation, to=to)
pref.save()
argument.relations.add(pref)
def __str__(self):
return self._type + '->' + str(self._to._semantic_role)
class SelectionalPreference:
def __init__(self, type, value):
self._type = type
self._value = value
@classmethod
def forType(cls, type, values):
result = []
reference_to_solve = []
if type == 'predef':
for value in values:
result.append(cls(type, value._attrs['value']))
elif type == 'synset':
for value in values:
result.append(cls(type, value._attrs['value']))
elif type == 'relation':
for value in values:
x = Relation.fromTree(value)
result.append(cls(type, x))
reference_to_solve.append(x)
else:
print(type, values)
raise UnknownError()
return result, reference_to_solve
# return [cls(type, value._attrs['value']) for value in values]
@classmethod
def fromTree(cls, tree):
preferences = []
references = []
for subtree in tree._children[0]._children:
new_preferences, new_references = cls.forType(subtree._attrs['name'][:-1], subtree._children[0]._children)
preferences += new_preferences
references += new_references
return preferences, references
def store(self, frame, argument):
if self._type == 'predef':
pref = PredefinedSelectionalPreference.objects.filter(name=self._value)
if len(pref) > 0:
argument.predefined.add(pref[0])
else:
print('PredefinedSelectionalPreference not found: {}', self._value)
elif self._type == 'synset':
pref = Synset.objects.get(id=self._value)
argument.synsets.add(pref)
elif self._type == 'relation':
self._value.store(frame, argument)
else:
print(type, values)
raise UnknownError()
def __str__(self):
return str(self._value)
class SemanticRole:
def __init__(self, value, attribute=None):
self._value = value
self._attribute = attribute
def get(self):
return self.store()
def store(self):
role = semantics.models.SemanticRole.objects.get(role=self._value)
if self._attribute is not None:
attribute = semantics.models.RoleAttribute.objects.get(attribute=self._attribute)
else:
attribute = None
print('Find argument_role for semantic_role: {} and attribute {}'.format(role, attribute))
argument_role = semantics.models.ArgumentRole.objects.get(role=role, attribute=attribute, sub_attribute=None)
print('Found argument_role: {}'.format(argument_role))
return argument_role
def __str__(self):
if self._attribute is None:
return self._value.lower()
else:
return '(' + self._value.lower() + '-' + self._attribute.lower() + ')'
class Argument:
def __init__(self, semantic_role, selectional_preferences, references, id):
self._frame = None
self._semantic_role = semantic_role
self._selectional_preferences = selectional_preferences
self._references = references
self._id = id
self._db_id = None
@classmethod
def fromTree(cls, tree):
id = tree._attrs['xml:id']
attribute = None
selectional_preferences = []
references = []
for subtree in tree._children:
if subtree._attrs['name'] == 'role':
role = subtree._children[0]._attrs['value']
elif subtree._attrs['name'] == 'role_attribute':
attribute = subtree._children[0]._attrs['value']
elif subtree._attrs['name'] == 'sel_prefs':
selectional_preferences, references = SelectionalPreference.fromTree(subtree)
else:
print(subtree._attrs['name'])
raise UnknownError()
semantic_role = SemanticRole(role, attribute)
return cls(semantic_role, selectional_preferences, references, id)
def getId(self):
return self._id
def get(self, frame):
role = self._semantic_role.get()
argument = semantics.models.Argument.objects.get(frame=frame, role=role)
return argument
def store(self, frame):
role = self._semantic_role.store()
argument = semantics.models.Argument(role=role,
frame=frame,
preferences_count=len(self._selectional_preferences))
argument.pk = int(self._id.split(".")[1].split("-")[0])
argument.save()
self._db_id = argument.id
return argument
def store_preferences(self, frame, argument):
for preference in self._selectional_preferences:
preference.store(frame, argument)
def __str__(self):
return str(self._semantic_role) + '[' + ','.join([str(pref) for pref in self._selectional_preferences]) + ']'