Statistics
| Revision:

root / tmp / org.txm.analec.rcp / src / org / txm / macro / urs / edit / Fropos2CattexMacro.groovy @ 1726

History | View | Annotate | Download (9.8 kB)

1 1217 mdecorde
package org.txm.macro.urs.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 1217 mdecorde
import org.txm.annotation.urs.*
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
/*
17 671 mdecorde
Définit la catégorie grammaticale des mentions d'après le champ `frpos'
18 671 mdecorde
(tagset de TreeTagger).
19 671 mdecorde

20 671 mdecorde
La liste des catégories grammaticales est celle de CATTEX2009
21 671 mdecorde
-- Groupes nominaux :
22 671 mdecorde
        GN.NAM (noms propres) : Henri II
23 671 mdecorde
        GN.DEF (définis) : Le roi, du roi
24 671 mdecorde
        GN.IND (indéfinis) : Un roi
25 671 mdecorde
        GN.POS (possessifs) : [Mon roi]
26 671 mdecorde
        GN.DEM (demonstratif) : Ce roi
27 671 mdecorde
        GN.NUM (numéraux) : Deux rois
28 671 mdecorde
        GN.CHECK (GN indéterminés)
29 671 mdecorde
-- Déterminants
30 671 mdecorde
        DET.POS (possessifs) : [mon] roi
31 671 mdecorde
-- Pronoms
32 671 mdecorde
        PRO.PER (personnels) : je, moi, me, on, il, etc.
33 671 mdecorde
        PRO.ADV (adverbiaux) : y, en
34 671 mdecorde
        PRO.IND (indéfinis) : tout, tous, certains, plusieurs, etc.
35 671 mdecorde
        PRO.DEM (demonstratifs) : ceci, cela, ce, ça...
36 671 mdecorde
        PRO.POS (possessifs) : le mien, les nôtres...
37 671 mdecorde
        PRO.NUM (cardinaux, ordinaux) : les deux...
38 671 mdecorde
        PRO.REL (relatifs) : qui, que, quoi, duquel, etc.
39 671 mdecorde
        PRO.INT (interrogatifs)
40 671 mdecorde
        PRO.CHECK (pronoms indéterminés)
41 671 mdecorde
-- SUJ.ZERO (Sujet Zéro) : verbes conjugués, éventuellement pronominal
42 671 mdecorde

43 671 mdecorde
-- ERREUR : erreur (a priori) de mention
44 671 mdecorde
-- ADJpos : adjectif possessif à fusionner ou pas avec DETpos
45 671 mdecorde

46 671 mdecorde
*/
47 671 mdecorde
48 671 mdecorde
49 671 mdecorde
50 671 mdecorde
def testRules(def positions, def Mention) {
51 671 mdecorde
        def catégorie = null
52 671 mdecorde
53 671 mdecorde
        // la forme du premier mot de la mention s'appelle 'forme'
54 671 mdecorde
        def forme = CQI.cpos2Str(word.getQualifiedName(), positions)[0].toLowerCase()
55 671 mdecorde
56 671 mdecorde
57 671 mdecorde
        if (Mention.length == 1) {
58 671 mdecorde
59 671 mdecorde
                     if (Mention.first() == "NOMpro"    ) catégorie = "GN.NAM"
60 671 mdecorde
                else if (Mention.first() == "DETpos") catégorie = "DET.POS"
61 671 mdecorde
                else if (Mention.first() == "ADJpos") catégorie = "ADJ.POS"
62 671 mdecorde
                else if (Mention.first() == "PROdem") catégorie = "PRO.DEM"
63 671 mdecorde
                else if (Mention.first() == "PROind") catégorie = "PRO.IND"
64 671 mdecorde
                else if (Mention.first() == "PROcar") catégorie = "PRO.NUM"
65 671 mdecorde
                else if (Mention.first() == "PROord") catégorie = "PRO.NUM" // fusionné avec Cardinaux
66 671 mdecorde
                else if (Mention.first() == "PROpos") catégorie = "PRO.POS"
67 671 mdecorde
                else if (Mention.first() == "PROper") catégorie = "PRO.PER"
68 671 mdecorde
                else if (Mention.first() == "PROimp") catégorie = "PRO.PER" // fusionné avec Pronoms Personnels
69 671 mdecorde
                else if (Mention.first() == "PROint") catégorie = "PRO.INT"
70 671 mdecorde
                else if (Mention.first() == "PROadv") catégorie = "PRO.ADV"
71 671 mdecorde
                else if (Mention.first() == "PROrel") catégorie = "PRO.REL"
72 671 mdecorde
73 671 mdecorde
                else if (Mention.first().contains("VER")) catégorie = "SUJ.ZERO"
74 671 mdecorde
75 671 mdecorde
                else if (Mention.first() == "NOMcom") catégorie = "GN.CHECK"
76 671 mdecorde
77 671 mdecorde
                // Pronoms "contractés"
78 671 mdecorde
                else if (Mention.first() == "PROper.PROper") catégorie = "PRO.PER"  // double pronom personnel : ex 'jel' pour 'je le'
79 671 mdecorde
                else if (Mention.first() == "ADVgen.PROper") catégorie = "PRO.PER"  // adverbe + pronom personnel : ex 'sil' pour 'si le'
80 671 mdecorde
                else if (Mention.first() == "ADVneg.PROper") catégorie = "PRO.PER"  // adverbe + pronom personnel : ex 'nel' pour 'ne le'
81 671 mdecorde
82 671 mdecorde
                // Erreurs de mention
83 671 mdecorde
                else if (Mention.first() == "ADVgen") catégorie = "ERREUR"  // un adverbe seul n'est jamais référentiel
84 671 mdecorde
                else if (Mention.first() == "ADVneg") catégorie = "ERREUR"  // un adverbe seul n'est jamais référentiel
85 671 mdecorde
                else if (Mention.first() == "PRE") catégorie = "ERREUR"  // une preposition seule n'est jamais référentielle
86 671 mdecorde
                else if (Mention.first() == "ADJqua") catégorie = "ERREUR"  // un adjectif seul n'est jamais référentiel
87 671 mdecorde
                else if (Mention.first() == "ADJind") catégorie = "ERREUR"  // un adjectif seul n'est jamais référentiel
88 671 mdecorde
                else if (Mention.first() == "INJ") catégorie = "ERREUR"  // une interjection seule n'est jamais référentielle
89 671 mdecorde
90 671 mdecorde
                else catégorie = "PRO.CHECK"
91 671 mdecorde
92 671 mdecorde
        } else if (Mention.length == 2) {
93 671 mdecorde
                if ( (Mention[0] == "NOMpro") || (Mention[1] == "NOMpro") ) catégorie = "GN.NAM"
94 671 mdecorde
                else if (Mention[1] == "PROrel") catégorie = "PRO.REL"  // "ce que" prioritaire sur "celui là"
95 671 mdecorde
                else if (Mention[1] == "PROpos") catégorie = "PRO.POS"  // "les miens"
96 671 mdecorde
                else if (Mention[1].contains("car")) catégorie = "PRO.NUM"  // "les deux"
97 671 mdecorde
                else if (Mention[1] == "PROdem") catégorie = "PRO.DEM"  // "Tout cela"
98 671 mdecorde
99 671 mdecorde
                else if (Mention[0].contains("DET") && Mention[1].contains("PROind")) catégorie = "PRO.IND" // "les autres"
100 671 mdecorde
101 671 mdecorde
                else if (Mention[0].contains("VER") && Mention[1].contains("VER")) catégorie = "SUJ.ZERO" // verbe temps composé
102 671 mdecorde
103 671 mdecorde
                else if (!Mention[0].contains("NOM") && !Mention[0].contains("ADJ") && !Mention[1].contains("NOM") && !Mention[1].contains("ADJ")) {
104 671 mdecorde
                        if (Mention[0] == "PROdem") catégorie = "PRO.DEM"
105 671 mdecorde
                        else if (Mention[1] == "VERinf") catégorie = "GN.CHECK" // Verbe substantivé
106 671 mdecorde
                        else if (Mention[1] == "VERppa") catégorie = "GN.CHECK" // Verbe substantivé
107 671 mdecorde
                        else if ( Mention[0].contains("PRE") && (Mention[1] == "PROper")) catégorie = "GN.CHECK" // Complément de nom
108 671 mdecorde
                        else catégorie = "PRO.CHECK"
109 671 mdecorde
                }
110 671 mdecorde
                else catégorie = "GN.CHECK"
111 671 mdecorde
        }
112 671 mdecorde
113 671 mdecorde
        if ( (catégorie == null) || (catégorie == "GN.CHECK") ) {
114 671 mdecorde
                // on est dans les GN
115 671 mdecorde
116 671 mdecorde
                if (Mention[0] == "DETcar"     ) catégorie = "GN.NUM"
117 671 mdecorde
                else if (Mention[0] == "DETord"     ) catégorie = "GN.NUM"
118 671 mdecorde
119 671 mdecorde
                else if (Mention.contains("NOMpro")) catégorie = "GN.NAM"
120 671 mdecorde
121 671 mdecorde
                else if (Mention[0] == "DETpos" ) catégorie = "GN.POS"
122 671 mdecorde
123 671 mdecorde
                else if (Mention[0] == "PROdem" ) catégorie = "GN.DEM"
124 671 mdecorde
                else if (Mention[0] == "DETdem" ) catégorie = "GN.DEM"
125 671 mdecorde
126 671 mdecorde
                else if (Mention[0] == "PRE.DETdef" ) catégorie = "GN.DEF"
127 671 mdecorde
                else if (Mention[0] == "DETdef")   catégorie = "GN.DEF"
128 671 mdecorde
129 671 mdecorde
                else if (Mention[0] == "DETndf") catégorie = "GN.IND"
130 671 mdecorde
                else if (Mention[0] == "DETind") catégorie = "GN.IND"
131 671 mdecorde
132 671 mdecorde
                else if (Mention[0] == "PROind" ) catégorie = "GN.IND"
133 671 mdecorde
                else if (Mention[0].contains("PRP")) catégorie = "GN.IND"
134 671 mdecorde
                else if (Mention[0].contains("ADJ")) catégorie = "GN.IND"
135 671 mdecorde
                else if (Mention[0].contains("NOM")) catégorie = "GN.IND"
136 671 mdecorde
137 671 mdecorde
138 671 mdecorde
139 671 mdecorde
                else catégorie = "GN.CHECK"
140 671 mdecorde
        }
141 671 mdecorde
142 671 mdecorde
143 671 mdecorde
144 671 mdecorde
        return catégorie
145 671 mdecorde
}
146 671 mdecorde
147 671 mdecorde
//
148 671 mdecorde
// FIN DE LA DÉFINITION DES RÈGLES
149 671 mdecorde
//
150 671 mdecorde
151 671 mdecorde
// CORPS DU SCRIPT
152 671 mdecorde
153 671 mdecorde
if (!(corpusViewSelection instanceof MainCorpus)) {
154 671 mdecorde
        println "Corpora selection is not a Corpus"
155 671 mdecorde
        return
156 671 mdecorde
}
157 671 mdecorde
158 671 mdecorde
// BEGINNING OF PARAMETERS
159 671 mdecorde
@Field @Option(name="unit_type", usage="", widget="String", required=true, def="MENTION")
160 671 mdecorde
def unit_type
161 671 mdecorde
@Field @Option(name="pos_property_name", usage="", widget="String", required=true, def="pos")
162 671 mdecorde
def pos_property_name
163 671 mdecorde
@Field @Option(name="reset", usage="", widget="Boolean", required=true, def="true")
164 671 mdecorde
def reset
165 671 mdecorde
if (!ParametersDialog.open(this)) return
166 671 mdecorde
167 671 mdecorde
corpus = corpusViewSelection
168 786 sjacqu01
CQI = CQPSearchEngine.getCqiClient()
169 671 mdecorde
word = corpus.getWordProperty()
170 671 mdecorde
posProperty = corpus.getProperty(pos_property_name)
171 671 mdecorde
if (posProperty == null) {
172 671 mdecorde
        println "Error: CQP corpus does not contains the word property with name=$pos_property_name"
173 671 mdecorde
        return
174 671 mdecorde
}
175 1217 mdecorde
analecCorpus = URSCorpora.getCorpus(corpus)
176 1217 mdecorde
vue = URSCorpora.getVue(corpus)
177 671 mdecorde
structure = analecCorpus.getStructure()
178 671 mdecorde
if (!structure.getUnites().contains(unit_type)) { // check if the structure contains the unit_type units
179 671 mdecorde
        println "Error: corpus structure does not contains unit with name=$unit_type"
180 671 mdecorde
        return
181 671 mdecorde
}
182 671 mdecorde
183 671 mdecorde
CATEGORIE = "CATEGORIE"
184 671 mdecorde
// Si la structure d'annotation ne contient pas CATEGORIE, on la crée avec ses valeurs
185 671 mdecorde
if (!structure.getUniteProperties(unit_type).contains(CATEGORIE)) {
186 671 mdecorde
// la propriété
187 671 mdecorde
        analecCorpus.ajouterProp(Unite.class, unit_type, CATEGORIE)
188 671 mdecorde
// les valeurs
189 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.NAM")
190 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.DEF")
191 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.IND")
192 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.POS")
193 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.DEM")
194 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.NUM")
195 671 mdecorde
196 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "GN.CHECK")
197 671 mdecorde
198 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "DET.POS")
199 671 mdecorde
200 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.PER")
201 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.ADV")
202 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.IND")
203 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.DEM")
204 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.POS")
205 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.NUM")
206 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.INT")
207 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.REL")
208 671 mdecorde
209 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.CHECK")
210 671 mdecorde
211 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "SUJ.ZERO")
212 671 mdecorde
213 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "ERREUR")
214 671 mdecorde
        structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "ADJ.POS")
