Comment puis-je préfixer correctement un mot avec «a» et «an»?

93

J'ai une application .NET où, étant donné un nom, je veux qu'il préfixe correctement ce mot avec "a" ou "an". Comment pourrais-je faire ça?

Avant de penser que la réponse est simplement de vérifier si la première lettre est une voyelle, considérez des phrases comme:

  • une erreur honnête
  • une voiture d'occasion
Ryeguy
la source
4
Vous devez également considérer les abréviations qui peuvent également conduire à des confusions sur le "a" ou "un" comme "une LNH" qui apparaît également le son d'une lettre commence par une voyelle, mais pas si l'abréviation peut être prononcée comme un mot tel comme "un appareil NAS" ou "un événement NASCAR"
JB King
5
Gardez également à l'esprit que l'utilisation de a ou an peut dépendre de la prononciation particulière de la variété de l'anglais parlé. La prononciation britannique et américaine de l'herbe en est un exemple.
Eric
12
@Eric: En effet, mon exemple préféré de ceci (ringard aussi) est "SQL". Certaines personnes disent les lettres «SQL», d'autres le prononcent comme le mot «suite». Chacun obtient un "a" ou "un" différent. par exemple c'est "une instruction suite" versets "c'est une instruction SQL"
Binary Worrier
Plus difficile encore, les opinions diffèrent même au sein du même dialecte anglais! Ainsi, par exemple, l'anglais officiel (britannique) nous dit «un hôtel» est la structure correcte, mais la plupart des gens utiliseraient «un hôtel» dans les conversations quotidiennes. Si vous en écrivez un, ce serait très utile pour nous tous!
h4xxr
Ah ... le "aspirant H". Je me souviens très bien de ma première rencontre avec lui. Un livre d'études sociales de deuxième année intitulé "An Historical Society", un livre sur la Williamsburg coloniale.
Bob Kaufman

Réponses:

