¿Cómo puedo prefijar correctamente una palabra con "a" y "an"?

93

Tengo una aplicación .NET donde, dado un sustantivo, quiero que prefijo correctamente esa palabra con "a" o "an". ¿Como podría hacerlo?

Antes de pensar que la respuesta es simplemente verificar si la primera letra es una vocal, considere frases como:

  • un error honesto
  • un auto usado
centeno
fuente
4
También debe considerar las abreviaturas que también pueden llevar a algunas confusiones sobre tha "a" o "an" like "an NHL" que también aparece. El sonido de una letra comienza con una vocal, aunque no si la abreviatura se puede pronunciar como tal. como "un dispositivo NAS" o "un evento NASCAR"
JB King
5
También tenga en cuenta que el uso de a o an puede depender de la pronunciación particular en la variedad de inglés que se habla. La pronunciación británica y estadounidense de hierba es un ejemplo.
Eric
12
@Eric: De hecho, mi ejemplo favorito de esto (nerd también) es "SQL". Algunas personas dicen las letras "SQL", algunas personas las pronuncian como la palabra "secuela". Cada uno recibe una "a" o "una" diferente. por ejemplo, es "una declaración de secuela" versos "es una declaración de SQL"
Binary Worrier
¡Aún más difícil es que las opiniones incluso difieran dentro del mismo dialecto del inglés! Entonces, por ejemplo, el inglés oficial (Reino Unido) nos dice que "un hotel" es la estructura correcta, pero la mayoría de la gente usaría "un hotel" en la conversación diaria. ¡Si escribes uno, sería muy útil para el resto de nosotros!
h4xxr
Ah ... el "aspirante H". Recuerdo vívidamente mi primer encuentro con él. Un libro de estudios sociales de segundo grado titulado "An Historical Society", un libro sobre el Williamsburg colonial.
Bob Kaufman

Respuestas:

137
  1. Descarga Wikipedia
  2. Descomprímalo y escriba un programa de filtro rápido que escupe solo el texto del artículo (la descarga generalmente se realiza en formato XML, junto con los metadatos que no pertenecen al artículo).
  3. Encuentre todas las instancias de a (n) .... y haga un índice en la siguiente palabra y todos sus prefijos (puede usar un sufijo simple para esto). Esto debe distinguir entre mayúsculas y minúsculas, y necesitará una longitud máxima de palabras: ¿15 letras?
  4. (opcional) Descarte todos los prefijos que ocurren menos de 5 veces o donde "a" vs. "an" logra menos de 2/3 de la mayoría (o algunos otros umbrales - ajuste aquí). Preferiblemente mantenga el prefijo vacío para evitar casos de esquina.
  5. Puede optimizar su base de datos de prefijos descartando todos aquellos prefijos cuyo padre comparta la misma anotación "a" o "an".
  6. Al determinar si usar "A" o "AN", busque el prefijo coincidente más largo y siga su ejemplo. Si no descartó el prefijo vacío en el paso 4, siempre habrá un prefijo coincidente (es decir, el prefijo vacío); de lo contrario, es posible que necesite un caso especial para una cadena que no coincida completamente (dicha entrada debería ser muy rara) .

Probablemente no pueda ser mucho mejor que esto, y ciertamente superará a la mayoría de los sistemas basados ​​en reglas.

Editar: he implementado esto en JS / C # . Puede probarlo en su navegador o descargar la pequeña implementación de JavaScript reutilizable que utiliza. La implementación de .NET está empaquetada AvsAnen nuget . Las implementaciones son triviales, por lo que debería ser fácil migrar a cualquier otro idioma si es necesario.

Resulta que las "reglas" son un poco más complejas de lo que pensaba:

  • es un resultado no anticipado pero es un voto unánime
  • es una decisión honesta pero un arbusto de madreselva
  • Símbolos: Es un número 0800 o un ∞ de orégano.
  • Siglas: es un científico de la NASA, pero un analista de la NSA; un automóvil FIAT pero una política de la FAA.

... lo que simplemente subraya que un sistema basado en reglas sería complicado de construir.

