Analyse morphologique des mots

Discussions sur les projets et applications développés en liaison avec une suite bureautique libre.

Modérateur: Vilains modOOs

Analyse morphologique des mots

Messagepar OlivierR » 22 Juil 2010 20:37

Bonjour à tous,

Je prévois de faire une extension qui permettrait de récupérer les informations morphologiques des mots fournies par Hunspell. Pour que vous ayez une idée de la chose, ça se présente par exemple sous la forme:

Code : Tout sélectionner   AgrandirRéduire
mangé  st:mangée po:adj is:mas
mangé  st:manger po:verb is:ppas is:mas is:sg

attaqué  st:attaquée po:adj is:mas
attaqué  st:attaquer po:verb is:ppas is:mas is:sg

manqué  st:manquée po:adj is:mas
manqué  st:manquer po:verb is:ppas is:mas is:sg

René  st:renaître po:verb is:ppas is:mas is:sg
René  st:René po:pnom is:mas

abcédé  st:abcéder po:verb is:ppas is:mas is:sg

donne  st:donne po:nom is:fem
donne  st:donner po:verb is:spré is:3sg
donne  st:donner po:verb is:spré is:1sg
donne  st:donner po:verb is:ipré is:3sg
donne  st:donner po:verb is:ipré is:1sg

a  st:a po:?
a  st:a po:nom is:mas is:inv
a  st:avoir po:avoir is:ipré is:3sg

dire  st:dire po:verb is:infi

dires  st:dires po:nom is:mas is:pl

actions  st:action po:nom is:fem is:pl
actions  st:acter po:verb is:spré is:1pl
actions  st:acter po:verb is:iimp is:1pl

action  st:action po:nom is:fem


Ce n’est pas très lisible, mais il sera facile de modifier ces informations pour les rendre plus intelligibles.

Questions :
1. Est-il possible d’ajouter des entrées contextuelles au menu contextuel de Writer?
Par exemple: avec le bouton droit sur le mot donne, le menu contextuel afficherait les entrées suivantes supplémentaires:
donne racine: donne - nature grammaticale: nom féminin
donne racine: donner - nature grammaticale: verbe - ind. présent - 3e pers. sing
donne racine: donner - nature grammaticale: verbe - ind. présent - 1ère pers. sing
donne racine: donner - nature grammaticale: verbe - subj. présent - 3e pers. sing
donne racine: donner - nature grammaticale: verbe - subj. présent - 1ère pers. sing

Ces entrées seraient uniquement informatives et n’exécuteraient aucune action.

2. Le livre Programmation pour OpenOffice.org 3 est-il adapté pour apprendre à faire des extensions? J’ai passé ma journée à perdre mon temps dans le wiki OOo et à fouiner dans les extensions existantes pour trouver ce que je cherchais, mais c’est plutôt difficile de s’y retrouver. Bref, j’ai l’impression que je vais perdre pas mal de temps si je ne trouve pas un livre adéquat.
Dans quelle mesure ce livre permet-il de programmer en Python?

3. Peut-on mêler du code Basic avec du code Python dans une même extension, dans la mesure ou le code des programmes ne fait pas du tout la même chose? Par exemple, je pourrais envisager de faire ce que j’ai dit plus haut en Basic, mais ceci devrait être intégré à une extension en Python (analyse grammaticale).
Dernière édition par OlivierR le 25 Juil 2010 17:28, édité 3 fois.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar Churay » 22 Juil 2010 22:02

Bonsoir,

OlivierR a écrit:1. Est-il possible d’ajouter des entrées contextuelles au menu contextuel de Writer?

Ca l'est pour calc, donc ça doit l'être pour writer : voir le post de Pierre-Yves et son code à adapter.

2. Le livre Programmation pour OpenOffice.org est-il adapté pour apprendre à faire des extensions?