137
  1. Télécharger Wikipedia
  2. Décompressez-le et écrivez un programme de filtrage rapide qui ne crache que le texte de l'article (le téléchargement est généralement au format XML, ainsi que des métadonnées non liées à l'article).
  3. Trouvez toutes les instances de a (n) .... et créez un index sur le mot suivant et tous ses préfixes (vous pouvez utiliser un suffixe simple pour cela). Cela devrait être sensible à la casse, et vous aurez besoin d'une longueur de mot maximale - 15 lettres?
  4. (facultatif) Supprimez tous les préfixes qui apparaissent moins de 5 fois ou lorsque "a" vs "an" atteint une majorité de moins de 2/3 (ou d'autres seuils - ajustez ici). Gardez de préférence le préfixe vide pour éviter les cas d'angle.
  5. Vous pouvez optimiser votre base de données de préfixes en supprimant tous les préfixes dont le parent partage la même annotation «a» ou «an».
  6. Pour déterminer s'il faut utiliser "A" ou "AN", recherchez le préfixe correspondant le plus long et suivez son exemple. Si vous n'avez pas supprimé le préfixe vide à l'étape 4, il y aura toujours un préfixe correspondant (à savoir le préfixe vide), sinon vous aurez peut-être besoin d'un cas spécial pour une chaîne complètement non correspondante (une telle entrée devrait être très rare) .

Vous ne pouvez probablement pas faire beaucoup mieux que cela - et cela battra certainement la plupart des systèmes basés sur des règles.

Edit: J'ai implémenté cela dans JS / C # . Vous pouvez l' essayer dans votre navigateur ou télécharger la petite implémentation javascript réutilisable qu'il utilise. L'implémentation .NET est un package AvsAnsur nuget . Les implémentations sont triviales, il devrait donc être facile de porter vers n'importe quelle autre langue si nécessaire.

Il s'avère que les «règles» sont un peu plus complexes que je ne le pensais:

  • c'est un résultat imprévu mais c'est un vote unanime
  • c'est une décision honnête mais un arbuste de chèvrefeuille
  • Symboles: C'est un numéro 0800, ou un ∞ d'origan.
  • Acronymes: C'est un scientifique de la NASA, mais un analyste de la NSA; une voiture FIAT mais une politique de la FAA.

... ce qui ne fait que souligner qu'un système basé sur des règles serait difficile à construire!

Eamon Nerbonne
la source
Et s'il manque un nom dans cette sortie, vous pouvez certainement revenir au moteur de règles simple.
John Fisher
26
Étant donné que le téléchargement de Wikipédia se décompresse à (actuellement) 2,8 téraoctets, ce serait formidable si quelqu'un qui utilise cette méthode publie les données résultantes publiquement afin que le processus n'ait pas à être répété beaucoup.
Nathan Long
10
Cette réponse n'était pas tout à fait sérieuse, mais j'ai fait quelque chose comme ça, et le fichier .xml de wikipedia avec wikimarkup brut est juste de l'ordre de 40 Go (le plus récent est toujours un peu plus gros), pas 2,8 To - le tout dans un seul fichier - ne téléchargez pas la version .html étendue ou des images, c'est peut-être la version de 2,8 To? Dans tous les cas, il est en fait tout à fait possible d'analyser, tant que vous n'êtes pas pointilleux sur le balisage.
Eamon Nerbonne
1
C'est l'un des plus grands ensembles de données en langage naturel facilement disponibles et à jour auxquels je puisse penser. Cependant, toute source de données supplémentaire convient également, bien sûr - l'algorithme ne dépend pas de wikipedia, après tout. Vous pouvez essayer l'implémentation en ligne sur home.nerbonne.org/A-vs-An ou sur mon blog
Eamon Nerbonne
1
J'ai été plus que impressionné par cette solution. J'ai honnêtement pensé que ce serait beaucoup plus simple que de télécharger Wikipedia dans son intégralité. Bien joué, monsieur. +1
Kehlan Krumme
15

Vous devez utiliser une liste d'exceptions. Je ne pense pas que toutes les exceptions soient bien définies, car cela dépend parfois de l'accent de la personne qui prononce le mot.

Une manière stupide est de demander à Google les deux possibilités (en utilisant l'une des API de recherche) et d'utiliser la plus populaire:

Ou:

Par conséquent, "une Europe" et "un honnête" sont les versions correctes.

rjmunro
la source
6
Cette utilisation est-elle réellement autorisée ou demande-t-elle à être interdite? Une telle utilisation régulière est certainement désapprouvée par l'IIRC.
Eamon Nerbonne
1
@Eamon: Point intéressant. Que faire si l'application gardait un enregistrement de tous les mots qu'elle a précédemment recherchés sur Google, de sorte qu'elle ne doive google qu'une seule fois pour chaque nouveau mot qu'elle rencontre? Serait-ce encore une utilisation douteuse de Google?
gnovice
2
Mis à part les difficultés techniques évidentes (l'utilisation d'une sortie de moteur de recherche de manière automatisée comme celle-ci n'est pas autorisée et sera bloquée assez rapidement), cela ne résout pas le problème de manière correcte - au pire, cela dupliquera l'utilisation abusive courante de syntaxe.
Guss
6
Au pire? Il y a un argument assez fort à faire valoir que la duplication d'un «usage abusif commun» est exactement ce à quoi un système de langage naturel devrait s'efforcer. Voir l'essai de David Foster Wallace «Authority and American Usage», dans Consider the Lobster . Il existe de meilleurs corpus à utiliser que Google, mais c'est un problème différent.
Robert Rossney
2
«un hôtel» et «une héroïne» me semblent tous les deux appropriés. Je suppose que vous venez d'une perspective d'accent légèrement cockney. Des accents différents signifient qu'il n'y a pas de bonne réponse à certains de ces mots.
rjmunro le
15

Si vous pouviez trouver une source d'orthographe de mots aux prononciations de mots, comme:

"honest":"on-ist"
"horrible":"hawr-uh-buhl, hor-"

Vous pouvez baser votre décision sur le premier caractère de la chaîne de prononciation orthographiée. Pour les performances, vous pouvez peut-être utiliser une telle recherche pour pré-générer des ensembles d'exceptions et utiliser à la place ces ensembles de recherche plus petits pendant l'exécution.

Modifié pour ajouter:

!!! - Je pense que vous pourriez utiliser ceci pour générer vos exceptions: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Tout ne sera pas dans le dictionnaire, bien sûr - ce qui signifie que toutes les exceptions possibles ne se retrouveront pas dans vos ensembles d'exceptions - mais dans ce cas, vous pouvez simplement utiliser par défaut un pour les voyelles / a pour les consonnes ou utiliser une autre heuristique avec de meilleures cotes.

(En parcourant le dictionnaire de la CMU, j'ai été ravi de voir qu'il comprend des noms propres pour les pays et d'autres endroits - il contient donc des exemples tels que "un ukrainien", "un journal USA Today", "une peinture inspirée de l'Oural".)

Modification une fois de plus pour ajouter: Le dictionnaire CMU ne contient pas d'acronymes courants, et vous devez vous soucier de ceux commençant par s, f, l, m, n, u et x. Mais il existe de nombreuses listes d'acronymes, comme sur Wikipédia, que vous pouvez utiliser pour ajouter aux exceptions.

Anon
la source
2
Je ne peux pas m'en empêcher, mais hawr-uh-buhlça me fait toujours rire.
IllidanS4 veut que Monica revienne
9

Vous devez implémenter manuellement et ajouter les exceptions que vous voulez comme par exemple si la première lettre est 'H' et suivie d'un 'O' comme honnête, heure ... et aussi les opposés comme europe, université, utilisé ...

Ahmad Farid
la source
1
ouais vrai homme. Je suppose que je me suis trompé là-dessus. Il n'a aucune règle du tout
Ahmad Farid
8

Puisque "a" et "an" sont déterminés par des règles phonétiques et non par des conventions d'orthographe, je le ferais probablement comme ceci:

  1. Si la première lettre du mot est une consonne -> 'a'
  2. Si la première lettre du mot est une voyelle-> 'an'
  3. Gardez une liste d'exceptions (cœur, radiographie, maison) comme le dit rjumnro .
Patrik Svensson
la source
5

Vous devez examiner les règles grammaticales pour les articles indéfinis (il n'y a que deux articles indéfinis dans la grammaire anglaise - "a" et "an). Vous pouvez ne pas convenir que ces règles semblent correctes, mais les règles de la grammaire anglaise sont très claires :

"Les mots a et an sont des articles indéfinis. Nous utilisons l'article indéfini an avant les mots commençant par une voyelle (a, e, i, o, u) et l'article indéfini a avant les mots commençant par une consonne (tous autres lettres). "

Notez que cela signifie un son de voyelle , et non une lettre de voyelle . Par exemple, les mots commençant par un «h» silencieux, tels que «honneur» ou «héritier» sont traités comme des voyelles et sont donc traités par «un» - par exemple, «c'est un honneur de vous rencontrer». Les mots commençant par une consonne sont préfixés par un - c'est pourquoi vous dites "une voiture d'occasion" plutôt que "une voiture d'occasion" - car "utilisé" a un son "yoose" plutôt qu'un son "euh".

Donc, en tant que programmeur, ce sont les règles à suivre. Il vous suffit de trouver un moyen de déterminer par quel son un mot commence, plutôt que par quelle lettre. J'en ai vu des exemples, comme celui-ci en PHP par Jaimie Sirovich:

function aOrAn($next_word) 
{ 
    $_an = array('hour', 'honest', 'heir', 'heirloom'); 
    $_a = array('use', 'useless', 'user'); 
    $_vowels = array('a','e','i','o','u'); 

    $_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially'); 
    $_endings_regex = implode('|', $_endings); 

    $tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures); 
    $the_word = trim($captures[1]); 
    //$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1)); 

    $_an_regex = implode('|', $_an); 
    if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) { 
        return 'an'; 
    } 

    $_a_regex = implode('|', $_a); 
    if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) { 
        return 'a'; 
    } 

    if (in_array(strtolower($the_word{0}), $_vowels)) { 
        return 'an';     
    } 

    return 'a'; 
}

Il est probablement plus simple de créer la règle, puis de créer une liste d'exceptions et de l'utiliser. Je n'imagine pas qu'il y en aura autant.

Dan Diplo
la source
4

Mec, je me rends compte que c'est probablement un argument établi, mais je pense qu'il peut être réglé plus facilement que d'utiliser des règles de grammaire ad hoc de Wikipedia, qui dériveraient au mieux de la grammaire vernaculaire.

La meilleure solution, semble-t-il, est d'avoir l'utilisation d'un ou d'un déclencheur une correspondance phonémique du mot suivant, avec certains phonèmes toujours associés à "un" et le reste appartenant à "a".

L'Université Carnegie Mellon a un excellent outil en ligne pour ce type de contrôle - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - et à 125k mots avec les 39 phonèmes correspondants. Brancher un mot fournit l'ensemble phonémique, dont seul le premier est important.

Si le mot n'apparaît pas dans le dictionnaire, tel que "NSA" et qu'il est entièrement en majuscule, le système peut supposer que le mot est un acronyme et utiliser la première lettre pour déterminer quel article indéfini utiliser en fonction du même jeu de règles d'origine.

connu
la source
1
En termes d'économie des ressources, c'est la meilleure réponse, et je ne vois pas pourquoi cela fonctionnerait moins bien que les méthodes beaucoup plus gourmandes en données proposées.
Projet Chthonic
3

@Nathan Long: Télécharger wikipedia n'est en fait pas une mauvaise idée. Toutes les images, vidéos et autres médias ne sont pas nécessaires.

J'ai écrit un programme (merdique) en php et javascript (!) Pour lire l'intégralité de la wikipedia suédoise (ou du moins tous les articles qui pouvaient être atteints à partir de l'aricle sur les mathématiques, ce qui était le début de mon araignée.)

J'ai rassemblé tous les mots et les liens internes dans une base de données, et j'ai également gardé une trace de la fréquence de chaque mot. J'utilise maintenant cela comme base de données de mots pour diverses tâches: * Trouver tous les mots qui peuvent être créés à partir d'un ensemble de lettres donné (y compris les caractères génériques) * Créer un fichier de syntaxe simple pour le suédois (tous les mots qui ne sont pas dans la base de données sont considérés comme incorrects).

Oh, et le téléchargement du wiki entier a pris environ une semaine, en utilisant mon ordinateur portable fonctionnant la plupart du temps, avec une connexion 10Mbit.

Lorsque vous y êtes, enregistrez toutes les occurrences qui ne correspondent pas à la langue anglaise et voyez si certaines d'entre elles sont des erreurs. Allez les réparer et redonnez quelque chose à la communauté.

Par Alexandersson
la source
2

Notez qu'il existe des différences entre les dialectes américains et britanniques, comme l'a souligné Grammar Girl dans son épisode A Versus An .

Une complication est lorsque les mots sont prononcés différemment en anglais britannique et américain. Par exemple, le mot pour un certain type de plante se prononce «erb» en anglais américain et «herb» en anglais britannique. Dans les rares cas où cela pose un problème, utilisez le formulaire qui sera attendu dans votre pays ou par la majorité de vos lecteurs.

Jan Aagaard
la source
2

Jetez un œil à Lingua :: EN :: Inflect de Perl . Voir sub _indef_articledans le code source.

Sinan Ünür
la source
Les exceptions se trouvent dans inflexions.t. Il me semble que la liste est plutôt incomplète.
Jan Aagaard
1

Pourriez-vous obtenir un dictionnaire anglais qui stocke les mots écrits dans notre alphabet régulier et l' alphabet phénétique international ?

Ensuite, utilisez les phénétiques pour déterminer le son de départ du mot, et donc si «un» ou «un» est approprié?

Je ne sais pas si cela serait réellement plus facile (ou aussi amusant que) l'approche statistique de Wikipédia.

Paul D. Waite
la source
0

J'utiliserais un algorithme basé sur des règles pour en couvrir autant que possible, puis j'utiliserais une liste d'exceptions. Si vous voulez avoir de la fantaisie, vous pouvez essayer de déterminer de nouvelles «règles» à partir de votre liste d'exceptions.

AL Flanagan
la source
0

Je ressemble juste à un ensemble d'heuristiques. Cela doit être un peu plus compliqué et répondre à certaines choses pour lesquelles je n'ai jamais eu de bonne réponse, par exemple comment traiter les abréviations ("un RPM" ou "un RPM"? J'ai toujours pensé que ce dernier avait plus de sens).

Une recherche rapide a donné lieu à des bibliothèques linguistiques qui expliquent comment gérer le préfixe singulier anglais, mais vous pouvez probablement trouver quelque chose si vous creusez suffisamment. Et sinon - vous pouvez toujours écrire votre propre bibliothèque d'inflexions et gagner une renommée mondiale :-).

Guss
la source
Les abréviations comme RPM ne sont pas un problème. Comme vous le dites, ils peuvent être traités de toute façon. La solution est donc évidente: les ignorer.
Andrew J.Brehm
Je ne serais pas d'accord car cela provoque un préfixe incohérent. Le simple fait de l'ignorer provoquerait "un RPM" et "un UGC", ce qui est clairement faux.
Guss
0

Je ne suppose pas que vous puissiez simplement remplir des éléments de plaque de chaudière comme `` a / an '' en une seule étape. Sinon, vous vous retrouverez avec des erreurs d'hypothèse comme tous les mots avec 'h', continuez par 'o' obtenez 'un' au lieu de 'a' comme 'maison' - (une maison?). Fondamentalement, vous finirez par inclure la logique de la langue anglaise ou trouver occasionnellement des cas rares qui vous donneront l'air idiot.


la source
0

Vérifiez si un mot commence par une voyelle ou une consonne. Un "u" est généralement une consonne et une voyelle ("yu"), donc appartient au groupe de consonnes pour vos besoins.

La lettre «h» représente un arrêt gottal (une consonne) en français et dans les mots français utilisés en anglais. Vous pouvez faire une liste de ceux-ci (en fait, y compris "honneur", "honneur" et "heure" peut suffire) et les compter comme commençant par des voyelles (puisque l'anglais ne reconnaît pas un arrêt glottal).

Comptez également "eu" comme une consonne, etc.

Ce n'est pas trop difficile.

Andrew J. Brehm
la source
0

le choix d'un ou d'un dépend de la façon dont le mot est prononcé. En regardant le mot, vous ne pouvez pas nécessairement dire sa prononciation correcte, par exemple un jargon ou une abréviation, etc. L'un des moyens peut être d'avoir un dictionnaire prenant en charge les phonèmes et d'utiliser les informations de phonème associées au mot pour déterminer si un "a "ou" un "doit être utilisé.

Rohin
la source
0

Je ne peux pas être certain qu'il contient les informations appropriées pour différencier "un" et "un", mais la base de données WordNet de Princeton existe précisément pour des tâches similaires, donc je pense qu'il est probable que les données s'y trouvent . Il a quelques dizaines de milliers de mots et des centaines de milliers de relations entre lesdits mots (IIRC; je ne trouve pas les statistiques actuelles sur le site). Donnez-lui un coup d'oeil. Il est téléchargeable gratuitement.

rmeador
la source
0

Comment? Et quand? Obtenez le nom avec l'article ci-joint. Demandez-le sous une forme spécifique.

Demandez le nom avec l'article. De nombreux éléments de la base de code MUD stockent des éléments sous forme d'informations consistant en:

  • un ou plusieurs mots clés
  • une forme courte
  • une longue forme

La forme du mot clé peut être "courte épée rouillée". La forme courte sera "une épée". La forme longue sera "une épée courte rouillée".

Êtes-vous en train d'écrire un service Web "a vs. an"? Prenez du recul et regardez si vous pouvez attaquer cette fuite plus en amont. Vous pouvez construire un barrage, mais à moins que vous ne l'empêchiez de couler, il finira par déborder.

Déterminez à quel point cela est critique et, comme d'autres l'ont suggéré, optez pour «rapide mais brut» ou «cher mais robuste».

maxwellb
la source
0

La règle est très simple. Si le mot suivant commence par une voyelle, utilisez «an», s'il commence par une consonne, utilisez «a». Le plus dur est que notre classification scolaire des voyelles et des consonnes ne fonctionne pas. Le «h» dans «honneur» est une voyelle, mais le «h» dans «hôpital» est une consonne.

Pire encore, certains mots comme «honnête» commencent par une voyelle ou une consonne selon qui les prononce. Pire encore, certains mots changent en fonction des mots qui les entourent pour certains orateurs.

Le problème n'est limité que par le temps et les efforts que vous souhaitez y consacrer. Vous pouvez écrire quelque chose en couple en utilisant «aeiou» comme voyelles en quelques minutes, ou vous pouvez passer des mois à faire une analyse linguistique de votre public cible. Entre eux, il y a un grand nombre d'heuristiques qui seront bonnes pour certains orateurs et mauvaises pour d'autres - mais comme différents orateurs ont des déterminations différentes pour le même mot, il n'est tout simplement pas possible d'avoir raison tout le temps, peu importe comment vous le faites. il.

KayEss
la source
0

L'approche idéale serait de trouver un endroit en ligne qui puisse vous donner les réponses, les interroger dynamiquement et mettre en cache les réponses. Vous pouvez amorcer le système avec quelques centaines de mots pour commencer.

(Je ne connais pas une telle source en ligne, mais je ne serais pas surpris s'il y en a une.)

Hot Licks
la source
0

Ainsi, une solution raisonnable est possible sans télécharger tout Internet. Voici ce que j'ai fait:

Je me suis souvenu que Google a publié leurs données brutes pour Google Livres fréquences N-Gram ici . J'ai donc téléchargé les fichiers de 2 grammes pour "a_" et "an". C'est environ 26 concerts si je me souviens bien. A partir de là, j'ai produit une liste de chaînes où elles étaient massivement précédées de l'article opposé auquel vous vous attendiez (si nous nous attendions à ce que les voyelles prennent un "an"). Cette liste finale de mots que j'ai pu stocker en moins de 7 kilo-octets.

IngisKahn
la source
-2

Vous utilisez "a" chaque fois que le mot suivant n'est pas une voyelle? Et vous utilisez "un" chaque fois qu'il y a une voyelle?

Cela dit, ne pourriez-vous pas simplement faire une expression régulière comme "a \ s [a, e, i, o, u]. *"? Et puis remplacez-le par un "un?"

Daniel
la source
Non, parce que la règle est de voyelles sons , non voyelles lettres . "Utilisateur" commence par une voyelle, mais pas la prononciation.
Joris Groosman