web-dev-qa-db-fra.com

Comment puis-je corriger correctement un mot avec "A" et "an"?

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

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

  • une erreur honnête
  • une voiture d'occasion
91
ryeguy
  1. Télécharger Wikipedia
  2. Décompressez-le et écrivez un programme de filtres rapide qui ne dépit que du texte de l'article (le téléchargement est généralement au format XML, ainsi que des métadonnées autres que l'article).
  3. Trouvez toutes les instances d'un (n) ... et faites un index sur le mot suivant et tous ses préfixes (vous pouvez utiliser une simple suffixe pour cela). Cela devrait être sensible à la casse et vous aurez besoin d'une longueur maximale de mots - 15 lettres?
  4. (Facultatif) Jeter tous ces préfixes qui se produisent moins de 5 fois ou où "A" vs. "an" atteint moins de 2/3 majorité (ou d'autres autres bathholds - Tweak ici). Gardez de préférence le préfixe vide pour éviter les caisses d'angle.
  5. Vous pouvez optimiser votre base de données de préfixe en supprimant tous ces préfixes dont le parent partage la même annotation "A" ou "An".
  6. Lors de la détermination de savoir s'il faut utiliser "A" ou "an" trouver le préfixe de correspondance le plus long, puis suivez son avance. Si vous n'avez pas jeté le préfixe vide à l'étape 4, alors il y aura TOUJOURS Soyez un préfixe correspondant (à savoir le préfixe vide), sinon vous pourriez avoir besoin d'un cas particulier pour une correspondance complètement non correspondante. String (une telle entrée doit être très rare).

Vous ne pouvez probablement pas obtenir 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 Essayez-le dans votre navigateur ou téléchargez la petite mise en œuvre JavaScript réutilisable qu'elle utilise. La mise en œuvre .NET est un package AvsAn sur Nuget . Les implémentations sont triviales, elles doivent donc être faciles à porter à toute autre langue si nécessaire.

S'avère que les "règles" sont un peu plus complexes que je pensais:

  • c'est an résultat imprévu, mais c'est a vote unanime
  • c'est an décision honnête mais a arbuste de chèvrefeuille
  • Symboles: c'est an numéro 0800, ou an ∞ d'origan.
  • Acronymes: c'est A Scientifique de Nasa, mais an NSA analyste; a Fiat Car, mais an politique de la FAA.

... qui va simplement souligner qu'un système basé sur des règles serait délicat pour construire!

135
Eamon Nerbonne

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

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

Ou:

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

15
rjmunro

Si vous pouviez trouver une source d'orthographe de mot 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 la performance, vous pourriez peut-être utiliser une telle recherche pour pré-générer des ensembles d'exceptions et utiliser ces petits ensembles de recherche pendant l'exécution à la place.

Édité pour ajouter:

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

Tout ce ne sera pas dans le dictionnaire, bien sûr - ce qui ne serait pas toute exception possible ne serait pas liquidée dans vos exceptions, mais dans ce cas, vous pouvez simplement défaut à une voyelle/a pour les consonnes ou à utiliser une autre heuristique avec de meilleures chances.

(Regardant par le dictionnaire CMU, j'étais ravi de le voir inclut des noms appropriés pour les pays et d'autres endroits - il va donc faire preuve d'exemples comme "Un Ukrainien", "Un article USA Today Document", "une peinture inspirée des URRALS".).

Édition encore une fois pour ajouter: le dictionnaire CMU ne contient pas d'acronymes communs, et vous devez vous inquiéter 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.

15
Anon

Vous devez mettre en œuvre manuellement et ajouter les exceptions que vous souhaitez, par exemple, si la première lettre est "H" et suivie d'un "O" comme honnête, heure ... et aussi les opposés comme l'Europe, l'université, ...

9
Ahmad Farid

Comme "A" et "An" est déterminé par des règles phonétiques et non 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 (coeur, rayons X, maison) comme dit Rjumnro .
8
Patrik Svensson

Homme, je me rends compte que c'est probablement un argument déterminé, mais je pense que cela peut être réglé plus facile que d'utiliser des règles de grammaire ad hoc de Wikipedia, qui dériverait la grammaire vernaculaire, au mieux.

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

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

Si le mot n'apparaît pas dans le dictionnaire, tel que "NSA" et est tout capitalisé, le système peut supposer que le mot est un acronyme et utilise la première lettre pour déterminer quel article indéfini à utiliser sur la même règle d'origine.

4
knownhuman

@Nathan Long: Le téléchargement de Wikipedia n'est en fait pas une mauvaise idée. Toutes les images, vidéos et autres supports n'est pas nécessaire.

J'ai écrit un programme (merdique) en PHP et JavaScript (!) Pour lire l'ensemble de la Wikipedia suédoise (ou au moins tous les arles pouvant être atteints de l'arille sur les mathématiques, qui était le début de mon araignée.)

J'ai recueilli tous les mots et les liens internes dans une base de données, et j'ai également tenu une trace de la fréquence de chaque mot. J'utilise maintenant cela comme une base de données de mots pour diverses tâches: * Trouver tous les mots pouvant être créés à partir d'un ensemble donné de lettres (y compris wildcard) * Création d'un fichier de syntaxe simple pour suédois (tous les mots non dans la base de données sont considérés comme incorrects).

Oh, et télécharger l'ensemble du wiki a pris environ une semaine, en utilisant mon ordinateur portable en cours d'exécution la plupart du temps, avec une connexion 10MBIT.

Lorsque vous y êtes, connectez-vous toutes les occurrences incompatibles avec la langue anglaise et voyez si certaines d'entre elles sont des erreurs. Allez-y les être et donnez quelque chose à la communauté.

3
Per Alexandersson

J'ai porté une fonction de - Python (à l'origine du package CPAN lingua-en-inflète) qui détermine correctement les sons de voyelle en C # et l'a affiché comme une réponse à la question déterminer par programme de manière programmatique si Décrivez un objet avec un ou an? . Vous pouvez voir l'extrait de code ici .

2
Stuart

Notez qu'il existe des différences entre les dialectes américains et britanniques, comme la grammaire a souligné dans son épisode A contrefeuil .

Une complication est que lorsque les mots sont prononcés différemment en anglais britannique et américain. Par exemple, le mot pour un certain type d'usine est prononcé "ERB" en anglais américain et "herbe" en anglais britannique. Dans les rares cas où il s'agit d'un problème, utilisez la forme qui sera attendue dans votre pays ou à la majorité de vos lecteurs.

2
Jan Aagaard

Jetez un coup d'œil à perl Lingua :: fr :: inflète . Voir sub _indef_article Dans le code source.

2
Sinan Ünür

Pourriez-vous obtenir un dictionnaire anglais qui stocke les mots écrits dans notre alphabet régulier et le alphabet phoétique international ?

Ensuite, utilisez la phénétique pour déterminer le son de début du mot, et donc savoir si "A" ou "an" est approprié?

Je ne sais pas si cela serait effectivement plus facile que (ou aussi amusant que) l'approche statistique de Wikipedia.

1
Paul D. Waite

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 raconter sa prononciation correcte. Un jargon ou une abréviation, etc. L'un des moyens peut être d'avoir un dictionnaire avec la prise en charge des phonèmes et d'utiliser les informations sur la phonème associées au mot pour déterminer si un "A" ou un "an" doit être utilisé.

0
Rohin

L'approche idéale serait de trouver quelque part en ligne qui peut vous donner les réponses, les interroger dynamiquement et mettre en cache les réponses. Vous pouvez amener 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 un.)

0
Hot Licks

La règle est très simple. Si le mot suivant commence par un son de voyelle, utilisez 'an', si cela commence par une consonne, utilisez-le, utilisez "A". La chose difficile est que notre classification scolaire des voyelles et des consonnes ne fonctionnent pas. Le "H" dans "Honor" est une voyelle, mais le "H" dans "Hospital" est une consonne.

Pire encore, certains mots comme "honnête" commencent par une voyelle ou une consonne en fonction de qui les disent. Pire encore, certains mots changent en fonction des mots qui les entourent pour certains haut-parleurs.

Le problème n'est borné que par la quantité de temps et d'efforts que vous souhaitez y mettre. Vous pouvez écrire quelque chose dans un couple en utilisant 'Aeiou' en tant que voyelles dans quelques minutes, ou vous pouvez passer des mois à faire une analyse linguistique de votre public cible. Entre eux constituent un grand nombre d'heuristiques qui seront juste pour certains haut-parleurs et qui ne va pas pour les autres - mais parce que différents intervenants ont des déterminations différentes pour le même mot, il n'est tout simplement pas possible d'être juste tout le temps, peu importe la façon dont vous faites ce.

0
KayEss

J'utiliserais un algorithme basé sur des règles pour couvrir autant que je pouvais, puis utiliser une liste d'exceptions. Si vous vouliez avoir une fantaisie, vous pouvez essayer de déterminer de nouvelles "règles" de votre liste d'exception.

0
A. L. Flanagan

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

Une recherche rapide a été produite sur des bibliothèques linguistiques qui parlent de gérer le préfixe singulier anglais, mais vous pouvez probablement trouver quelque chose si vous creusez suffisamment de plongée. Et sinon, vous pouvez toujours écrire votre propre bibliothèque d'inflexion et gagner la renommée mondiale :-).

0
Guss

Je ne suppose pas que vous puissiez simplement remplir certains trucs de plaque de chaudière, comme "A/A" comme une couverture à une étape. Sinon, vous finirez par vous retrouver avec des erreurs d'assomption comme tous les mots avec 'H' procédez par 'O' Get 'A "au lieu de" A "comme" maison "- (une maison?). Fondamentalement, vous finirez par inclure la logique de la langue anglaise ou trouverez une manière artisanale de rares cas qui vous feront paraître stupide.

0
Badfish

Donc, 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 les fréquences Google Books 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. De cela, j'ai produit une liste de chaînes où ils ont été dépassés de manière instable par l'article opposé que vous attendez (si nous attendions des voyelles, prenez un "an"). Cette liste finale de mots que j'ai pu stocker en moins de 7 kilo-octets.

0
IngisKahn

Vérifiez si un mot commence par une voyelle ou une consonque. Un "U" est généralement une consonne et une voyelle ("Yu") appartient donc au groupe de consonnes à vos besoins.

La lettre "H" représente un arrêt de la gottale (une consonne) en français et en français utilisé en anglais. Vous pouvez faire une liste de ceux-ci (en fait, y compris "honneur", "honneur", et "heure" pourrait suffire) et comptez-les comme à partir des voyelles (puisque l'anglais ne reconnaît pas d'arrêt glottal).

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

Ce n'est pas trop difficile.

0
Andrew J. Brehm

Je ne peux pas être certain que cela dispose des informations appropriées de différencier "A" et "A", mais de la base de données de Princeton WordNet est précisément dans le but de des tâches similaires, alors je pense que c'est probablement que les données sont là-bas. Il a des dizaines de milliers de mots et de centaines de milliers de relations entre lesdites mots (IIRC; Je ne trouve pas les statistiques actuelles sur le site). Donnez-lui un look. C'est librement téléchargeable.

0
rmeador