C'est abordé rapidement mais avec la même qualité que l'ensemble des sujets traités. Il y a ce post et quelques adeptes de l'oxt sur le forum ;)

Dans quelle mesure ce livre permet-il de programmer en Python?

Ce n'est pas sa vocation : il renvoie au Developer'sGuide.

3. Peut-on mêler du code Basic avec du code Python dans une même extension, dans la mesure ou le code des programmes ne fait pas du tout la même chose? Par exemple, je pourrais envisager de faire ce que j’ai dit plus haut en Basic, mais ceci devrait être intégré à une extension en Python (analyse grammaticale).

Oui : le Wiki

cOOordialement

;)
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: Analyse morphologique des mots

Messagepar Pierre-Yves Samyn » 23 Juil 2010 10:18

Bonjour

Tu peux peut-être regarder du côté des smart tags : http://wiki.services.openoffice.org/wik ... Smart_Tags

Je ne pourrais en dire plus pour le moment... je n'ai jamais pris le temps de creuser les possibilités offertes, bien qu'elles semblent très intéressantes.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Analyse morphologique des mots

Messagepar Churay » 24 Juil 2010 10:53

Bonjour,

Concernant l'ajout d'entrées contextuelles, une rapide modification de la gestion proposée par PYS pour calc (Merci : j'adore ce code...) permet de faire un ajout d'options et d'un séparateur qui ne se place pas vraiment au bon endroit...
(nul n'est parfait et je suis un peu lent et beaucoup flemmard ;)).
 Ajout : Les tests pour appeler, de divers endroits, le générateur de séparateur n'y changent rien 


Quand à la rapidité de la modification, tout est relatif : merci Alain pour le curseur dans le curseur...

cOOodialement

 Ajout : je n'ai pas associé registerContextMenuInterceptor au chargement du document : donc à lancer manuellement... 
Pièces jointes
MenuContextuel.odt
Adaptation du PYS_Inside
(11.67 Kio) Téléchargé 288 fois
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: Analyse morphologique des mots

Messagepar OlivierR » 24 Juil 2010 12:05

Merci. Je n’avais pas vu le code de PYS.
Merci aussi pour le fichier. Je vais tester ça.

Edit: Ça avance.
Je parviens à présent à récupérer les données morphologiques par le biais de Hunspell. Il ne me reste à mettre en forme les données avant de les injecter dans le menu déroulant. Par contre, impossible d’introduire un séparateur autre que vide avec cette méthode. Il faudra donc que je mette un séparateur en dur dans le code de l’extension si c’est possible, avec certainement une entrée pour accéder à un tableau de commande ou des options.

J’ai commandé le livre de Programmation OpenOffice.org 3, mais je vais probablement essayer de tout faire en Python. Basic n’est pas assez civilisé pour moi. Cf. mes déboires récents. viewtopic.php?f=8&p=128695 :aie:

Les SmartTags sont intéressants, mais pour autre chose, peut-être pour souligner d’autres types potentiels d’erreurs, mais je verrai ça plus tard.
Dernière édition par OlivierR le 25 Juil 2010 17:29, édité 3 fois.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar Pierre-Yves Samyn » 25 Juil 2010 08:44

OlivierR a écrit:Les SmartTags sont intéressants, mais pour autre chose, peut-être pour souligner d’autres types potentielles d’erreurs, mais je verrais ça plus tard.


Pour visualiser les possibilités voir l'extension : http://extensions.services.openoffice.o ... lityReport

The extension also uses SmartTags to highlight difficult words and phrases in your text, as identified by http://www.plainenglish.co.uk/. The ‘SimpleText SmartTags’ provide suitable alternatives for these phrases which can be inserted automatically into the text.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Analyse morphologique des mots

Messagepar Churay » 25 Juil 2010 14:40

Yeap

Comment fait-on pour emmagasiner (et mémoriser) autant de connaissance ?

Et je ne fais référence qu'à 00o...

J'échange ma reconnaissance éternelle (quand on aime on ne compte pas ;)) contre la somme de vos connaissances OOo

Oki... :arrow:
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: Analyse morphologique des mots

Messagepar OlivierR » 25 Juil 2010 15:42

Pour ceux que ça intéresse, la fonction spell de XSpellChecker offre des possibilités non-documentées dans l’API. http://api.openoffice.org/docs/common/r ... ecker.html

Au lieu d’envoyer un mot, vous pouvez envoyer une commande en XML.
Code : Tout sélectionner   AgrandirRéduire
<?xml?><query type="stem"><word>mot</word></query>

Code : Tout sélectionner   AgrandirRéduire
<?xml?><query type="analyze"><word>mot</word></query>

Ces commandes renvoient un objet de type XSpellAlternatives dans lequel se trouvera respectivement les racines des mots demandés ou une chaîne contenant les informations morphologiques en XML:
Code : Tout sélectionner   AgrandirRéduire
<code><a>result1</a><a>result2</a>...</code>

Dans le second cas, pour l’instant, vous n’obtiendrez pour l’instant rien de plus que la racine, puisque le dictionnaire actuel ne contient aucune donnée morphologique. Mais ce sera le cas quand cette extension sera au point.
Pour ceux qui veulent tester, voici une pré-version d’un dictionnaire avec des informations morphologiques (le format est totalement susceptible de changer, ce n’est que pour faire des tests).

dico_morph.zip
Remplacez les fichiers de votre extension dictionnaire par ceux-ci (et redémarrez).
(296.72 Kio) Téléchargé 1007 fois


Le code pour tester
Code : Tout sélectionner   AgrandirRéduire
sub Spell
   dim locale as new com.sun.star.lang.Locale
   dim word as string
   dim bWordValid as boolean
   dim oSpellChecker as object
   dim oResAlternatives as object
   dim mRes() as string
   dim s, res as string
   
   locale.Language="fr" 'ISO 639
   locale.Country="FR"  'ISO 3166
   
   oSpellChecker = createUnoService("com.sun.star.linguistic2.SpellChecker")
   
   if not oSpellChecker.hasLocale(locale) Then
      msgbox "Le dictionnaire français est introuvable"
      exit sub
   endif
   'XRay spellChecker
   word = inputbox("Mot à analyser:")
   while word <> ""
      oResAlternatives = oSpellChecker.spell("<?xml?><query type='analyze'><word>" + word + "</word></query>", locale, array())
      if oResAlternatives.getAlternativesCount() > 0 then
         mRes = oResAlternatives.getAlternatives()
         res = ""
         for each elem in mRes()
            res = res + elem + chr(13)
         next elem
         msgbox (word + " : " + str(oResAlternatives.getAlternativesCount()) + " élément(s)" + chr(13) + res)
      else
         msgbox (word + " : aucun résultat")
      endif
      word = inputbox("Mot à vérifier:")
   wend
end sub
Dernière édition par OlivierR le 25 Juil 2010 17:30, édité 1 fois.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar OlivierR » 25 Juil 2010 15:45

@PYS:
Oui, en fait, cette extension fait ce que je pensais faire avec les SmartTags, à savoir souligner les termes grammaticalement corrects, mais douteux. Par exemple, age (élément de la charrue) est un mot rare, une faute d’orthographe pour ceux qui veulent écrire âge.

Mais je n’en suis pas encore là.
Je n’aime décidément guère Basic, je vais voir si je peux tout faire en Python.
J’ai trouvé un commencement de code en Python pour faire un menu contextuel. http://user.services.openoffice.org/en/ ... 13#p123613
Je vais voir ce que je peux faire avec ça. Si vous vous sentez d’humeur de m’aider, bienvenue à vous. :)

Il devrait être possible de créer un séparateur correct. J’ai trouvé plusieurs extensions qui y parviennent, mais le code est compilé.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar OlivierR » 27 Juil 2010 17:38

Je fais des infidélités au forum francophone, car il semple y avoir plus d’amoureux de Python sur le forum anglophone.
Je rame toujours: http://user.services.openoffice.org/en/ ... p?p=150316
Je n’ai pas de messages d’erreurs, et j’ai passé des heures juste pour trouver une indentation erronée suite à un copier-coller (des tabulations réelles et d’espaces étaient mélangées). :fou:
Que de temps perdu! Je veux des messages d’erreur! :aie:
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar olivier-denis » 13 Août 2010 08:41

Bonjour OlivierR, moi c'est OlivierD :D

J'aurai tendance à reformuler ton projet en "intégration de fonctions d'un lemmatiseur (cf ci dessous) au traitement de texte de OpenOffice".
J'ai moi même posté un sujet en juillet sur la gestion d'annotations de texte (viewtopic.php?f=3&t=23614&p=128532&hilit=olivier+denis#p128532) et j'aimerai trouver une extension d'OpenOffice qui intègre des fonctions d'indexation automatique de type Lucene (http://lucene.apache.org/java/docs/index.html)

Tout cela pour dire que le traitement de texte d'OpenOffice semble la plateforme idéale pour intégrer des fonctionnalités d'analyse de texte automatique ou assistée. La communauté scientifique du traitement automatique de la langue naturelle (TALN) pense-t-elle cela aussi ? :) Une université canadienne le pense aussi apparemment (http://www.bibl.ulaval.ca/archimede/). Je n'ai pas repéré à ce jour de contribution universitaire française.

Petite précision me concernant : je ne suis plus universitaire, et je ne suis plus développeur même si je l'ai été longtemps et que "j'ai de beaux restes". Je ne souhaite pas me lancer dans du développement long mais peut consacrer du temps à résoudre des problèmes d'intégration de fonctionnalités si les API sont bien conçues.

Pour savoir si je peux contribuer à ton projet car certains points recouvrent mes préoccupations :
- est-ce que tu souhaites faire correspond bien à la description de la lemmatisation d'un mot ?
- disposes-tu d'un lemmatiseur ? ou bien l'as-tu développé entièrement en python ?


Un lemmatiseur est un programme de traitement automatique du langage qui permet de passer d'un mot portant des marques de flexion (pluriel, forme conjuguée d'un verbe...) à sa forme de référence (lemme ou forme canonique) ou inversement.
Sources : http://www.profession-traducteur.net/outils/outils.htm


Bien cordialement,
Olivier
OpenOffice 3.2.1 WindowsXP
olivier-denis
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 21 Juil 2010 10:11

Re: Analyse morphologique des mots

Messagepar olivier-denis » 13 Août 2010 09:10

Pierre-Yves Samyn a écrit:Pour visualiser les possibilités voir l'extension : http://extensions.services.openoffice.o ... lityReport


J'ai installé l'extension Readability Report 2.0.0.b.1 et j'aimerai bien voir le code source, mais je ne vois rien dans Outils/Macros/Gérer/{OpenOfficeBasic, Python, BeanShell, Javascript }.

Comment faire ?

Merci,
Olivier
OpenOffice 3.2.1 WindowsXP
olivier-denis
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 21 Juil 2010 10:11

Re: Analyse morphologique des mots

Messagepar OlivierR » 13 Août 2010 20:07

Bonjour à tous,

Peu de nouvelles ces derniers temps, car mon esprit vagabonde beaucoup et j'ai bien du mal à me concentrer sur ce que je fais. Mes flâneries tendent à m'éloigner des terres numériques et à explorer d'autres mondes plus envoûtant. 8) Bref, merci de votre patience.

olivier-denis a écrit:J'aurai tendance à reformuler ton projet en "intégration de fonctions d'un lemmatiseur (cf ci dessous) au traitement de texte de OpenOffice".

Il ne s'agit pas de trouver uniquement le lemme des mots, mais d'indiquer leur nature, leur genre, le nombre, et si c'est une conjugaison, laquelle. En fait, le lemme est l'information qui m'intéresse le moins, sauf pour les verbes.

Mais ça, ça se fait très facilement (enfin, facilement après des mois, des années à construire un dictionnaire capable de fournir ces informations, je veux dire). Il suffit d'interroger le correcteur orthographique avec la commande adéquate. Le plus dur fut de réussir à afficher les informations dans le menu contextuel.

Voilà ce que ça donne:
ctxmenu.jpg
Analyse morphologique dans menu contextuel, sur le mot "acquis".

st signifie stem = racine.
po signifie POS (part of speech) = nature grammaticale
is signifie inflexional suffix, ici je stocke le genre, le nombre, la conjugaison, etc.

Note: pour l'instant, ces informations ne sont pas reformatées en un français intelligible, car elle sont susceptibles de changer de forme. Ce n'est qu'un dictionnaire de test, avec des erreurs, car j'ai fait la conversion sans me soucier du détail (is:epi est de trop).
Note 2: Dans notre dictionnaire, les formes féminines sont les lemmes, car il est facile d'engendrer les formes masculines à partir des formes féminines, tandis que l'inverse s'avère compliqué. Par exemple, avec les mots en -eur :
- acteur devient actrice,
- auteur devient auteure,
- docteur devient doctoresse ou docteure,
- chanteur devient chanteuse.
Impossible de générer les formes féminines avec une règle simple, tandis que l'inverse est possible.

Pour l'instant, mon code fonctionne, mais je n'en suis pas satisfait, parce qu'il n'est pas très propre. Je passe par un contournement (le même que dans l'extension fournie par Pierre-Yves plus haut, mais en Python). Le séparateur semble correct, mais c'est un avorton difforme extrait au forceps de l'API d'OOo.
Bref, il faut encore que je fasse part de mes tests à Bernard (bm92), histoire de faire les choses correctement.
viewtopic.php?f=8&t=23815

olivier-denis a écrit:J'ai moi même posté un sujet en juillet sur la gestion d'annotations de texte (viewtopic.php?f=3&t=23614&p=128532&hilit=olivier+denis#p128532) et j'aimerai trouver une extension d'OpenOffice qui intègre des fonctions d'indexation automatique de type Lucene (http://lucene.apache.org/java/docs/index.html)


Le japonais qui m'a aidé sur le forum anglophone a déjà écrit une extension en Python sur les SmartTags: http://hermione.s41.xrea.com/pukiwiki/i ... obbs2%2F85
(Je n'ai pas eu le temps de tester, mais ça semble très intéressant.)

Il existe aussi une extension en Python qui liste tous les mots d'un texte et compte les occurrences: http://extensions.services.openoffice.o ... t/Linguist
C'était ma modeste contribution à cette extension, qui peut-être grandement améliorée je pense. :wink:

Avec ça, il te suffit d'apprendre à générer des commentaires automatiquement, et tu devrais pouvoir générer quelque chose de semblable à l'objet de tes désirs: viewtopic.php?p=130154#p130154
Mais je doute qu'il soit possible de changer la couleur des smarttags.

olivier-denis a écrit:Tout cela pour dire que le traitement de texte d'OpenOffice semble la plateforme idéale pour intégrer des fonctionnalités d'analyse de texte automatique ou assistée. La communauté scientifique du traitement automatique de la langue naturelle (TALN) pense-t-elle cela aussi ? :)

Aucune idée.

J'ai installé l'extension Readability Report 2.0.0.b.1 et j'aimerai bien voir le code source, mais je ne vois rien dans Outils/Macros/Gérer/{OpenOfficeBasic, Python, BeanShell, Javascript }.

Comment faire ?

Une extension est un fichier zip.
Dans ce fichier .zip, le code est dans les fichiers .jar, qui sont aussi des fichiers .zip.
Les fichiers .class sont du java compilé que tu devrais pouvoir lire avec:
http://www.zdnet.fr/telecharger/logicie ... 88971s.htm
http://members.fortunecity.com/neshkov/dj.html#
Comme je ne programme pas en Java, j'ignore ce que ça vaut.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar olivier-denis » 20 Août 2010 11:10

Merci pour cette mine d'informations :D .
J'ai mis du temps à te répondre car je voulais en premier regarder le détail des références que tu donnes. Il y en a tellement que j'écris avant d'avoir tout essayé :!:
En passant, quel éditeur utilises-tu pour python ? Je viens d'essayer Ulipad mais j'obtiens un fonctionnement bizarre : il veut bien éditer correctement du python mais il ne veut pas ouvrir un fichier test.py - l'explorateur de la fonction 'ouvrir un fichier' ne "voit" pas les fichiers, même quand on sélectionne 'tous type..."

Olivier
OpenOffice 3.2.1 WindowsXP
olivier-denis
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 21 Juil 2010 10:11

Re: Analyse morphologique des mots

Messagepar OlivierR » 20 Août 2010 16:53

Ci-joint l'extension en Python qui fait la même chose que ReadibilityReport avec les SmartTags (hormis que la liste des tags reconnus est pour l'instant codée en dur dans l'extension).
SmartTags.oxt
Test SmartTags
(3.84 Kio) Téléchargé 192 fois

Le code :
Code : Tout sélectionner   AgrandirRéduire
# -*- coding: utf_8 -*-
#
# SMART TAGS CLASSES

import uno
import unohelper

import re
import sys, os

sys.stdout = open('C:\_log_stdout.txt', 'w')

from com.sun.star.smarttags import XSmartTagRecognizer
from com.sun.star.smarttags import XSmartTagAction
from com.sun.star.lang import XServiceInfo

from com.sun.star.text.TextMarkupType import SMARTTAG as STMARKUP
from com.sun.star.i18n.WordType import ANY_WORD

from com.sun.star.container import NoSuchElementException

#from grammalecte_tags import ACTIONS

EXT_NAME = 'Grammalecte'

RECOG_IMPL_NAME = "grammalecte.smarttags.TagRecognizer"
RECOG_SERV_NAMES = ("com.sun.star.smarttags.SmartTagRecognizer",)
ACTION_IMPL_NAME = "grammalecte.smarttags.TagAction"
ACTION_SERV_NAMES = (ACTION_IMPL_NAME, "com.sun.star.smarttags.SmartTagAction")

SMARTTAG_NAME = "grammalecte#smarttags"

ACTIONS = [
    [re.compile(ur'\bage\b'), u'âge', u'test1', u'test2'],
    [re.compile(ur'\bmonopôle\b'), 'monopole'],
    [re.compile(ur'\bOOo\b'), 'OO.o', 'OpenOffice.org']
]

class SmartTagsRecog (unohelper.Base, XServiceInfo, XSmartTagRecognizer):   
    def __init__ (self, ctx):
        self.ctx = ctx
        self.svmgr = ctx.ServiceManager
        self.SmartTagCount = 1
        return
   
    # XInitialization
    def initialize (self, objects):
        pass
   
    # XServiceInfo
    def supportsService (self, sName):
        for service in RECOG_SERV_NAMES:
            if service == sName:
                return True
        return False
   
    def getImplementationName (self):
        return RECOG_IMPL_NAME
   
    def getSupportedServiceNames (self):
        return RECOG_SERV_NAMES
   
    # XSmartTagRecognizer
    def getName (self, xLocale):
        return EXT_NAME
   
    def getDescription (self, xLocale):
        return 'Reconnaissance des SmartTags'  if xLocale.Language == 'fr'  else 'SmartTags Recognition'
   
    def getSmartTagName (self, nSmartTagIndex):
        # SmartTag name is of the format "namespaceURI#tagname"
        return SMARTTAG_NAME
   
    def getSmartTagDownloadURL (self, nSmartTagIndex):
        return ''
   
    def recognize (self, sText, nStart, nLength, eDataType, xLocale, xTextMarkup, sAppName, xController, xTokenizer):
        if xLocale.Language != 'fr' and sAppName != 'Calc':
            return
        nEndPos = nStart + nLength
        #aWord = [""]
        #aBound = xTokenizer.getWordBoundary(sText, nStart, xLocale, ANY_WORD, True)
        #while aBound.startPos < aBound.endPos and aBound.endPos <= nEndPos:
        #    aWord[0] = sText[aBound.startPos:aBound.endPos]
        #    match = self.PathExp.match(sText[aBound.startPos:aBound.endPos])
        #    if match:
        #        xTextMarkup.commitTextMarkup(STMARKUP, SMARTTAG_NAME, aBound.startPos, aBound.endPos-aBound.startPos, None)
        #    aBound = xTokenizer.nextWord(sText, aBound.startPos, xLocale, ANY_WORD)
        for action in ACTIONS:
            for match in action[0].finditer(sText[nStart:nEndPos]):
                xStringKeyMap = xTextMarkup.getMarkupInfoContainer()
                for i in range(1, len(action)):
                    xStringKeyMap.insertValue('ctxMenuST_'+str(i-1), action[i])
                xTextMarkup.commitTextMarkup(STMARKUP, SMARTTAG_NAME, nStart+match.start(), match.end()-match.start(), xStringKeyMap)
        return
   
    def hasPropertyPage (self, nSmartTagIndex, xLocale):
        return False
   
    def displayPropertyPage (self, nSmartTagIndex, xLocale):
        return
   

class SmartTagsDo (unohelper.Base, XServiceInfo, XSmartTagAction):   
    def __init__ (self, ctx):
        self.ctx = ctx
        self.svmgr = ctx.ServiceManager
        self.SmartTagCount = 1
        self.ActionCount = 1
        return
   
    # XInitialization
    def initialize (self, objects):
        pass
   
    # XServiceInfo
    def supportsService (self, sName):
        for service in ACTION_SERV_NAMES:
            if service == sName:
                return True
        return False
   
    def getImplementationName (self):
        return ACTION_IMPL_NAME
   
    def getSupportedServiceNames (self):
        return ACTION_SERV_NAMES
   
    # XSmartTagAction
    def getName (self, xLocale):
        return EXT_NAME
   
    def getDescription (self, xLocale):
        return 'Action sur les SmartTags'  if xLocale.Language == 'fr'  else 'SmartTags Actions'
   
    def getSmartTagName (self, nSmartTagIndex):
        # SmartTag name is of the format "namespaceURI#tagname"
        return SMARTTAG_NAME
   
    def getSmartTagCaption (self, nSmartTagIndex, xLocale):
        return 'Confusion possible '
   
    def getActionCount (self, sSmartTagName, xController):
        return self.ActionCount
   
    def getActionID (self, sSmartTagName, nActionIndex, xController):
        nActionID = nActionIndex
        return nActionID
   
    def getActionNameFromID (self, nActionID, xController):
        return str(nActionID)
       
    def getActionCaptionFromID (self, nActionID, sAppName, xLocale, xProperties, sText, sXML, xController, xTarget):
        self.ActionCount = xProperties.Count
        sKey = 'ctxMenuST_' + str(nActionID)
        sVar = xProperties.getValue(sKey)  if xProperties.hasValue(sKey)  else '## error ##'
        return 'Remplacez par : ' + sVar
   
    def invokeAction (self, nActionID, sAppName, xController, xTarget, xProperties, sText, sXML, xLocale):
        sKey = 'ctxMenuST_' + str(nActionID)
        sNewString = xProperties.getValue(sKey)  if xProperties.hasValue(sKey)  else '## error ##'
        xTarget.setString(sNewString)
        return
   
    def isCaptionDynamic (self, nActionID, sAppName, xController, xLocale):
        return True
   
    def isShowSmartTagIndicator (self, nActionID, sAppName, xController, xLocale):
        return True


g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(SmartTagsRecog, RECOG_IMPL_NAME, RECOG_SERV_NAMES)
g_ImplementationHelper.addImplementation(SmartTagsDo, ACTION_IMPL_NAME, ACTION_SERV_NAMES)


Les tags reconnus pour l'instant sont age, monopôle et OOo.
Code : Tout sélectionner   AgrandirRéduire
ACTIONS = [
    [re.compile(ur'\bage\b'), u'âge', u'test1', u'test2'],
    [re.compile(ur'\bmonopôle\b'), 'monopole'],
    [re.compile(ur'\bOOo\b'), 'OO.o', 'OpenOffice.org']
]

Dans cette liste de listes, le premier élément est une expression régulière compilée,
et les éléments suivants sont les remplacements possibles (la longueur de liste est variable).

Pour l'instant, mon souci, c'est que je ne parviens pas à importer cette liste de tags d'un fichier séparé.
La ligne suivante (qui permettrait d'importer cette liste d'un fichier séparé, dans pythonpath)
Code : Tout sélectionner   AgrandirRéduire
#from grammalecte_tags import ACTIONS
doit être commentée, sinon OOo va faire un joli plantage au lancement.

En passant, quel éditeur utilises-tu pour python ? Je viens d'essayer Ulipad mais j'obtiens un fonctionnement bizarre : il veut bien éditer correctement du python mais il ne veut pas ouvrir un fichier test.py - l'explorateur de la fonction 'ouvrir un fichier' ne "voit" pas les fichiers, même quand on sélectionne 'tous type..."

J'utilise PSPad: http://www.pspad.com/fr/.
Mais ce n'est qu'un éditeur de texte, pas un IDE. Je ne connaissais pas Ulipad.

De toute façon, le débogage de Python avec OOo est assez pénible, car on ne dispose d'aucun outil fiable pour repérer les erreurs (sous Windows). Lis ça: http://user.services.openoffice.org/en/ ... p?p=150316. Ça aide un peu.
LibreOffice 6.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: Analyse morphologique des mots

Messagepar PapyRef » 05 Oct 2011 17:48

Le modérateur a écrit: :alerte: Bonjour,

Nous avons l'habitude de saluer sur ce forum, je vous remercie de vous conformer à cet usage.

Nous vous engageons à relire la règle n°10 : Règle n°10
Si vous posez une question, pensez à dire bonjour.
C'est très désagréable de lire un message sans cette marque de politesse.

La modération se réserve le droit de verrouiller votre prochain sujet si vous ne tenez pas compte de cette règle de courtoisie.

Cordialement,


En passant, je n'arrive pas à trouver ce que signifie les informations morphologiques fournies par Hunspell.
Comme dans l''exemple de ce fil avec le mot 'donne'

Code : Tout sélectionner   AgrandirRéduire
donne  st:donne po:nom is:fem
donne  st:donner po:verb is:spré is:3sg
donne  st:donner po:verb is:spré is:1sg
donne  st:donner po:verb is:ipré is:3sg
donne  st:donner po:verb is:ipré is:1sg


Avez vous une liste de tous ces codes et de leur signification ?

Merci de votre aide.
Dernière édition par OOoch le 07 Oct 2011 11:38, édité 2 fois.
Raison: Manque de politesse.
PapyRef utilise OpenOffice 3.1 sous Windows 7
Avatar de l’utilisateur
PapyRef
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 12
Inscrit le : 19 Fév 2010 10:34
Localisation : Evreux, Haute Normandie.


Retour vers Projets

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 6 invité(s)