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
c#
nlp
linguistics
centeno
fuente
fuente
Respuestas:
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
AvsAn
en 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:
... lo que simplemente subraya que un sistema basado en reglas sería complicado de construir.
fuente
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.
fuente
Si pudiera encontrar una fuente de ortografía de palabras para pronunciaciones de palabras, como:
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.
fuente
hawr-uh-buhl
siempre me hace reír.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 ...
fuente
Dado que "a" y "an" están determinados por reglas fonéticas y no por convenciones ortográficas, probablemente lo haría así:
fuente
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 :
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:
Probablemente sea más fácil crear la regla y luego crear una lista de excepciones y usarla. No me imagino que habrá tantos.
fuente
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.
fuente
@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.
fuente
Tenga en cuenta que existen diferencias entre los dialectos estadounidenses y británicos, como señaló Grammar Girl en su episodio A Versus An .
fuente
Eche un vistazo a Lingua :: EN :: Inflect de Perl . Ver
sub _indef_article
en el código fuente.fuente
He portado una función de Python (originalmente del paquete CPAN Lingua-EN-Inflect) que determina correctamente los sonidos de las vocales en C # y la he publicado como respuesta a la pregunta Determinar programáticamente si describir un objeto con un o un? . Puede ver el fragmento de código aquí .
fuente
¿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.
fuente
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.
fuente
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 :-).
fuente
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
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.
fuente
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.
fuente
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.
fuente
¿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:
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".
fuente
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.
fuente
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).
fuente
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.
fuente
¿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?"
fuente