Statistics
| Revision:

root / tmp / org.txm.analec.rcp / src / org / txm / macro / urs / Fropos2CategorieMacro.groovy @ 1217

History | View | Annotate | Download (4.8 kB)

1
package org.txm.macro.urs
2

    
3
import org.apache.commons.lang.*
4
import org.kohsuke.args4j.*
5
import groovy.transform.*
6
import org.txm.*
7
import org.txm.rcp.swt.widget.parameters.*
8
import org.txm.annotation.urs.*
9
import org.txm.searchengine.cqp.*
10
import org.txm.searchengine.cqp.corpus.*
11
import visuAnalec.Message.*
12
import visuAnalec.donnees.*
13
import visuAnalec.elements.*
14
import visuAnalec.vue.*
15

    
16
def testRules(def positions, def Mention) {
17
        def catégorie = null
18

    
19
// DÉFINITION DES RÈGLES
20
// elles sont testées les unes après les autres. 
21
// Dès qu'une règle est appliquée les suivantes sont ignorées.
22

    
23
// Règles de type CONTIENT
24

    
25
             if (Mention.contains("NOMpro")) catégorie = "Nom Propre"
26
        else if (Mention.contains("DETpos")) catégorie = "Dét Possessif"
27
//  ...
28

    
29
// Règles de type COMMENCE ET NE CONTIENT PAS        
30

    
31
        else if (Mention.first() == "DETpos" && !Mention.contains("NOMpro")) catégorie = "GN Possessif"
32
        else if (Mention.first() == "DETdem" && !Mention.contains("NOMpro")) catégorie = "GN Démonstratif"
33
//  ...
34

    
35
// Règles de type CONTIENT PLUSIEURS        
36

    
37
        else if (Mention.contains("PROadv") || Mention.contains("ADVgen.PROadv")) catégorie = "Pronom Adverbial"
38
//  ...
39

    
40
// Règles de type CONTIENT ET NE CONTIENT PAS
41

    
42
        else if (
43
                         ( Mention.contains("DETdef") || Mention.contains("PRE.DETdef") )
44
                          &&
45
                          !Mention.contains("PROpos") && !Mention.contains("NOMpro") && !Mention.contains("PROcar")
46
                        ) catégorie = "GN Défini"
47
//  ...        
48

    
49
// Fin des règles, aucune n'a matchée. On stocke le pattern  qu'on affichera à la fin.
50
        else {
51
                def forms = CQI.cpos2Str(word.getQualifiedName(), positions)
52
                if (!errors.containsKey(Mention)) errors[Mention] = new HashSet()
53
                errors[Mention] << forms
54
        }
55
        
56
        return catégorie
57
}
58

    
59
//
60
// FIN DE LA DÉFINITION DES RÈGLES
61
//
62

    
63
// CORPS DU SCRIPT
64

    
65
if (!(corpusViewSelection instanceof MainCorpus)) {
66
        println "Corpora selection is not a Corpus"
67
        return
68
}
69

    
70
// BEGINNING OF PARAMETERS
71
@Field @Option(name="unit_type", usage="", widget="String", required=true, def="MENTION")
72
def unit_type
73
@Field @Option(name="pos_property_name", usage="", widget="String", required=true, def="pos")
74
def pos_property_name
75
@Field @Option(name="reset", usage="", widget="Boolean", required=true, def="true")
76
def reset
77
if (!ParametersDialog.open(this)) return
78

    
79
corpus = corpusViewSelection
80
CQI = CQPSearchEngine.getCqiClient()
81
word = corpus.getWordProperty()
82
posProperty = corpus.getProperty(pos_property_name)
83
if (posProperty == null) {
84
        println "Error: CQP corpus does not contains the word property with name=$pos_property_name"
85
        return
86
}
87
analecCorpus = URSCorpora.getCorpus(corpus)
88
vue = URSCorpora.getVue(corpus.getName())
89
structure = analecCorpus.getStructure()
90
if (!structure.getUnites().contains(unit_type)) { // check if the structure contains the unit_type units
91
        println "Error: corpus structure does not contains unit with name=$unit_type"
92
        return
93
}
94

    
95
CATEGORIE = "CATEGORIE"
96
// Si la structure d'annotation ne contient pas CATEGORIE, on la crée avec ses valeurs
97
if (!structure.getUniteProperties(unit_type).contains(CATEGORIE)) { 
98
// la propriété
99
        analecCorpus.ajouterProp(Unite.class, unit_type, CATEGORIE)
100
// les valeurs
101
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Nom Propre")
102
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Impersonnel")
103
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Interrogatif")
104
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Pronom cardinal")
105
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Démonstratif")
106
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Indéfini")
107
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom ordinal")
108
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Relatif")
109
//...
110
}
111

    
112
def nModified = 0
113
def nIgnored = 0
114

    
115
errors = new HashMap()
116
def units = analecCorpus.getUnites(unit_type)
117
units.sort() { a, b -> a.getDeb() <=> b.getDeb() ?: a.getFin() <=> b.getFin() }
118
for (Unite unit : units) { // process all units
119
        
120
        def prop = unit.getProp(CATEGORIE)
121
        if (!reset && prop != null && prop.length() > 0) continue // l'unité a déjà une CATEGORIE
122
        
123
        int[] positions = null
124
        if (unit.getDeb() == unit.getFin()) positions = [unit.getDeb()]
125
        else positions = (unit.getDeb()..unit.getFin())
126
        
127
        def Mention = CQI.cpos2Str(posProperty.getQualifiedName(), positions)
128
        def cat = testRules(positions, Mention)
129
        
130
        if (cat != null) {
131
                vue.setValeurChamp(unit, CATEGORIE, cat)
132
                nModified++
133
        } else {
134
                nIgnored++
135
        }
136
}
137

    
138
println "Result:"
139
println "- $nModified units of type $unit_type have been modified."
140
println "- $nIgnored units of type $unit_type have not been modified.\n"
141

    
142
if (errors.size() > 0) {
143
        println "Some rules should be added to this macro to process the following remaining 'FROPOS / words' values:"
144
        errors.keySet().each { println "fropos="+it+"\twords="+errors[it].join(" | ") }
145
}