Statistics
| Revision:

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

History | View | Annotate | Download (3.8 kB)

1
package org.txm.macro.urs.edit
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
/*
17
   Distingue les Pronoms Personnels Anaphoriques (PRO.PERA) des Pronoms Personnels Déictiques (PRO.PERD)
18
   PRO.PERD = frlemma(je|me|moi|tu|te|toi|nous|vous)
19
   On rajoute aussi quelques graphies anciennes que TreeTagger ne connaît pas forcément.
20
   Inutile de différencier minuscules et majuscules. Le test gère cela très bien.
21
   Auteur : Matthieu Quignard (ICAR)
22
   Date : 19/12/2017
23
 */
24

    
25
listeLemmesDeictiques = ["je", "me", "moi", "tu", "te", "toi", "nous", "vous"]
26
listeFormesDeictiques = ["moy", "toy"]
27

    
28

    
29
// CORPS DU SCRIPT
30

    
31
if (!(corpusViewSelection instanceof MainCorpus)) {
32
        println "Corpora selection is not a Corpus: "+corpusViewSelection
33
        return
34
}
35

    
36
// BEGINNING OF PARAMETERS
37
@Field @Option(name="unit_type", usage="", widget="String", required=true, def="MENTION")
38
def unit_type
39
@Field @Option(name="pos_property_name", usage="", widget="String", required=true, def="frlemma")
40
def pos_property_name
41
if (!ParametersDialog.open(this)) return
42

    
43
corpus = corpusViewSelection
44
CQI = CQPSearchEngine.getCqiClient()
45
word = corpus.getWordProperty()
46
posProperty = corpus.getProperty(pos_property_name)
47
if (posProperty == null) {
48
        println "Error: CQP corpus does not contains the word property with name=$pos_property_name"
49
        return
50
}
51
analecCorpus = URSCorpora.getCorpus(corpus)
52
vue = URSCorpora.getVue(corpus)
53
structure = analecCorpus.getStructure()
54
if (!structure.getUnites().contains(unit_type)) { // check if the structure contains the unit_type units
55
        println "Error: corpus structure does not contains unit with name=$unit_type"
56
        return
57
}
58

    
59
CATEGORIE = "CATEGORIE"
60
structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.PERA")
61
structure.ajouterVal(Unite.class, unit_type, CATEGORIE, "PRO.PERD")
62

    
63
def nModified = 0
64
def nIgnored = 0
65
def nProPerA = 0
66
def nProPerD = 0
67

    
68
errors = new HashMap()
69
def units = analecCorpus.getUnites(unit_type)
70
units.sort() { a, b -> a.getDeb() <=> b.getDeb() ?: a.getFin() <=> b.getFin() }
71

    
72
for (Unite unit : units) { // process all units
73
        def prop = unit.getProp(CATEGORIE)
74
        
75
        if ( (prop == null) || (!prop.contains("PRO.PER")) ) {
76
                // On ne s'intéresse qu'aux pronoms personnels (PRO.PER)
77
                // Les autres sont ignorés
78
                nIgnored++
79
        } else {
80
                // Pour les mentions de type "PRO.PER", on cherche le premier mot
81
                int[] positions = null
82
                if (unit.getDeb() == unit.getFin()) positions = [unit.getDeb()]
83
                else positions = (unit.getDeb()..unit.getFin())
84
        
85
                // On récupère le lemme du premier mot
86
                def tags = CQI.cpos2Str(posProperty.getQualifiedName(), positions)
87
                def firstTag = tags[0];
88
                
89
                // On récupère la forme du premier mot en minuscule
90
                def forme = CQI.cpos2Str(word.getQualifiedName(), positions)[0].toLowerCase()
91
                
92
                if (listeLemmesDeictiques.contains(firstTag)) {
93
                        // Si le lemme est dans la liste de déictiques, on recatégorise en PRO.PERD
94
                        vue.setValeurChamp(unit, CATEGORIE, "PRO.PERD")
95
                        nProPerD++
96
                } else if (listeFormesDeictiques.contains(forme)) {
97
                        // Si la forme du premier mot dans la liste des formes des déictiques, on recatégorise en PRO.PERD
98
                        vue.setValeurChamp(unit, CATEGORIE, "PRO.PERD")
99
                        nProPerD++
100
                } else {
101
                        // Sinon on recatégorise en PRO.PERA
102
                        vue.setValeurChamp(unit, CATEGORIE, "PRO.PERA")
103
                        nProPerA++
104
                }
105
                nModified++
106
        }
107
}
108

    
109
println "Result:"
110
println "- $nModified units of type $unit_type have been modified."
111
println "- $nIgnored units of type $unit_type have not been modified.\n"
112

    
113
println "- $nProPerA mentions de ProPer anaphoriques."
114
println "- $nProPerD mentions de ProPer déictiques."