Eamon Nerbonne
fuente
Y si falta un sustantivo en esta salida, ciertamente puede recurrir al motor de reglas simple.
John Fisher
26
Dado que la descarga de Wikipedia se descomprime a (actualmente) 2.8 Terabytes, sería genial si alguien que usa este método publicara los datos resultantes públicamente para que el proceso no tenga que repetirse mucho.
Nathan Long
10
Esta respuesta no fue del todo seria, pero hice algo como esto, y el archivo .xml de wikipedia con wikimarkup sin procesar es del orden de 40 GB (el más nuevo siempre es un poco más grande), no 2.8TB, todo en un solo archivo - no descargue la versión .html expandida ni ninguna imagen, ¿quizás esa es la versión de 2.8TB? En cualquier caso, es bastante factible analizarlo, siempre que no sea exigente con el marcado.
Eamon Nerbonne
1
Es uno de los conjuntos de datos en lenguaje natural actualizados y fácilmente disponibles más grandes que se me ocurren. Sin embargo, cualquier fuente de datos adicional también está bien, por supuesto; después de todo, el algoritmo no depende de wikipedia. Puede probar la implementación en línea en home.nerbonne.org/A-vs-An o en mi blog
Eamon Nerbonne
1
Estaba más que impresionado por esta solución. Honestamente, pensé que sería mucho más simple que descargar Wikipedia en su totalidad. Bien hecho, señor. +1
Kehlan Krumme
15

Debe utilizar una lista de excepciones. No creo que todas las excepciones estén bien definidas, porque a veces depende del acento de la persona que dice la palabra.

Una forma estúpida es pedirle a Google las dos posibilidades (usando una de las API de búsqueda) y usar la más popular:

O:

Por lo tanto, "una europa" y "un honesto" son las versiones correctas.

rjmunro
fuente
6
¿Es ese un uso realmente permitido o se trata de pedir que se prohíba? Ciertamente, este uso regular está mal visto por el IIRC.
Eamon Nerbonne
1
@Eamon: Punto interesante. ¿Qué pasa si la aplicación mantiene un registro de todas las palabras que previamente ha buscado en Google, por lo que solo tiene que buscar en Google una vez por cada nueva palabra que encuentra? ¿Seguiría siendo un uso cuestionable de Google?
gnovice
2
Aparte de las obvias dificultades técnicas (el uso de la salida de un motor de búsqueda de manera automatizada como este no está permitido y se bloqueará con bastante rapidez), esto no resuelve el problema de manera correcta; en el peor de los casos, duplicará el uso indebido común de sintaxis.
Guss
6
¿Lo peor? Existe un argumento bastante sólido que sostiene que duplicar el "uso indebido común" es exactamente por lo que debería esforzarse un sistema de lenguaje natural. Véase el ensayo de David Foster Wallace "Autoridad y uso estadounidense", en Considere la langosta . Hay mejores corpora para usar que Google, pero ese es un tema diferente.
Robert Rossney
2
"un hotel" y "una heroína" me parecen correctos. Supongo que vienes desde una perspectiva de acento ligeramente cockney. Diferentes acentos significan que no hay una respuesta correcta para algunas de estas palabras.
rjmunro
15

Si pudiera encontrar una fuente de ortografía de palabras para pronunciaciones de palabras, como:

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

Puede basar su decisión en el primer carácter de la cadena de pronunciación escrita. Para mejorar el rendimiento, tal vez podría utilizar dicha búsqueda para generar previamente conjuntos de excepciones y utilizar esos conjuntos de búsqueda más pequeños durante la ejecución.

Editado para agregar:

!!! - Creo que podrías usar esto para generar tus excepciones: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

No todo estará en el diccionario, por supuesto, lo que significa que no todas las posibles excepciones terminarían en sus conjuntos de excepciones, pero en ese caso, podría simplemente usar una para vocales / a para consonantes o usar alguna otra heurística con mejores probabilidades.

(Al mirar el diccionario CMU, me complació ver que incluye nombres propios para países y algunos otros lugares, por lo que entregará ejemplos como "un ucraniano", "un periódico de USA Today", "una pintura inspirada en los Urales").

Editando una vez más para agregar: el diccionario CMU no contiene acrónimos comunes, y debe preocuparse por los que comienzan con s, f, l, m, n, u y x. Pero hay muchas listas de acrónimos, como en Wikipedia, que puede usar para agregar a las excepciones.

