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
c#
nlp
linguistics
Ryeguy
la source
la source
Réponses:
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
AvsAn
sur 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:
... ce qui ne fait que souligner qu'un système basé sur des règles serait difficile à construire!
la source
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.
la source
Si vous pouviez trouver une source d'orthographe de mots aux prononciations de mots, comme:
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.
la source
hawr-uh-buhl
ça me fait toujours rire.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é ...
la source
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:
la source
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 :
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:
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.
la source
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.
la source
@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é.
la source
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 .
la source
Jetez un œil à Lingua :: EN :: Inflect de Perl . Voir
sub _indef_article
dans le code source.la source
J'ai porté une fonction de Python (à l'origine du package CPAN Lingua-EN-Inflect) qui détermine correctement les sons de voyelle en C # et l'ai postée comme réponse à la question Déterminer par programme s'il faut décrire un objet avec un ou un? . Vous pouvez voir l'extrait de code ici .
la source
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.
la source
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.
la source
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 :-).
la source
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
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.
la source
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é.
la source
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.
la source
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:
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».
la source
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.
la source
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.)
la source
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.
la source
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?"
la source