98 votes

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

J'ai une application .NET où, étant donné un nom, je veux qu'elle préfixe correctement ce mot avec "a" ou "an". Comment dois-je m'y prendre ?

Avant de penser que la réponse consiste simplement à vérifier si la première lettre est une voyelle, pensez à des phrases comme celles-ci :

  • une erreur honnête
  • une voiture d'occasion

4 votes

Il faut également tenir compte des abréviations qui peuvent aussi entraîner des confusions sur le "a" ou le "an", comme "une NHL", dont le son de la lettre commence par une voyelle, mais pas si l'abréviation peut être prononcée comme un mot, comme "un dispositif NAS" ou "un événement NASCAR".

5 votes

Gardez également à l'esprit que l'utilisation de a ou an peut dépendre de la prononciation particulière de la variété d'anglais parlée. La prononciation britannique et américaine de herb en est un exemple.

12 votes

@Eric : En effet, mon exemple préféré de cela (ringard aussi) est "SQL". Certaines personnes disent les lettres "SQL", d'autres le prononcent comme le mot "sequel". Chacun obtient un "a" ou un "an" différent. Par exemple, c'est "a sequel statement" ou "it's an S-Q-L statement".

144voto

Eamon Nerbonne Points 21663
  1. Télécharger Wikipedia
  2. Décompressez le fichier et écrivez un programme de filtrage rapide qui renvoie uniquement le texte de l'article (le téléchargement est généralement au format XML, ainsi que les métadonnées non liées à l'article).
  3. Trouvez toutes les instances de a(n).... et faites un index sur le mot suivant et tous ses préfixes (vous pouvez utiliser un simple suffixe pour cela). Cette recherche doit être sensible à la casse, et vous aurez besoin d'une longueur maximale de mot - 15 lettres ?
  4. (facultatif) Eliminez tous les préfixes qui apparaissent moins de 5 fois ou pour lesquels "a" vs. "an" obtient une majorité de moins de 2/3 (ou d'autres seuils - à ajuster ici). De préférence, gardez le préfixe vide pour éviter les cas de figure.
  5. Vous pouvez optimiser votre base de données de préfixes en éliminant 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", trouvez le préfixe correspondant le plus long et suivez-le. Si vous n'avez pas éliminé le préfixe vide à l'étape 4, alors il y aura un préfixe "A". toujours être un préfixe correspondant (à savoir le préfixe vide), sinon vous pouvez avoir 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 il battra certainement la plupart des systèmes basés sur des règles.

Edit : J'ai mis en œuvre en JS/C# . Vous pouvez essayez-le dans votre navigateur ou téléchargez la petite implémentation javascript réutilisable qu'il utilise. L'implémentation .NET est un paquet AvsAn sur nuget . Les implémentations sont triviales, il devrait donc être facile de les porter vers tout autre langage 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 inattendu mais c'est a vote unanime
  • c'est un décision honnête mais a arbuste de chèvrefeuille
  • Des symboles : C'est un Numéro 0800, ou un d'origan.
  • Acronymes : C'est a Un scientifique de la NASA, mais un Un analyste de la NSA ; a FIAT voiture mais un Politique de la FAA.

...ce qui montre bien qu'un système basé sur des règles serait difficile à construire !

0 votes

Et si un nom manque dans ce résultat, vous pouvez certainement vous rabattre sur le moteur de règles simples.

0 votes

On pourrait s'en servir comme d'un excellent corpus pour une approche bayésienne.

0 votes

Le Corpus de l'anglais américain contemporain ( americancorpus.org ) est probablement un meilleur choix que Wikipedia pour les tests individuels, bien qu'il ne soit pas sous une forme que vous pouvez télécharger.

15voto

rjmunro Points 10522

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 façon 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 "une honnête" sont les versions correctes.

6 votes

S'agit-il d'une utilisation autorisée ou d'une demande d'interdiction ? Une telle utilisation régulière est certainement mal vue IIRC.

1 votes

@Eamon : Point intéressant. Et si l'application gardait un enregistrement de tous les mots qu'elle a précédemment googlés, de sorte qu'elle n'ait à googler qu'une seule fois pour chaque nouveau mot qu'elle rencontre ? Serait-ce encore une utilisation discutable de Google ?

2 votes

Outre les difficultés techniques évidentes (l'utilisation des résultats d'un moteur de recherche de manière automatisée 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 reproduira une mauvaise utilisation courante de la syntaxe.

15voto

Anon Points 3418

Si vous pouviez trouver une source de correspondance entre l'orthographe et la prononciation des mots, par exemple :

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

Vous pourriez baser votre décision sur le premier caractère de la chaîne de prononciation épelée. Pour des raisons de performances, vous pourriez peut-être utiliser une telle consultation pour pré-générer des ensembles d'exceptions et utiliser ces ensembles de consultation 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 jeux d'exceptions - mais dans ce cas, vous pourriez simplement choisir par défaut un pour les voyelles/un pour les consonnes ou utiliser une autre heuristique avec de meilleures chances.

(En parcourant le dictionnaire CMU, j'ai été heureux de constater qu'il comprend des noms propres pour les pays et certains autres lieux - il permettra donc de traiter des exemples tels que "un Ukrainien", "un journal USA Today", "une peinture d'inspiration ouralienne").

Modifier une fois de plus pour ajouter : Le dictionnaire CMU ne contient pas les acronymes courants, et vous devez vous préoccuper de ceux qui commencent par s, f, l, m, n, u et x. Mais il existe de nombreuses listes d'acronymes, comme dans Wikipedia, que vous pourriez utiliser pour ajouter aux exceptions.

3 votes

Je ne peux pas m'en empêcher, mais le hawr-uh-buhl me fait toujours rire.

9voto

Ahmad Farid Points 2738

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 honest, hour ... et aussi les exceptions opposées comme europe, university, used ...

1 votes

Ouais, c'est vrai, mec. Je suppose que je me suis trompé à ce sujet. Il n'y a pas de règle du tout

8voto

Patrik Points 5315

Étant donné que "a" et "an" sont déterminés par des règles phonétiques et non par des conventions orthographiques, je procéderais probablement comme suit :

  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 des exceptions (cœur, rayons X, maison) comme rjumnro dit .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X