Luego
fuente
2
No puedo evitarlo, pero hawr-uh-buhlsiempre me hace reír.
IllidanS4 quiere que Monica vuelva
9

Tienes que implementar manualmente y agregar las excepciones que quieras como por ejemplo si la primera letra es 'H' y seguida de una 'O' como honesto, hora ... y también las opuestas como europa, universidad, usado ...

Ahmad Farid
fuente
1
sí, verdadero hombre. Supongo que me equivoqué en eso. No tiene ninguna regla en absoluto
Ahmad Farid
8

Dado que "a" y "an" están determinados por reglas fonéticas y no por convenciones ortográficas, probablemente lo haría así:

  1. Si la primera letra de la palabra es consonante -> 'a'
  2. Si la primera letra de la palabra es vocal-> 'an'
  3. Mantenga una lista de excepciones (corazón, rayos X, casa) como dice rjumnro .
Patrik Svensson
fuente
5

Debes mirar las reglas gramaticales para artículos indefinidos (solo hay dos artículos indefinidos en gramática inglesa: "a" y "an). Puede que no estés de acuerdo con que estos suenen correctos, pero las reglas de la gramática inglesa son muy claras :

"Las palabras a y an son artículos indefinidos. Usamos el artículo indefinido an antes de palabras que comienzan con un sonido de vocal (a, e, i, o, u) y el artículo indefinido a antes de palabras que comienzan con un sonido de consonante (todas otras letras) ".

Tenga en cuenta que esto significa un sonido de vocal y no una letra de vocal . Por ejemplo, las palabras que comienzan con una "h" silenciosa, como "honor" o "heredero", se tratan como vocales y, por lo tanto, se proceden con "an", por ejemplo, "Es un honor conocerte". Las palabras que comienzan con un sonido consonante tienen el prefijo a - por eso dice "un auto usado" en lugar de "un auto usado" - porque "usado" tiene un sonido "yoose" en lugar de un sonido "uhh".

Entonces, como programador, estas son las reglas a seguir. Solo necesita encontrar una forma de determinar con qué sonido comienza una palabra, en lugar de con qué letra. He visto ejemplos de esto, como este en PHP de 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'; 
}

Probablemente sea más fácil crear la regla y luego crear una lista de excepciones y usarla. No me imagino que habrá tantos.

Dan Diplo
fuente
4

Hombre, me doy cuenta de que este es probablemente un argumento establecido, pero creo que puede resolverse más fácilmente que usando reglas gramaticales ad hoc de Wikipedia, que derivarían la gramática vernácula, en el mejor de los casos.

La mejor solución, al parecer, es tener el uso de a o un disparador de una coincidencia basada en fonemas de la siguiente palabra, con ciertos fonemas siempre asociados con "una" y el resto perteneciente a "a".