215 671 mdecorde
216 671 mdecorde
//...
217 671 mdecorde
}
218 671 mdecorde
219 671 mdecorde
def nModified = 0
220 671 mdecorde
def nIgnored = 0
221 671 mdecorde
222 671 mdecorde
errors = new HashMap()
223 671 mdecorde
def units = analecCorpus.getUnites(unit_type)
224 671 mdecorde
units.sort() { a, b -> a.getDeb() <=> b.getDeb() ?: a.getFin() <=> b.getFin() }
225 671 mdecorde
for (Unite unit : units) { // process all units
226 671 mdecorde
227 671 mdecorde
        def prop = unit.getProp(CATEGORIE)
228 671 mdecorde
        if (!reset && prop != null && prop.length() > 0) continue // l'unité a déjà une CATEGORIE
229 671 mdecorde
230 671 mdecorde
        int[] positions = null
231 671 mdecorde
        if (unit.getDeb() == unit.getFin()) positions = [unit.getDeb()]
232 671 mdecorde
        else positions = (unit.getDeb()..unit.getFin())
233 671 mdecorde
234 671 mdecorde
        def Mention = CQI.cpos2Str(posProperty.getQualifiedName(), positions)
235 671 mdecorde
        def cat = testRules(positions, Mention)
236 671 mdecorde
237 671 mdecorde
        if (cat != null) {
238 671 mdecorde
                vue.setValeurChamp(unit, CATEGORIE, cat)
239 671 mdecorde
                nModified++
240 671 mdecorde
        } else {
241 671 mdecorde
                nIgnored++
242 671 mdecorde
        }
243 671 mdecorde
}
244 671 mdecorde
245 671 mdecorde
println "Result:"
246 671 mdecorde
println "- $nModified units of type $unit_type have been modified."
247 671 mdecorde
println "- $nIgnored units of type $unit_type have not been modified.\n"
248 671 mdecorde
249 671 mdecorde
if (errors.size() > 0) {
250 671 mdecorde
        println "Some rules should be added to this macro to process the following remaining 'FROPOS / words' values:"
251 671 mdecorde
        errors.keySet().each { println "fropos="+it+"\twords="+errors[it].join(" | ") }
252 671 mdecorde
}