Statistics
| Revision:

root / tmp / org.txm.analec.rcp / src / org / txm / macro / analec / edit / Fropos2CategorieMacro.groovy @ 1166

History | View | Annotate | Download (4.8 kB)

1 671 mdecorde
package org.txm.macro.analec.edit
2 671 mdecorde
3 671 mdecorde
import org.apache.commons.lang.*
4 671 mdecorde
import org.kohsuke.args4j.*
5 671 mdecorde
import groovy.transform.*
6 671 mdecorde
import org.txm.*
7 671 mdecorde
import org.txm.rcp.swt.widget.parameters.*
8 671 mdecorde
import org.txm.analec.*
9 671 mdecorde
import org.txm.searchengine.cqp.*
10 671 mdecorde
import org.txm.searchengine.cqp.corpus.*
11 671 mdecorde
import visuAnalec.Message.*
12 671 mdecorde
import visuAnalec.donnees.*
13 671 mdecorde
import visuAnalec.elements.*
14 671 mdecorde
import visuAnalec.vue.*
15 671 mdecorde
16 671 mdecorde
def testRules(def positions, def Mention) {
17 671 mdecorde
        def catégorie = null
18 671 mdecorde
19 671 mdecorde
// DÉFINITION DES RÈGLES
20 671 mdecorde
// elles sont testées les unes après les autres.
21 671 mdecorde
// Dès qu'une règle est appliquée les suivantes sont ignorées.
22 671 mdecorde
23 671 mdecorde
// Règles de type CONTIENT
24 671 mdecorde
25 671 mdecorde
             if (Mention.contains("NOMpro")) catégorie = "Nom Propre"
26 671 mdecorde
        else if (Mention.contains("DETpos")) catégorie = "Dét Possessif"
27 671 mdecorde
//  ...
28 671 mdecorde
29 671 mdecorde
// Règles de type COMMENCE ET NE CONTIENT PAS
30 671 mdecorde
31 671 mdecorde
        else if (Mention.first() == "DETpos" && !Mention.contains("NOMpro")) catégorie = "GN Possessif"
32 671 mdecorde
        else if (Mention.first() == "DETdem" && !Mention.contains("NOMpro")) catégorie = "GN Démonstratif"
33 671 mdecorde
//  ...
34 671 mdecorde
35 671 mdecorde
// Règles de type CONTIENT PLUSIEURS
36 671 mdecorde
37 671 mdecorde
        else if (Mention.contains("PROadv") || Mention.contains("ADVgen.PROadv")) catégorie = "Pronom Adverbial"
38 671 mdecorde
//  ...
39 671 mdecorde
40 671 mdecorde
// Règles de type CONTIENT ET NE CONTIENT PAS
41 671 mdecorde
42 671 mdecorde
        else if (
43 671 mdecorde
                         ( Mention.contains("DETdef") || Mention.contains("PRE.DETdef") )
44 671 mdecorde
                          &&
45 671 mdecorde
                          !Mention.contains("PROpos") && !Mention.contains("NOMpro") && !Mention.contains("PROcar")
46 671 mdecorde
                        ) catégorie = "GN Défini"
47 671 mdecorde
//  ...
48 671 mdecorde
49 671 mdecorde
// Fin des règles, aucune n'a matchée. On stocke le pattern  qu'on affichera à la fin.
50 671 mdecorde
        else {
51 671 mdecorde
                def forms = CQI.cpos2Str(word.getQualifiedName(), positions)
52 671 mdecorde
                if (!errors.containsKey(Mention)) errors[Mention] = new HashSet()
53 671 mdecorde
                errors[Mention] << forms
54 671 mdecorde
        }
55 671 mdecorde
56 671 mdecorde
        return catégorie
57 671 mdecorde
}
58 671 mdecorde
59 671 mdecorde
//
60 671 mdecorde
// FIN DE LA DÉFINITION DES RÈGLES
61 671 mdecorde
//
62 671 mdecorde
63 671 mdecorde
// CORPS DU SCRIPT
64 671 mdecorde
65 671 mdecorde
if (!(corpusViewSelection instanceof MainCorpus)) {
66 671 mdecorde
        println "Corpora selection is not a Corpus"
67 671 mdecorde
        return
68 671 mdecorde
}
69 671 mdecorde
70 671 mdecorde
// BEGINNING OF PARAMETERS
71 671 mdecorde
@Field @Option(name="unit_type", usage="", widget="String", required=true, def="MENTION")
72 671 mdecorde
def unit_type
73 671 mdecorde
@Field @Option(name="pos_property_name", usage="", widget="String", required=true, def="pos")
74 671 mdecorde
def pos_property_name
75 671 mdecorde
@Field @Option(name="reset", usage="", widget="Boolean", required=true, def="true")
76 671 mdecorde
def reset
77 671 mdecorde
if (!ParametersDialog.open(this)) return
78 671 mdecorde
79 671 mdecorde
corpus = corpusViewSelection
80 786 sjacqu01
CQI = CQPSearchEngine.getCqiClient()
81 671 mdecorde
word = corpus.getWordProperty()
82 671 mdecorde
posProperty = corpus.getProperty(pos_property_name)
83 671 mdecorde
if (posProperty == null) {
84 671 mdecorde
        println "Error: CQP corpus does not contains the word property with name=$pos_property_name"
85 671 mdecorde
        return
86 671 mdecorde
}
87 1166 mdecorde
analecCorpus = AnalecCorpora.getCorpus(corpus)
88 1166 mdecorde
vue = AnalecCorpora.getVue(corpus)
89 671 mdecorde
structure = analecCorpus.getStructure()
90 671 mdecorde
if (!structure.getUnites().contains(unit_type)) { // check if the structure contains the unit_type units
91 671 mdecorde
        println "Error: corpus structure does not contains unit with name=$unit_type"
92 671 mdecorde
        return
93 671 mdecorde
}
94 671 mdecorde
95 671 mdecorde
CATEGORIE = "CATEGORIE"
96 671 mdecorde
// Si la structure d'annotation ne contient pas CATEGORIE, on la crée avec ses valeurs
97 671 mdecorde
if (!structure.getUniteProperties(unit_type).contains(CATEGORIE)) {
98 671 mdecorde
// la propriété
99 671 mdecorde
        analecCorpus.ajouterProp(Unite.class, unit_type, CATEGORIE)
100 671 mdecorde
// les valeurs
101 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Nom Propre")
102 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Impersonnel")
103 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Interrogatif")
104 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Pronom cardinal")
105 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Démonstratif")
106 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Indéfini")
107 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom ordinal")
108 671 mdecorde
        analecCorpus.ajouterVal(Unite.class, unit_type, CATEGORIE, "Pronom Relatif")
109 671 mdecorde
//...
110 671 mdecorde
}
111 671 mdecorde
112 671 mdecorde
def nModified = 0
113 671 mdecorde
def nIgnored = 0
114 671 mdecorde
115 671 mdecorde
errors = new HashMap()
116 671 mdecorde
def units = analecCorpus.getUnites(unit_type)
117 671 mdecorde
units.sort() { a, b -> a.getDeb() <=> b.getDeb() ?: a.getFin() <=> b.getFin() }
118 671 mdecorde
for (Unite unit : units) { // process all units
119 671 mdecorde
120 671 mdecorde
        def prop = unit.getProp(CATEGORIE)
121 671 mdecorde
        if (!reset && prop != null && prop.length() > 0) continue // l'unité a déjà une CATEGORIE
122 671 mdecorde
123 671 mdecorde
        int[] positions = null
124 671 mdecorde
        if (unit.getDeb() == unit.getFin()) positions = [unit.getDeb()]
125 671 mdecorde
        else positions = (unit.getDeb()..unit.getFin())
126 671 mdecorde
127 671 mdecorde
        def Mention = CQI.cpos2Str(posProperty.getQualifiedName(), positions)
128 671 mdecorde
        def cat = testRules(positions, Mention)
129 671 mdecorde
130 671 mdecorde
        if (cat != null) {
131 671 mdecorde
                vue.setValeurChamp(unit, CATEGORIE, cat)
132 671 mdecorde
                nModified++
133 671 mdecorde
        } else {
134 671 mdecorde
                nIgnored++
135 671 mdecorde
        }
136 671 mdecorde
}
137 671 mdecorde
138 671 mdecorde
println "Result:"
139 671 mdecorde
println "- $nModified units of type $unit_type have been modified."
140 671 mdecorde
println "- $nIgnored units of type $unit_type have not been modified.\n"
141 671 mdecorde
142 671 mdecorde
if (errors.size() > 0) {
143 671 mdecorde
        println "Some rules should be added to this macro to process the following remaining 'FROPOS / words' values:"
144 671 mdecorde
        errors.keySet().each { println "fropos="+it+"\twords="+errors[it].join(" | ") }
145 671 mdecorde
}