Come posso anteporre correttamente a una parola "a" e "an"?


93

Ho un'applicazione .NET in cui, dato un nome, desidero che la parola anteponga correttamente "a" o "an". Come potrei farlo?

Prima di pensare che la risposta sia semplicemente controllare se la prima lettera è una vocale, considera frasi come:

  • un errore onesto
  • un'auto usata

4
Devi anche considerare le abbreviazioni che possono anche portare ad alcune confusioni su "a" o "un" come "un NHL" che anche il suono di una lettera inizia con una vocale anche se non se l'abbreviazione può essere pronunciata come una parola del genere come "un dispositivo NAS" o "un evento NASCAR"
JB King

5
Tieni inoltre presente che l'uso di a o an può dipendere dalla pronuncia particolare nella varietà di inglese parlato. La pronuncia britannica e americana di erba è uno di questi esempi.
Eric

12
@ Eric: In effetti, il mio esempio preferito di questo (anche nerd) è "SQL". Alcuni dicono le lettere "SQL", altri lo pronunciano come la parola "sequel". Ognuno riceve una "a" o "una" diversa. ad esempio, è "un'istruzione sequel" versi "è un'istruzione SQL"
Binary Worrier

Ancora più difficile è che le opinioni differiscono anche all'interno dello stesso dialetto inglese! Quindi, ad esempio, l'inglese ufficiale (Regno Unito) ci dice che "un hotel" è la struttura corretta, ma la maggior parte delle persone userebbe "un hotel" nella conversazione quotidiana. Se ne scrivi uno sarebbe molto utile per il resto di noi!
h4xxr

Ah ... l '"aspirante H". Ricordo vividamente il mio primo incontro con esso. Un libro di studi sociali di seconda elementare intitolato "An Historical Society", un libro sulla Williamsburg coloniale.
Bob Kaufman

Risposte:


137
  1. Scarica Wikipedia
  2. Decomprimilo e scrivi un programma di filtro rapido che sputa solo il testo dell'articolo (il download è generalmente in formato XML, insieme ai metadati non dell'articolo).
  3. Trova tutte le istanze di a (n) .... e crea un indice sulla parola seguente e tutti i suoi prefissi (puoi usare un semplice suffisso per questo). Dovrebbe fare distinzione tra maiuscole e minuscole e avrai bisogno di una lunghezza massima di parola: 15 lettere?
  4. (opzionale) Scarta tutti quei prefissi che ricorrono meno di 5 volte o dove "a" contro "an" raggiunge meno di 2/3 di maggioranza (o qualche altra soglia - modifica qui). Preferibilmente mantieni il prefisso vuoto per evitare casi d'angolo.
  5. È possibile ottimizzare il database dei prefissi scartando tutti quei prefissi il cui genitore condivide la stessa annotazione "a" o "an".
  6. Quando si determina se utilizzare "A" o "AN", trovare il prefisso corrispondente più lungo e seguire il suo esempio. Se non hai scartato il prefisso vuoto nel passaggio 4, ci sarà sempre un prefisso corrispondente (cioè il prefisso vuoto), altrimenti potresti aver bisogno di un caso speciale per una stringa completamente non corrispondente (tale input dovrebbe essere molto raro) .

Probabilmente non puoi andare molto meglio di così - e sicuramente batterà la maggior parte dei sistemi basati su regole.

Modifica: l' ho implementato in JS / C # . Puoi provarlo nel tuo browser o scaricare la piccola implementazione javascript riutilizzabile che utilizza. L'implementazione .NET è un pacchetto AvsAnsu nuget . Le implementazioni sono banali, quindi dovrebbe essere facile portarlo in qualsiasi altro linguaggio, se necessario.

Si scopre che le "regole" sono un po 'più complesse di quanto pensassi:

  • è un risultato imprevisto ma è un voto unanime
  • è una decisione onesta ma un arbusto di caprifoglio
  • Simboli: è un numero 0800 o un ∞ di origano.
  • Acronimi: è uno scienziato della NASA, ma un analista della NSA; un automobilistica FIAT, ma una politica di FAA.

