Commit 9f7ed3ffab27bb9eeb4b8c1a5b5c83662f2f2b8d

Authored by Bartłomiej Nitoń
1 parent 74bcb2d2

Changed reflex validation rules in semantic validation.

dictionary/management/commands/get_payments.py
1 1 #-*- coding:utf-8 -*-
2 2  
3 3 import codecs
  4 +import datetime
4 5  
5 6 from django.contrib.auth.models import User
6 7 from django.core.management.base import BaseCommand
... ... @@ -14,7 +15,8 @@ class Command(BaseCommand):
14 15 get_payments()
15 16  
16 17 def get_payments():
17   - payments_path = 'data/payments_20150907.csv'
  18 + now = datetime.datetime.now().strftime('%Y%m%d')
  19 + payments_path = 'data/payments_%s.csv' % now
18 20 payments_file = codecs.open(payments_path, 'wt', 'utf-8')
19 21 users = User.objects.order_by('username')
20 22  
... ...
dictionary/models.py
... ... @@ -406,9 +406,6 @@ class Frame(Model):
406 406 positions_str_tab = [position['position'].text_rep for position in sorted_positions]
407 407 return u'%s:%s' % (':'.join(frame_chars_str_tab), ' + '.join(positions_str_tab))
408 408  
409   - def has_refl_args(self):
410   - return self.positions.filter(arguments__type__in=['refl', 'recip']).exists()
411   -
412 409 def __unicode__(self):
413 410 return '%s' % (self.text_rep)
414 411  
... ... @@ -766,7 +763,10 @@ class Argument(Model):
766 763 return False
767 764  
768 765 def sort_arguments(arguments):
769   - return sortArguments(arguments)
  766 + return sortArguments(arguments)
  767 +
  768 +def reflex_phrase_types():
  769 + return ['refl', 'recip']
770 770  
771 771 class ArgRealization(Model):
772 772 # # !NOWE! nie dodalem tego jeszcze na produkcyjnym
... ...
semantics/validation.py
1 1 # -*- coding: utf-8 -*-
2 2  
3   -from dictionary.models import Lemma
  3 +from django.db.models import Max
  4 +
  5 +from dictionary.models import Lemma, reflex_phrase_types
4 6 from semantics.models import LexicalUnitExamples
5 7 from semantics.utils import get_matching_frame
6 8  
... ... @@ -9,12 +11,12 @@ def validate_frames(lemma_id):
9 11 actual_frames = lemma.entry_obj.actual_frames()
10 12 error_msg = u''
11 13 for frame in actual_frames.all():
12   - error_msg = frame_valid(frame, actual_frames)
  14 + error_msg = frame_valid(lemma, frame, actual_frames)
13 15 if error_msg:
14 16 break
15 17 return error_msg
16 18  
17   -def frame_valid(frame, actual_frames):
  19 +def frame_valid(lemma, frame, actual_frames):
18 20 error_msg = ''
19 21 complements = frame.complements.all()
20 22 if not arguments_exists(complements):
... ... @@ -29,8 +31,8 @@ def frame_valid(frame, actual_frames):
29 31 error_msg = u'Semantyka: Rama semantyczna %d nie ma dopiętych przykładów.' % frame.id
30 32 elif duplicates_exists(frame, actual_frames):
31 33 error_msg = u'Semantyka: Rama semantyczna %d posiada duplikaty.' % frame.id
32   - elif not schemas_reflex_agreed(frame):
33   - error_msg = u'Semantyka: Rama semantyczna %d ma dopięte schematy o niezgodnej ze znaczeniami zwrotności.' % frame.id
  34 + elif not schemas_reflex_agreed(lemma, frame):
  35 + error_msg = u'Semantyka: Rama semantyczna %d ma dopięte elementy o niezgodnej zwrotności.' % frame.id
34 36 elif nonch_pinned(frame):
35 37 error_msg = u'Semantyka: Rama semantyczna %d jest dopięta do typu frazy nonch.' % frame.id
36 38 elif multiplied_same_arg_in_schema(frame):
... ... @@ -88,23 +90,41 @@ def duplicates_exists(frame, actual_frames):
88 90 return True
89 91 return False
90 92  
91   -def schemas_reflex_agreed(frame):
  93 +def schemas_reflex_agreed(lemma, frame):
