Voici un des premiers résultats de mes expérimentations avec Perl, à savoir un script qui permet, avec une marge d’erreur relativement faible (env. 1% dans mon corpus test1) d’identifier automatiquement les noms propres.
L’idée originelle est d’utiliser l’encodage « naturel» des textes, c’est-à-dire l’ensemble des symboles et diacritiques traditionnels (ponctuations, accents, majuscules, etc.). En l’occurrence, pour les noms propres, cet encodage consiste en l’utilisation d’une majuscule au début du mot. Le problème principal réside alors dans la présence de majuscules également en tête de phrase (heureusement que nous ne prenons pas comme exemple un texte allemand contemporain !). Dans un premier temps, après avoir nettoyé tout ce qui ne nous est pas nécessaire, le script constitue donc deux listes. La première contient tout les mots commençant par une majuscule et ne se trouvant pas en début de phrase et qui sont donc nécessairement des noms propres ; la seconde, tous les mots se trouvant en début de phrase, qui peuvent être des noms propres, mais pas forcément.
#on récupère tout les mots qui commencent par une majuscule, sans être précédé par un point ou un guillemet.
@NomP = $texte =~ /[^.!?«»]\s+(\b[A-Z]\w+)/g;
@NomP = grep {/\w+/} @maj;
#Puis on récupère tout ce qui correspond à un point ou un guillemet, un espace, et une majuscule.
@debutPhrase = $texte =~ /[.!?«»]\s+([A-Z]\w+)/g;
@debutPhrase = grep {/[^\s.!?«»]/} @debutPhrase;
Maintenant que nous avons ces deux listes, nous avons d’ores et déjà récupéré une bonne partie des noms propres, mais il est encore possible d’améliorer le script et de faire diminuer le nombre de mots incertains (ceux de la liste @debutPhrase). Pour ce faire, on procède à une comparaison des deux listes (en incluant la variation du système bicasuel de l’occitan médiéval). Si le mot « indécis » correspond à un de ceux de la liste de noms propres, il est transféré dans cette liste2 :
De 57 mots dans la liste @debutPhrase, on passe à 40, dont seulement 6 vrais noms propres, chiffre qui est à opposer aux 460 noms propres trouvés, soit 98,71% de réussite, ce qui n’est pas si mal que ça (je suis bien sûr preneur de toute suggestion d’amélioration).
- Ce corpus test se compose d’une quarantaine de vidas, courts textes biographiques occitans du XIIIe siècle, racontant la vie d’un troubadour. [↩]
- Autrement dit, si notre mot qui porte une majuscule et se trouve en début de phrase apparaît ailleurs dans le texte, portant une majuscule, mais sans être en début de phrase, il s’agira d’un nom propre. Dans le cas contraire, la situation reste indécise : il peut soit s’agir d’un nom commun, soit bel et bien d’un nom propre n’apparaissant qu’une seule et unique fois dans le corpus [↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Jean-Baptiste Camps (13 décembre 2010). Identification automatique des noms propres. Sacré Gr@@l. Consulté le 9 octobre 2024 à l’adresse https://doi.org/10.58079/p41r
Merci beaucoup pour cette question.
En effet. Pour l’instant, j’intègre un certain nombre de variations graphiques (les variables $variante2, $variante3, etc.), mais qui sont propre à la variation bicasuelle (-s/-z) et au -n caduc occitan. Une solution un peu « bidouille » serait d’intégrer encore plus de variantes communes par ce biais (ch/c, Richartz/Ricartz pour reprendre l’exemple). Une solution, sur laquelle je compte me pencher dans les temps qui viennent, est l’utilisation du module Perl STRING::APPROX, qui permet de faire du approximate string matching, de la correspondance approximative, comme le font notamment les moteurs de recherche. Reste à voir dans quel mesure on peut le configurer (on ne veut surtout pas avoir des correspondances fausses, ce qui est d’une certaine façon pire que pas de correspondance du tout).
Il y a beaucoup à dire là-dessus et je pense que ça fournira là la matière d’un autre billet !
Voilà qui est très intéressant! Mais j’ai une question: une fois que tu as généré tes deux listes, et que tu fais en sorte de les “synchroniser”, ton programme ne permet pas encore de prendre en compte les variantes graphiques? Par exemple, si la première liste donne “Richartz” et la seconde “Ricartz”, il n’est pas possible pour Perl de comprendre qu’il s’agit en réalité d’une seule et même personne?