... che va solo a sottolineare che un sistema basato su regole sarebbe difficile da costruire!


E se un nome manca da questo output, puoi sicuramente tornare al semplice motore di regole.
John Fisher,

26
Dato che il download di Wikipedia si decomprime a (attualmente) 2,8 Terabyte, sarebbe fantastico se qualcuno che utilizza questo metodo pubblicasse i dati risultanti pubblicamente in modo che il processo non debba essere ripetuto molto.
Nathan Long,

10
Questa risposta non era del tutto seria, ma ho fatto qualcosa del genere, e il file .xml di wikipedia con wikimarkup non elaborato è dell'ordine di 40 GB (il più recente è sempre un po 'più grande), non 2.8 TB - tutto in un file - non scaricare la versione .html espansa o alcuna immagine, forse è la versione da 2.8TB? In ogni caso, è in realtà abbastanza fattibile da analizzare, a patto che tu non sia pignolo riguardo al markup.
Eamon Nerbonne

1
È uno dei più grandi set di dati in linguaggio naturale facilmente disponibili, aggiornati e a cui potrei pensare. Tuttavia, anche qualsiasi fonte di dati aggiuntiva va bene, ovviamente: l'algoritmo non dipende da wikipedia, dopotutto. Puoi provare l'implementazione online su home.nerbonne.org/A-vs-An o sul mio blog
Eamon Nerbonne

1
Sono stato al di là impressionato da questa soluzione. Onestamente ho pensato che sarebbe stato molto più semplice che scaricare Wikipedia nella sua interezza. Ben fatto, signore. +1
Kehlan Krumme

15

È necessario utilizzare un elenco di eccezioni. Non credo che tutte le eccezioni siano ben definite, perché a volte dipende dall'accento della persona che dice la parola.

Un modo stupido è chiedere a Google le due possibilità (utilizzando quella delle API di ricerca) e utilizzare le più popolari:

O:

Quindi "un'europa" e "un onesto" sono le versioni corrette.


6
È effettivamente consentito l'uso o si chiede di essere vietato? Tale uso regolare è certamente disapprovato dall'IIRC.
Eamon Nerbonne

1
@Eamon: punto interessante. E se l'applicazione tenesse un registro di tutte le parole che ha precedentemente cercato su Google, quindi deve solo cercare su Google una volta per ogni nuova parola che incontra? Sarebbe ancora un utilizzo discutibile di Google?
gnovice

2
A parte le ovvie difficoltà tecniche (l'uso dell'output di un motore di ricerca in modo automatizzato come questo non è consentito e verrà bloccato piuttosto rapidamente), questo non risolve il problema in modo corretto - nel peggiore dei casi duplicherà l'uso improprio comune di sintassi.
Guss

6
Al peggio? C'è un argomento abbastanza forte da sostenere che la duplicazione di "uso improprio comune" è esattamente ciò per cui un sistema in linguaggio naturale dovrebbe tendere. Vedi il saggio di David Foster Wallace "Authority and American Usage", in Consider the Lobster . Esistono corpora migliori da utilizzare rispetto a Google, ma questo è un problema diverso.
Robert Rossney

2
"un albergo" e "un'eroina" mi sembrano giuste. Immagino tu provenga da una prospettiva con un accento leggermente cockney. Accenti diversi indicano che non esiste una risposta giusta ad alcune di queste parole.
rjmunro

15

Se potessi trovare una fonte di ortografia delle parole per la pronuncia delle parole, come:

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

Puoi basare la tua decisione sul primo carattere della stringa di pronuncia scritta. Per le prestazioni, forse potresti utilizzare tale ricerca per pre-generare set di eccezioni e utilizzare invece quei set di ricerca più piccoli durante l'esecuzione.

Modificato per aggiungere:

!!! - Penso che potresti usarlo per generare le tue eccezioni: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Non tutto sarà nel dizionario, ovviamente - il che significa che non tutte le possibili eccezioni finiranno nei tuoi set di eccezioni - ma in quel caso, potresti semplicemente impostare una per le vocali / una per le consonanti o usare qualche altra euristica con probabilità migliori.