La Universidad Carnegie Mellon tiene una gran herramienta en línea para este tipo de comprobaciones ( http://www.speech.cs.cmu.edu/cgi-bin/cmudict ) y 125.000 palabras con 39 fonemas correspondientes. Insertar una palabra proporciona todo el conjunto fonémico, del cual solo el primero es importante.

Si la palabra no aparece en el diccionario, como "NSA", y está en mayúscula, el sistema puede asumir que la palabra es un acrónimo y usar la primera letra para determinar qué artículo indefinido usar según el mismo conjunto de reglas original.

conocido
fuente
1
En términos de economía de recursos, esta es la mejor respuesta, y no veo por qué esto funcionaría peor que los métodos mucho más intensivos en datos propuestos.
Proyecto Chthonic
3

@Nathan Long: Descargar wikipedia en realidad no es una mala idea. No se necesitan todas las imágenes, videos y otros medios.

Escribí un (horrible) programa en php y javascript (!) Para leer toda la wikipedia sueca (o al menos todos los artículos a los que se podía acceder desde el artículo sobre matemáticas, que fue el comienzo de mi araña).

Recopilé todas las palabras y enlaces internos en una base de datos y también mantuve un registro de la frecuencia de cada palabra. Ahora lo uso como una base de datos de palabras para varias tareas: * Encontrar todas las palabras que se pueden crear a partir de un conjunto de letras dado (incluido el comodín) * Creé un archivo de sintaxis simple para sueco (todas las palabras que no están en la base de datos se consideran incorrectas).

Ah, y descargar el wiki completo tomó aproximadamente una semana, usando mi computadora portátil funcionando la mayor parte del tiempo, con una conexión de 10 Mbit.

Cuando esté en eso, registre todas las ocurrencias que sean inconsistentes con el idioma inglés y vea si algunas de ellas son errores. Vaya a arreglarlos y devuelva algo a la comunidad.

Por Alexandersson
fuente
2

Tenga en cuenta que existen diferencias entre los dialectos estadounidenses y británicos, como señaló Grammar Girl en su episodio A Versus An .

Una complicación es cuando las palabras se pronuncian de manera diferente en inglés británico y estadounidense. Por ejemplo, la palabra para cierto tipo de planta se pronuncia "erb" en inglés americano y "herb" en inglés británico. En los raros casos en que esto sea un problema, use el formulario que se espera en su país o por la mayoría de sus lectores.

Jan Aagaard
fuente
2

Eche un vistazo a Lingua :: EN :: Inflect de Perl . Ver sub _indef_articleen el código fuente.

Sinan Ünür
fuente
Las excepciones se encuentran en inflexiones.t. Me parece que la lista es bastante incompleta.
Jan Aagaard
1

¿Podrías conseguir un diccionario de inglés que almacene las palabras escritas en nuestro alfabeto normal y el alfabeto fenético internacional ?

Luego use la fenética para averiguar el sonido inicial de la palabra y, por lo tanto, si “a” o “an” es apropiado.

No estoy seguro de si eso sería realmente más fácil (o tan divertido como) el enfoque estadístico de Wikipedia.

Paul D. Waite
fuente
0

Usaría un algoritmo basado en reglas para cubrir tantos como pudiera, luego usaría una lista de excepciones. Si quisiera ser elegante, podría intentar determinar algunas "reglas" nuevas de su lista de excepciones.

AL Flanagan
fuente
0

Simplemente parece un conjunto de heurísticas. Debe ser un poco más complicado y responder algunas cosas para las que nunca obtuve una buena respuesta, por ejemplo, ¿cómo se tratan las abreviaturas ("un RPM" o "un RPM"? Siempre pensé que este último tiene más sentido).

Una búsqueda rápida dio como resultado bibliotecas lingüísticas que hablan sobre cómo manejar el prefijo singular en inglés, pero probablemente puedas encontrar algo si profundizas lo suficiente. Y si no, siempre puedes escribir tu propia biblioteca de inflexiones y ganar fama mundial :-).

Guss
fuente
Las abreviaturas como RPM no son un problema. Como dices, se pueden tratar de cualquier manera. De ahí que la solución sea obvia: ignóralos.
Andrew J. Brehm
No estaría de acuerdo porque eso causa un prefijo inconsistente. Simplemente ignorarlo causaría "un RPM" y "un UGC", lo cual es claramente incorrecto.
Guss
0

Supongo que no puedes simplemente completar algunas cosas de la placa de la caldera como 'a / an' como un paso para cubrir todo. De lo contrario, terminará con errores de suposición, como todas las palabras con 'h' proceden de 'o' obtienen 'an' en lugar de 'a' como 'casa' - (¿una casa?). Básicamente, terminarás incluyendo la lógica del idioma inglés u ocasionalmente encontrarás casos raros que te harán parecer tonto.


fuente
0

Verifique si una palabra comienza con una vocal o un consonente. Una "u" es generalmente una consonante y una vocal ("yu"), por lo tanto pertenece al grupo de consonantes para sus propósitos.

La letra "h" significa una parada gottal (una consonante) en francés y en palabras francesas utilizadas en inglés. Puede hacer una lista de ellos (de hecho, incluir "honor", "honor" y "hora" podría ser suficiente) y contarlos como si comienzan con vocales (ya que el inglés no reconoce una oclusión glotal).

También cuente "eu" como consonante, etc.

No es muy dificil.

Andrew J. Brehm
fuente
0