92 94 complements = frame.complements.all()
93 95 lexical_units = frame.lexical_units.all()
94   - for compl in complements:
95   - for real in compl.realizations.all():
96   - schema_reflex = real.frame.get_char_value('ZWROTNOŚĆ').value
97   - if (not reflex_in_lexical_units(lexical_units, schema_reflex)):
  96 + for lex_unit in lexical_units:
  97 + for schema in lemma.frames.all():
  98 + if not schema_lex_unit_reflex_agree(lex_unit, schema, complements):
98 99 return False
99 100 return True
100 101  
101   -#def refl_like_phrase_type_pinned(compl, real):
102   -# same_frame_realizations = compl.realizations.filter(frame=real.frame,
103   -# alternation=real.alternation)
104   -
105   -def reflex_in_lexical_units(lexical_units, reflex):
106   - for lex_unit in lexical_units:
107   - if lex_unit.is_reflexive() == bool(reflex):
  102 +def schema_lex_unit_reflex_agree(lexical_unit, schema, complements):
  103 + if complements.filter(realizations__frame=schema).exists():
  104 + if (not reflex_with_self_mark_agreed(lexical_unit, schema) and
  105 + not (lexical_unit.is_reflexive() and not lexical_unit.is_new() and
  106 + reflex_with_phrase_types_agreed(lexical_unit, schema, complements))):
  107 + return False
  108 + return True
  109 +
  110 +def reflex_with_self_mark_agreed(lexical_unit, schema):
  111 + schema_self_mark = schema.get_char_value('ZWROTNOŚĆ').value
  112 + if not lexical_unit.is_reflexive() == bool(schema_self_mark):
  113 + return False
  114 + return True
  115 +
  116 +def reflex_with_phrase_types_agreed(lexical_unit, schema, complements):
  117 + max_alternations = complements.all().aggregate(Max('realizations__alternation'))['realizations__alternation__max']
  118 + for alternation in range(1, max_alternations+1):
  119 + if not reflex_with_alternation_phrase_types_agreed(complements, schema, alternation):
  120 + return False
  121 + return True
  122 +
  123 +def reflex_with_alternation_phrase_types_agreed(complements, schema, alternation):
  124 + for compl in complements:
  125 + if compl.realizations.filter(argument__type__in=reflex_phrase_types(),
  126 + alternation=alternation,
  127 + frame=schema).exists():
108 128 return True
109 129 return False
110 130  
... ... @@ -155,13 +175,15 @@ def validate_lexical_units(lemma_id):
155 175 lexical_units = lemma.entry_obj.lexical_units()
156 176 for lex_unit in lexical_units.all():
157 177 if not examples_reflex_agreed(lex_unit):
158   - error_msg = u'Semantyka: Znaczenie %s ma podpięte przykłady ze schematów o niezgodnej zwrotności.' % unicode(lex_unit)
  178 + error_msg = u'Semantyka: Znaczenie %s ma podpięte przykłady o niezgodnej zwrotności.' % unicode(lex_unit)
159 179 return error_msg
160 180  
161 181 def examples_reflex_agreed(lexical_unit):
162 182 lex_examples = LexicalUnitExamples.objects.filter(lexical_unit=lexical_unit)
163 183 for lex_example in lex_examples:
164 184 schema_reflex = lex_example.example.frame.get_char_value('ZWROTNOŚĆ').value
165   - if not (lexical_unit.is_reflexive() == bool(schema_reflex)):
  185 + if (not (lexical_unit.is_reflexive() == bool(schema_reflex)) and
  186 + not (lexical_unit.is_reflexive() and not lexical_unit.is_new() and
  187 + lex_example.arguments.filter(arguments__type__in=reflex_phrase_types()).exists())):
166 188 return False
167 189 return True
... ...
wordnet/models.py
... ... @@ -40,6 +40,11 @@ class LexicalUnit(models.Model):
40 40 def actual_frames(self):
41 41 return self.frames.filter(next__isnull=True, removed=False)
42 42  
  43 + def is_new(self):
  44 + if self.luid < 0:
  45 + return True
  46 + return False
  47 +
43 48 def is_reflexive(self):
44 49 base_parts = self.base.split()
45 50 if len(base_parts) > 1 and base_parts[1] == u'się':
... ...