(Guardando attraverso il dizionario CMU, mi ha fatto piacere vedere che include nomi propri per paesi e altri luoghi, quindi fornirà esempi come "un ucraino", "un giornale di USA Today", "un dipinto ispirato agli Urali".)

Modifica ancora una volta per aggiungere: Il dizionario CMU non contiene acronimi comuni e devi preoccuparti di quelli che iniziano con s, f, l, m, n, ue x. Ma ci sono un sacco di elenchi di acronimi là fuori, come in Wikipedia, che potresti usare per aggiungere alle eccezioni.


2
Non posso trattenermi, ma hawr-uh-buhlmi fa sempre ridere.
IllidanS4 vuole che Monica torni il

9

Devi implementare manualmente e aggiungere le eccezioni che desideri come ad esempio se la prima lettera è 'H' e seguita da una 'O' come onesto, ora ... e anche quelle opposte come europa, università, usato ...


1
sì vero uomo. Immagino di essermi sbagliato in questo. Non ha alcuna regola
Ahmad Farid il

8

Poiché "a" e "an" sono determinati da regole fonetiche e non da convenzioni ortografiche, probabilmente lo farei in questo modo:

  1. Se la prima lettera della parola è una consonante -> 'a'
  2. Se la prima lettera della parola è una vocale-> 'an'
  3. Tieni un elenco delle eccezioni (cuore, raggi X, casa) come dice rjumnro .

5

Devi guardare le regole grammaticali per articoli indefiniti (ci sono solo due articoli indefiniti nella grammatica inglese - "a" e "an). Potresti non essere d'accordo che queste sembrano corrette, ma le regole della grammatica inglese sono molto chiare :

"Le parole a e an sono articoli indefiniti. Usiamo l'articolo indefinito an prima di parole che iniziano con un suono vocale (a, e, i, o, u) e l'articolo indefinito a prima di parole che iniziano con un suono consonante (tutto altre lettere). "

Nota che questo significa un suono vocale e non una lettera vocale . Ad esempio, le parole che iniziano con una "h" silenziosa, come "onore" o "erede" sono trattate come vocali e quindi procedono con "una" - ad esempio, "È un onore conoscerti". Le parole che iniziano con un suono di consonante sono precedute da un - motivo per cui dici "un'auto usata" piuttosto che "un'auto usata" - perché "usato" ha un suono "tu" piuttosto che un suono "uhh".

Quindi, come programmatore, queste sono le regole da seguire. Hai solo bisogno di trovare un modo per determinare con quale suono inizia una parola, piuttosto che con quale lettera. Ho visto esempi di questo, come questo in PHP di 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'; 
}

Probabilmente è più semplice creare la regola, quindi creare un elenco di eccezioni e utilizzarlo. Non immagino che ce ne saranno così tanti.


4

Amico, mi rendo conto che questo è probabilmente un argomento consolidato, ma penso che possa essere risolto più facilmente rispetto all'utilizzo di regole grammaticali ad hoc da Wikipedia, che nel migliore dei casi deriverebbero la grammatica vernacolare.

La soluzione migliore, a quanto pare, è quella di utilizzare a o un trigger di un abbinamento fonematico della parola successiva, con certi fonemi sempre associati ad "an" e il rimanente appartenente ad "a".

La Carnegie Mellon University ha un ottimo strumento online per questo tipo di controlli - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - ea 125.000 parole con i 39 fonemi corrispondenti. Inserire una parola fornisce l'intero set fonemico, di cui solo il primo è importante.

Se la parola non compare nel dizionario, ad esempio "NSA" ed è tutta in maiuscolo, il sistema può presumere che la parola sia un acronimo e utilizzare la prima lettera per determinare quale articolo indefinito utilizzare in base alla stessa serie di regole originali.


1
In termini di economia delle risorse, questa è la risposta migliore, e non vedo perché funzionerebbe peggio dei metodi proposti, molto più intensivi di dati.
Chthonic Project

3

@ Nathan Long: scaricare wikipedia in realtà non è una cattiva idea. Tutte le immagini, i video e altri media non sono necessari.