la elección de una o una depende de la forma en que se pronuncia la palabra. Al mirar la palabra, no se puede decir necesariamente su pronunciación correcta, por ejemplo, jerga o abreviatura, etc. Una de las formas puede ser tener un diccionario con soporte para fonemas y usar la información del fonema asociada con la palabra para determinar si una "a "o una" una "debe usarse.

Rohin
fuente
0

No puedo estar seguro de que tenga la información adecuada para diferenciar "una" y "una", pero la base de datos WordNet de Princeton existe precisamente para el propósito de tareas similares, así que creo que es probable que los datos estén ahí. . Tiene algunas decenas de miles de palabras y cientos de miles de relaciones entre dichas palabras (IIRC; no puedo encontrar las estadísticas actuales en el sitio). Échale un vistazo. Se puede descargar gratuitamente.

rmeador
fuente
0

¿Cómo? ¿Y cuando? Obtenga el sustantivo con el artículo adjunto. Pídelo en forma específica.

Pregunte por el sustantivo con el artículo. Muchas bases de código MUD almacenan elementos como información que consiste en:

  • una o más palabras clave
  • una forma corta
  • una forma larga

La forma de la palabra clave podría ser "espada corta oxidada". La forma corta será "una espada". La forma larga será "una espada corta oxidada".

¿Está escribiendo un servicio web "a vs. an"? Dé un paso atrás y observe si puede atacar esta fuga más arriba. Puede construir una presa, pero a menos que detenga su flujo, eventualmente se derramará.

Determine qué tan crítico es esto y, como otros han sugerido, elija "rápido pero tosco" o "caro pero resistente".

maxwellb
fuente
0

La regla es muy sencilla. Si la siguiente palabra comienza con un sonido de vocal, use 'an', si comienza con una consonante, use 'a'. Lo difícil es que nuestra clasificación escolar de vocales y consonantes no funciona. La 'h' en 'honor' es una vocal, pero la 'h' en 'hospital' es una consonante.

Peor aún, algunas palabras como "honesto" comienzan con una vocal o una consonante, dependiendo de quién las diga. Peor aún, algunas palabras cambian dependiendo de las palabras que las rodean para algunos hablantes.

El problema está limitado únicamente por la cantidad de tiempo y esfuerzo que quiera dedicarle. Puede escribir algo en pareja usando 'aeiou' como vocales en un par de minutos, o puede pasar meses haciendo análisis lingüísticos de su público objetivo. Entre ellos hay una gran cantidad de heurísticas que serán correctas para algunos hablantes e incorrectas para otros, pero debido a que diferentes hablantes tienen diferentes determinaciones para la misma palabra, simplemente no es posible tener la razón todo el tiempo sin importar cómo lo haga. eso.

KayEss
fuente
0

El enfoque ideal sería encontrar un lugar en línea que pueda brindarle las respuestas, consultarlas de forma dinámica y almacenarlas en caché. Puede preparar el sistema con unos pocos cientos de palabras para empezar.

(No conozco una fuente en línea de este tipo, pero no me sorprendería si la hubiera).

Lamidas calientes
fuente
0

Por lo tanto, es posible una solución razonable sin descargar todo Internet. Esto es lo que hice:

Recordé que Google publicó sus datos sin procesar para las frecuencias N-Gram de Google Books aquí . Así que descargué los archivos de 2 gramos para "a_" y "an". Se trata de 26 conciertos si mal no recuerdo. A partir de eso, elaboré una lista de cadenas en las que estaban abrumadoramente precedidas por el artículo opuesto que cabría esperar (si tuviéramos que esperar que las vocales tomen una "una"). Esa lista final de palabras que pude almacenar en menos de 7 kilobytes.

IngisKahn
fuente
-2

¿Usas "a" cuando la siguiente palabra no es una vocal? ¿Y usas "an" siempre que hay una vocal?

Dicho esto, ¿no podrías simplemente usar una expresión regular como "a \ s [a, e, i, o, u]. *"? Y luego reemplácelo con un "¿un?"

Daniel
fuente
No, porque la regla se refiere a los sonidos de las vocales , no a las letras de las vocales . "Usuario" comienza con una vocal, pero la pronunciación no.
Joris Groosman