Commit 9cc75e4c43555c9ffce32daddb1ca426f3349d7c
1 parent
1c9e4979
poprawione proponowanie automatycznych derywatów (adjnie)
Showing
3 changed files
with
50 additions
and
36 deletions
dictionary/ajax_lexeme_view.py
@@ -418,11 +418,11 @@ def update_lexeme(request, form_data): | @@ -418,11 +418,11 @@ def update_lexeme(request, form_data): | ||
418 | if new_lexeme: | 418 | if new_lexeme: |
419 | insert_new_lexeme(l, request) | 419 | insert_new_lexeme(l, request) |
420 | computed_derivatives = lexeme_derivatives(l) | 420 | computed_derivatives = lexeme_derivatives(l) |
421 | - crs = l.refs_to.values_list( | ||
422 | - 'to_lexeme__entry', 'to_lexeme__part_of_speech_id') | 421 | + crs = l.refs_to.values_list('to_lexeme__entry', 'type__symbol') |
423 | cr_set = set(tuple(cr) for cr in crs) | 422 | cr_set = set(tuple(cr) for cr in crs) |
424 | needed_derivatives = [ | 423 | needed_derivatives = [ |
425 | - d for d in computed_derivatives if (d['entry'], d['pos']) not in cr_set] | 424 | + d for d in computed_derivatives |
425 | + if (d['entry'], d['cr_type']) not in cr_set] | ||
426 | return {'derivatives': needed_derivatives} | 426 | return {'derivatives': needed_derivatives} |
427 | 427 | ||
428 | 428 | ||
@@ -434,20 +434,21 @@ def create_derivatives(request, lexeme_id, chosen_derivatives): | @@ -434,20 +434,21 @@ def create_derivatives(request, lexeme_id, chosen_derivatives): | ||
434 | new_derivatives = {} | 434 | new_derivatives = {} |
435 | for der_data in chosen_derivatives: | 435 | for der_data in chosen_derivatives: |
436 | pos = der_data['pos'] | 436 | pos = der_data['pos'] |
437 | + cr_type = der_data['cr_type'] | ||
437 | entry = der_data['entry'] | 438 | entry = der_data['entry'] |
438 | if entry == '': | 439 | if entry == '': |
439 | raise AjaxError(_(u'Nie wpisano hasła')) | 440 | raise AjaxError(_(u'Nie wpisano hasła')) |
440 | new_lexemes = create_derivative( | 441 | new_lexemes = create_derivative( |
441 | - lexeme, pos, entry, pl=der_data.get('pl'), | 442 | + lexeme, pos, cr_type, entry, pl=der_data.get('pl'), |
442 | index=der_data['index']) | 443 | index=der_data['index']) |
443 | for der in new_lexemes: | 444 | for der in new_lexemes: |
444 | insert_new_lexeme(der, request) | 445 | insert_new_lexeme(der, request) |
445 | - new_derivatives[pos] = new_lexemes | ||
446 | - chosen_poses = [der_data['pos'] for der_data in chosen_derivatives] | 446 | + new_derivatives[cr_type] = new_lexemes |
447 | + chosen_types = [der_data['cr_type'] for der_data in chosen_derivatives] | ||
447 | if lexeme.part_of_speech_id == 'adj': | 448 | if lexeme.part_of_speech_id == 'adj': |
448 | - if 'adv' in chosen_poses and 'advcom' in chosen_poses: | ||
449 | - adv = new_derivatives['adv'][0] | ||
450 | - advcom = new_derivatives['advcom'][0] | 449 | + if 'adjadv' in chosen_types and 'adjadvc' in chosen_types: |
450 | + adv = new_derivatives['adjadv'][0] | ||
451 | + advcom = new_derivatives['adjadvc'][0] | ||
451 | adv.add_cross_reference(advcom, 'advcom') | 452 | adv.add_cross_reference(advcom, 'advcom') |
452 | advcom.add_cross_reference(adv, 'comadv') | 453 | advcom.add_cross_reference(adv, 'comadv') |
453 | return {} | 454 | return {} |
dictionary/auto_derivatives.py
1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
2 | from django.db.models import Max | 2 | from django.db.models import Max |
3 | from dictionary.models import Ending, Lexeme, LexemeInflectionPattern, \ | 3 | from dictionary.models import Ending, Lexeme, LexemeInflectionPattern, \ |
4 | - Pattern, Gender, LexemeAttributeValue | 4 | + Pattern, Gender, LexemeAttributeValue, LexemeAttribute |
5 | 5 | ||
6 | VOWELS = u'aeiouyąęó' | 6 | VOWELS = u'aeiouyąęó' |
7 | 7 | ||
8 | +ADJ_POS = ('ppas', 'appas', 'pact', 'adjcom', 'nieadj') | ||
9 | + | ||
8 | Ppact = Pattern.objects.get(name='P2') # hardcoded pattern | 10 | Ppact = Pattern.objects.get(name='P2') # hardcoded pattern |
9 | Pppas_ty = Pattern.objects.get(name='P4t') | 11 | Pppas_ty = Pattern.objects.get(name='P4t') |
10 | Pppas_ny_ni = Pattern.objects.get(name='P4') | 12 | Pppas_ny_ni = Pattern.objects.get(name='P4') |
@@ -17,23 +19,25 @@ Pcom = Pattern.objects.get(name='P4zs') | @@ -17,23 +19,25 @@ Pcom = Pattern.objects.get(name='P4zs') | ||
17 | Pndm = Pattern.objects.get(name='ndm') | 19 | Pndm = Pattern.objects.get(name='ndm') |
18 | n2 = Gender.objects.get(symbol='n2') | 20 | n2 = Gender.objects.get(symbol='n2') |
19 | f = Gender.objects.get(symbol='f') | 21 | f = Gender.objects.get(symbol='f') |
22 | +ATTR_POPRZ = LexemeAttribute.objects.get(name=u'forma poprz.') | ||
23 | +ATTR_ZLOZ = LexemeAttribute.objects.get(name=u'forma złoż.') | ||
20 | NO_POPRZ = LexemeAttributeValue.objects.get( | 24 | NO_POPRZ = LexemeAttributeValue.objects.get( |
21 | value=u'nieobecna', attribute__name=u'forma poprz.') | 25 | value=u'nieobecna', attribute__name=u'forma poprz.') |
22 | NO_ZLOZ = LexemeAttributeValue.objects.get( | 26 | NO_ZLOZ = LexemeAttributeValue.objects.get( |
23 | value=u'nieobecna', attribute__name=u'forma złoż.') | 27 | value=u'nieobecna', attribute__name=u'forma złoż.') |
24 | 28 | ||
25 | CR_TYPES = { | 29 | CR_TYPES = { |
26 | - 'pact': ('verpact', 'pactver'), | ||
27 | - 'ppas': ('verppas', 'ppasver'), | ||
28 | - 'appas': ('verppas', 'ppasver'), | ||
29 | - 'ger': ('verger', 'gerver'), | ||
30 | - 'osc': ('adjosc', 'oscadj'), | ||
31 | - 'adv': ('adjadv', 'advadj'), | ||
32 | - 'advcom': ('adjadvc', 'advcadj'), | 30 | + 'verpact': ('verpact', 'pactver'), |
31 | + 'verppas': ('verppas', 'ppasver'), | ||
32 | + # 'verappas': ('verppas', 'ppasver'), | ||
33 | + 'verger': ('verger', 'gerver'), | ||
34 | + 'adjosc': ('adjosc', 'oscadj'), | ||
35 | + 'adjadv': ('adjadv', 'advadj'), | ||
36 | + 'adjadvc': ('adjadvc', 'advcadj'), | ||
33 | 'adjcom': ('adjcom', 'comadj'), | 37 | 'adjcom': ('adjcom', 'comadj'), |
34 | - 'nieadj': ('adjnie', 'nieadj'), | ||
35 | - 'nieadv': ('adjnie', 'nieadj'), | ||
36 | - 'nieosc': ('adjnie', 'nieadj'), | 38 | + 'adjnie': ('adjnie', 'nieadj'), |
39 | + 'advnie': ('adjnie', 'nieadj'), | ||
40 | + 'oscnie': ('adjnie', 'nieadj'), | ||
37 | } | 41 | } |
38 | 42 | ||
39 | 43 | ||
@@ -48,6 +52,7 @@ def ppas_data(lips, pos='ppas'): | @@ -48,6 +52,7 @@ def ppas_data(lips, pos='ppas'): | ||
48 | for ending12 in endings12: | 52 | for ending12 in endings12: |
49 | yield { | 53 | yield { |
50 | 'pos': pos, | 54 | 'pos': pos, |
55 | + 'cr_type': 'verppas', | ||
51 | 'entry': lip.root + ending.string + 'y', | 56 | 'entry': lip.root + ending.string + 'y', |
52 | 'pl': lip.root + ending12.string, | 57 | 'pl': lip.root + ending12.string, |
53 | 'index': lip.index, | 58 | 'index': lip.index, |
@@ -62,6 +67,7 @@ def pact_data(lips): | @@ -62,6 +67,7 @@ def pact_data(lips): | ||
62 | for ending in endings3: | 67 | for ending in endings3: |
63 | yield { | 68 | yield { |
64 | 'pos': 'pact', | 69 | 'pos': 'pact', |
70 | + 'cr_type': 'verpact', | ||
65 | 'entry': lip.root + ending.string + 'cy', | 71 | 'entry': lip.root + ending.string + 'cy', |
66 | 'index': lip.index, | 72 | 'index': lip.index, |
67 | } | 73 | } |
@@ -75,6 +81,7 @@ def ger_data(lips): | @@ -75,6 +81,7 @@ def ger_data(lips): | ||
75 | for ending in endings11: | 81 | for ending in endings11: |
76 | yield { | 82 | yield { |
77 | 'pos': 'ger', | 83 | 'pos': 'ger', |
84 | + 'cr_type': 'verger', | ||
78 | 'entry': lip.root + ending.string + 'ie', | 85 | 'entry': lip.root + ending.string + 'ie', |
79 | 'index': lip.index, | 86 | 'index': lip.index, |
80 | } | 87 | } |
@@ -131,33 +138,37 @@ def lexeme_derivatives(lexeme): | @@ -131,33 +138,37 @@ def lexeme_derivatives(lexeme): | ||
131 | yield data | 138 | yield data |
132 | elif lexeme.part_of_speech.symbol == 'adj': | 139 | elif lexeme.part_of_speech.symbol == 'adj': |
133 | # adjcom, adv, advcom, osc, nieadj | 140 | # adjcom, adv, advcom, osc, nieadj |
134 | - for pos in ('adjcom', 'adv', 'advcom'): | 141 | + pos_types = ( |
142 | + ('adjcom', 'adjcom'), | ||
143 | + ('adv', 'adjadv'), | ||
144 | + ('advcom', 'adjadvc') | ||
145 | + ) | ||
146 | + for pos, cr_type in pos_types: | ||
135 | yield { | 147 | yield { |
136 | 'pos': pos, | 148 | 'pos': pos, |
149 | + 'cr_type': cr_type, | ||
137 | 'entry': None, | 150 | 'entry': None, |
138 | 'index': 1, | 151 | 'index': 1, |
139 | } | 152 | } |
140 | yield { | 153 | yield { |
141 | 'pos': 'osc', | 154 | 'pos': 'osc', |
155 | + 'cr_type': 'adjosc', | ||
142 | 'entry': guess_osc(lexeme.entry), | 156 | 'entry': guess_osc(lexeme.entry), |
143 | 'index': 1, | 157 | 'index': 1, |
144 | } | 158 | } |
145 | yield { | 159 | yield { |
146 | - 'pos': 'nieadj', | 160 | + 'pos': 'adj', |
161 | + 'cr_type': 'adjnie', | ||
147 | 'entry': make_negation(lexeme.entry), | 162 | 'entry': make_negation(lexeme.entry), |
148 | 'index': 1, | 163 | 'index': 1, |
149 | } | 164 | } |
150 | 165 | ||
151 | 166 | ||
152 | -def create_derivative(lexeme, part_of_speech, entry, index, pl=None): | ||
153 | - negation = part_of_speech.startswith('nie') | ||
154 | - if negation: | ||
155 | - pos = part_of_speech[3:] | ||
156 | - else: | ||
157 | - pos = part_of_speech | 167 | +def create_derivative(lexeme, part_of_speech, cr_type, entry, index, pl=None): |
168 | + negation = cr_type.endswith('nie') | ||
158 | next_id = Lexeme.all_objects.aggregate(Max('id'))['id__max'] + 1 | 169 | next_id = Lexeme.all_objects.aggregate(Max('id'))['id__max'] + 1 |
159 | der = Lexeme.objects.create( | 170 | der = Lexeme.objects.create( |
160 | - id=next_id, entry=entry, part_of_speech_id=pos, | 171 | + id=next_id, entry=entry, part_of_speech_id=part_of_speech, |
161 | status=lexeme.status, owner_vocabulary_id=lexeme.owner_vocabulary_id, | 172 | status=lexeme.status, owner_vocabulary_id=lexeme.owner_vocabulary_id, |
162 | specialist=lexeme.specialist, | 173 | specialist=lexeme.specialist, |
163 | borrowing_source_id=lexeme.borrowing_source_id) | 174 | borrowing_source_id=lexeme.borrowing_source_id) |
@@ -211,18 +222,20 @@ def create_derivative(lexeme, part_of_speech, entry, index, pl=None): | @@ -211,18 +222,20 @@ def create_derivative(lexeme, part_of_speech, entry, index, pl=None): | ||
211 | for q in orig_lip.qualifiers.all(): | 222 | for q in orig_lip.qualifiers.all(): |
212 | lip.qualifiers.add(q) | 223 | lip.qualifiers.add(q) |
213 | for attr, attr_val in lexeme.attributes_values(): | 224 | for attr, attr_val in lexeme.attributes_values(): |
214 | - if attr_val and attr.parts_of_speech.filter(symbol=part_of_speech): | 225 | + if attr not in (ATTR_POPRZ, ATTR_ZLOZ) and attr_val \ |
226 | + and attr.parts_of_speech.filter(symbol=part_of_speech): | ||
215 | attr_val.add_lexeme(der) | 227 | attr_val.add_lexeme(der) |
216 | if part_of_speech in ('ppas', 'appas', 'pact', 'adjcom', 'nieadj'): | 228 | if part_of_speech in ('ppas', 'appas', 'pact', 'adjcom', 'nieadj'): |
217 | NO_POPRZ.add_lexeme(der) | 229 | NO_POPRZ.add_lexeme(der) |
218 | NO_ZLOZ.add_lexeme(der) | 230 | NO_ZLOZ.add_lexeme(der) |
219 | for q in lexeme.qualifiers.all(): | 231 | for q in lexeme.qualifiers.all(): |
220 | der.qualifiers.add(q) | 232 | der.qualifiers.add(q) |
221 | - cr_to, cr_from = CR_TYPES[part_of_speech] | 233 | + cr_to, cr_from = CR_TYPES[cr_type] |
222 | lexeme.add_cross_reference(der, cr_to) | 234 | lexeme.add_cross_reference(der, cr_to) |
223 | der.add_cross_reference(lexeme, cr_from) | 235 | der.add_cross_reference(lexeme, cr_from) |
224 | new_lexemes = [der] | 236 | new_lexemes = [der] |
225 | - if part_of_speech in ('osc', 'adv'): | 237 | + if cr_type in ('adjosc', 'adjadv'): |
226 | new_lexemes.extend(create_derivative( | 238 | new_lexemes.extend(create_derivative( |
227 | - der, 'nie' + part_of_speech, make_negation(entry), index)) | ||
228 | - return new_lexemes | ||
229 | \ No newline at end of file | 239 | \ No newline at end of file |
240 | + der, part_of_speech, part_of_speech + 'nie', make_negation(entry), | ||
241 | + index)) | ||
242 | + return new_lexemes |
dictionary/static/js/lexeme-edit.js
@@ -432,11 +432,11 @@ $.extend(edit, { | @@ -432,11 +432,11 @@ $.extend(edit, { | ||
432 | var label = $('<label/>').attr('for', name); | 432 | var label = $('<label/>').attr('for', name); |
433 | li.append(input).append(label).appendTo(ul); | 433 | li.append(input).append(label).appendTo(ul); |
434 | if (der_data.entry) { | 434 | if (der_data.entry) { |
435 | - label.text(der_data.pos + ', ' + der_data.entry); | 435 | + label.text(der_data.cr_type + ', ' + der_data.entry); |
436 | } else { | 436 | } else { |
437 | var der_input = $('<input/>').attr('type', 'text') | 437 | var der_input = $('<input/>').attr('type', 'text') |
438 | .addClass('derivative-input'); | 438 | .addClass('derivative-input'); |
439 | - label.text(der_data.pos + ', '); | 439 | + label.text(der_data.cr_type + ', '); |
440 | li.append(der_input); | 440 | li.append(der_input); |
441 | } | 441 | } |
442 | }); | 442 | }); |