Ho scritto un programma (schifoso) in php e javascript (!) Per leggere l'intera wikipedia svedese (o almeno tutti gli articoli che potevano essere raggiunti dall'articolo sulla matematica, che era l'inizio per il mio ragno).

Ho raccolto tutte le parole e i collegamenti interni in un database e ho anche tenuto traccia della frequenza di ogni parola. Ora lo uso come database di parole per varie attività: * Trovare tutte le parole che possono essere create da un determinato insieme di lettere (incluso il carattere jolly) * Creato un semplice file di sintassi per lo svedese (tutte le parole non nel database sono considerate errate).

Oh, e il download dell'intero wiki ha richiesto circa una settimana, utilizzando il mio laptop in esecuzione la maggior parte del tempo, con una connessione a 10 Mbit.

Quando ci sei, registra tutte le occorrenze che non sono coerenti con la lingua inglese e vedi se alcune di esse sono errori. Vai a sistemarli e restituisci qualcosa alla comunità.


2

Nota che ci sono differenze tra i dialetti americani e britannici, come ha sottolineato Grammar Girl nel suo episodio A Versus An .

Una complicazione è quando le parole sono pronunciate in modo diverso nell'inglese britannico e americano. Ad esempio, la parola per un certo tipo di pianta si pronuncia "erb" in inglese americano e "herb" in inglese britannico. Nei rari casi in cui questo è un problema, utilizza il modulo che sarà previsto nel tuo paese o dalla maggior parte dei tuoi lettori.




1

Potresti ottenere un dizionario inglese che memorizzi le parole scritte nel nostro alfabeto normale e l' alfabeto fenetico internazionale ?

Quindi utilizzare la fenetica per capire il suono iniziale della parola, e quindi se "a" o "an" è appropriato?

Non sono sicuro che ciò sarebbe effettivamente più facile (o altrettanto divertente) dell'approccio statistico di Wikipedia.


0

Userei un algoritmo basato su regole per coprirne il maggior numero possibile, quindi userei un elenco di eccezioni. Se vuoi avere fantasia, potresti provare a determinare alcune nuove "regole" dal tuo elenco di eccezioni.


0

Sembra solo un insieme di euristiche. Deve essere un po 'più complicato e rispondere ad alcune cose per le quali non ho mai avuto una buona risposta, ad esempio come trattate le abbreviazioni ("un RPM" o "un RPM"? Ho sempre pensato che quest'ultimo avesse più senso).

Una rapida ricerca ha prodotto biblioteche linguistiche che parlano di come gestire il prefisso singolare inglese, ma probabilmente puoi trovare qualcosa se scavi abbastanza. E se no, puoi sempre scrivere la tua libreria di flessioni e ottenere fama mondiale :-).


Abbreviazioni come RPM non sono un problema. Come dici tu possono essere trattati in entrambi i modi. Quindi la soluzione è ovvia: ignorarli.
Andrew J. Brehm

Non sarei d'accordo perché ciò causa prefissi incoerenti. Il solo ignorarlo causerebbe "un RPM" e "un UGC" che è chiaramente sbagliato.
Guss

0

Immagino che non puoi semplicemente inserire alcune cose della piastra della caldaia come "a / an" come copertura in un unico passaggio. Altrimenti ti ritroverai con errori di ipotesi come tutte le parole con "h", procedi con "o" ottieni "an" invece di "a" come "casa" - (una casa?). Fondamentalmente, finirai per includere la logica della lingua inglese o occasionalmente troverai casi rari che ti faranno sembrare sciocco.


0

Verifica se una parola inizia con una vocale o una consonante. Una "u" è generalmente una consonante e una vocale ("yu"), quindi appartiene al gruppo consonante per i tuoi scopi.

La lettera "h" sta per un gottal stop (una consonante) in francese e nelle parole francesi usate in inglese. Puoi fare un elenco di quelli (infatti, includere "honor", "honor" e "hour" potrebbero essere sufficienti) e contarli come se iniziassero con le vocali (poiché l'inglese non riconosce una glottal stop).

Conta anche "eu" come consonante ecc.

Non è troppo difficile.


0

la scelta di an o a dipende dal modo in cui la parola viene pronunciata. Guardando la parola non puoi necessariamente dire la sua pronuncia corretta ad es. Un gergo o un'abbreviazione ecc. Uno dei modi può essere quello di avere un dizionario con supporto per i fonemi e utilizzare le informazioni sul fonema associate alla parola per determinare se una "a "o una" an "dovrebbe essere usata.


0

Non posso essere certo che contenga le informazioni appropriate per differenziare "a" e "an", ma il database WordNet di Princeton esiste proprio allo scopo di simili tipi di attività, quindi penso che sia probabile che i dati siano lì . Ha alcune decine di migliaia di parole e centinaia di migliaia di relazioni tra dette parole (IIRC; non riesco a trovare le statistiche attuali sul sito). Dagli un'occhiata. È scaricabile gratuitamente.


0

Come? E quando? Ottieni il nome con l'articolo allegato. Richiedilo in una forma specifica.

Richiedi il nome con l'articolo. Molte basi di codici MUD memorizzano gli elementi come informazioni costituite da:

  • una o più parole chiave
  • una forma breve
  • una forma lunga

La forma della parola chiave potrebbe essere "spada corta arrugginita". La forma abbreviata sarà "una spada". La forma lunga sarà "una spada corta arrugginita".

Stai scrivendo un servizio Web "a vs. an"? Fai un passo indietro e guarda se riesci ad attaccare questa perdita più a monte. Puoi costruire una diga, ma a meno che non le impedisca di scorrere, alla fine si riverserà.

Determina quanto questo sia critico e, come altri hanno suggerito, scegli "veloce ma grezzo" o "costoso ma robusto".


0

La regola è molto semplice. Se la parola successiva inizia con un suono vocale, usa "an", se inizia con una consonante usa "a". La cosa difficile è che la nostra classificazione scolastica di vocali e consonanti non funziona. La "h" in "honor" è una vocale, ma la "h" in "hospital" è una consonante.

Ancora peggio, alcune parole come "onesto" iniziano con una vocale o una consonante a seconda di chi le pronuncia. Ancora peggio, alcune parole cambiano a seconda delle parole che le circondano per alcuni altoparlanti.

Il problema è limitato solo dalla quantità di tempo e impegno che ci si vuole dedicare. Puoi scrivere qualcosa in coppia usando 'aeiou' come vocali in un paio di minuti, oppure puoi passare mesi a fare analisi linguistiche del tuo pubblico di destinazione. Tra di loro c'è un numero enorme di euristiche che saranno giuste per alcuni oratori e sbagliate per altri, ma poiché diversi oratori hanno determinazioni diverse per la stessa parola, semplicemente non è possibile avere ragione tutto il tempo, non importa come lo fai esso.


0

L'approccio ideale sarebbe trovare un posto online che possa darti le risposte, interrogarle dinamicamente e memorizzare nella cache le risposte. Puoi innescare il sistema con poche centinaia di parole per i principianti.

(Non conosco una tale fonte online, ma non sarei sorpreso se ce ne fosse una.)


0

Quindi, una soluzione ragionevole è possibile senza scaricare tutto da Internet. Ecco cosa ho fatto:

Mi sono ricordato che Google ha pubblicato i dati grezzi per le frequenze di Google Books N-Gram qui . Quindi ho scaricato i file da 2 grammi per "a_" e "an". Sono circa 26 concerti se ricordo bene. Da ciò ho prodotto un elenco di stringhe in cui sono state precedute in modo schiacciante dall'articolo opposto che ti aspetteresti (se ci aspettassimo che le vocali prendano una "an"). L'elenco finale di parole che sono riuscito a memorizzare in meno di 7 kilobyte.


-2

Usi "a" ogni volta che la parola successiva non è una vocale? E usi "an" ogni volta che c'è una vocale?

Detto questo, non potresti semplicemente fare un'espressione regolare come "a \ s [a, e, i, o, u]. *"? E poi sostituirlo con un "un?"


No, perché la regola riguarda i suoni vocalici , non le lettere vocaliche . "Utente" inizia con una vocale, ma la pronuncia no.
Joris Groosman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.