c# nlp linguistics

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



nlp linguistics (23)

Tengo una aplicación .NET donde, dado un sustantivo, quiero que prefija 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

  1. Descargar 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 una sufi sición simple para esto). Esto debería ser sensible a mayúsculas y minúsculas, y necesitarás una longitud máxima de palabra: ¿15 letras?
  4. (opcional) Deseche todos esos prefijos que ocurren menos de 5 veces o donde "a" contra "an" logra menos de 2/3 de la mayoría (o algunos otros umbrales: ajuste aquí). Preferentemente, mantenga el prefijo vacío para evitar casos de esquina.
  5. Puede optimizar su base de datos de prefijos descartando todos los prefijos cuyos padres comparten la misma anotación "a" o "an".
  6. Al determinar si se usa "A" o "AN", busque el prefijo de coincidencia más largo y siga su ejemplo. Si no descartó el prefijo vacío en el paso 4, siempre habrá un prefijo coincidente (a saber, el prefijo vacío); de lo contrario, es posible que necesite un caso especial para una cadena que no coincida por completo (dicha entrada debería ser muy rara) .

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

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

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

  • es un resultado imprevisto, 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.
  • Acrónimos: Es un científico de la NASA, pero un analista de la NSA; un automóvil FIAT, pero una política de FAA.

... ¡lo cual viene a subrayar que un sistema basado en reglas sería complicado de construir!


¿Cómo? ¿Qué tal cuando? Obtener el sustantivo con el artículo adjunto. Pídalo en una forma específica.

Pide el sustantivo con el artículo. Muchos códigos de una base de código de 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ás escribiendo un servicio web "a vs. an"? Da un paso atrás y mira si puedes atacar esta fuga más río arriba. Puedes construir una presa, pero a menos que impidas que fluya, eventualmente se derramará.

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


¿Podría obtener un diccionario de inglés que almacene las palabras escritas en nuestro alfabeto regular y en el alfabeto fenético internacional ?

Luego use la phoenética para descubrir el sonido inicial de la palabra y, por lo tanto, ¿es apropiado "a" o "an"?

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


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

Dicho esto, ¿no podrías simplemente hacer una expresión regular como "a / s [a, e, i, o, u]. *"? Y luego reemplazarlo con un "an?"


@ Nathan Long: descargar wikipedia en realidad no es una mala idea. Todas las imágenes, videos y otros medios no son necesarios.

Escribí un programa (chungo) en php y javascript (!) Para leer toda la wikipedia sueca (o al menos todos los aricles que se podían alcanzar desde el arículo sobre matemática, que fue el comienzo de mi araña).

Recopilé todas las palabras y los enlaces internos en una base de datos, y también hice un seguimiento de la frecuencia de cada palabra. Ahora lo uso como una base de datos para varias tareas: * Encontrar todas las palabras que se pueden crear a partir de un conjunto dado de letras (incluyendo comodines) * 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 la descarga de toda la wiki duró aproximadamente una semana, usando mi computadora portátil la mayor parte del tiempo, con una conexión de 10Mbits.

Cuando lo haga, registre todas las ocurrencias que son inconsistentes con el idioma inglés y vea si algunas de ellas son errores. Repararlos y devolver algo a la comunidad.


Como "a" y "an" están determinados por las reglas fonéticas y no por las ortografías, probablemente lo haga así:

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

Compruebe si una palabra comienza con una vocal o una consonante. 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 las palabras en francés usadas en inglés. Puede hacer una lista de esos (de hecho, incluyendo "honor", "honor" y "hora" podría ser suficiente) y contarlos como comenzando con las vocales (ya que el inglés no reconoce una parada glotal).

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

No es muy difícil.



El enfoque ideal sería encontrar un lugar en línea que pueda darle las respuestas, consultarlas dinámicamente y almacenar en caché las respuestas. Puede cebar el sistema con unos pocos cientos de palabras para empezar.

(No sé de una fuente en línea, pero no me sorprendería si hay una).


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

Recuerdo que Google publicó sus datos sin formato para las frecuencias de N-Gram de Google Books here . Así que descargué los archivos de 2 gramos para "a_" y "an". Son aproximadamente 26 conciertos si recuerdo correctamente. A partir de eso, produje una lista de cadenas donde fueron precedidas abrumadoramente por el artículo opuesto que esperarías (si esperáramos que las vocales tuvieran una "an"). Esa lista final de palabras que pude almacenar en menos de 7 kilobytes.



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

La mejor solución, al parecer, es usar o activar una coincidencia basada en el fonema de la siguiente palabra, con ciertos fonemas siempre asociados con "an" y el resto que pertenece a "a".

La Universidad Carnegie Mellon tiene una gran herramienta en línea para este tipo de controles: http://www.speech.cs.cmu.edu/cgi-bin/cmudict , y en 125k palabras con los 39 fonemas correspondientes. Al conectar una palabra, se proporciona todo el conjunto fonológico, 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 suponer que la palabra es un acrónimo y usar la primera letra para determinar qué artículo indefinido usar en función del mismo conjunto de reglas original.


La regla es muy simple. Si la siguiente palabra comienza con un sonido vocálico, entonces use ''an'', si comienza con una consonante, luego 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 está diciendo. Peor aún, algunas palabras cambian dependiendo de las palabras que los rodean para algunos oradores.

El problema está limitado solo por la cantidad de tiempo y esfuerzo que desea poner en él. Puedes escribir algo en pareja utilizando ''aeiou'' como vocales en un par de minutos, o puedes pasar meses haciendo análisis lingüísticos de tu público objetivo. Entre ellos hay una gran cantidad de heurísticas que serán correctas para algunos oradores e incorrectas para otros, pero dado que diferentes oradores tienen diferentes determinaciones para la misma palabra, simplemente no es posible estar bien todo el tiempo, sin importar cómo lo hagas. eso.


Necesita usar 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 manera estúpida es pedirle a Google las dos posibilidades (usando una de las API de búsqueda) y usar las más populares:

O:

Por lo tanto, "a europe" y "a honest" son las versiones correctas.


Necesitas 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 estos sonidos correctos, pero las reglas de la gramática inglesa son muy claras :

"Las palabras a y an son artículos indefinidos. Utilizamos el artículo indefinido antes de las palabras que comienzan con un sonido vocálico (a, e, i, o, u) y el artículo indefinido a antes de las palabras que comienzan con un sonido consonante (todo 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 se siguen con "an", por ejemplo, "es un honor conocerte". Las palabras que comienzan con un sonido de consonante tienen como prefijo un - por eso dices "un automóvil usado" en lugar de "un automóvil usado", porque "usado" tiene un sonido "yoose" en lugar de "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 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 usar eso. No me imagino que habrá tantos.


No creo que puedas rellenar algunas cosas de la placa de la caldera como ''a / an'' como una tapa de un solo paso. De lo contrario, terminará con errores de suposición como todas las palabras con ''h'' proceden ''o'' obtiene ''an'' en lugar de ''a'' como ''inicio'' - (¿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.


No puedo estar seguro de que tenga la información adecuada para diferenciar "a" y "an", pero la base de datos de WordNet de Princeton existe precisamente para fines similares, por lo que creo que es probable que los datos estén allí. . 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). Dale una mirada. Se puede descargar libremente.


Si pudieras encontrar una fuente de deletreo de palabras a pronunciaciones de palabras, como:

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

Puedes basar tu decisión en el primer personaje de la cadena de pronunciación deletreada. Para el rendimiento, tal vez podría utilizar dicha búsqueda para pregenerar 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 excepciones posibles terminarían en tus conjuntos de excepciones, pero en ese caso, podrías simplemente usar una vocal para consonantes o usar alguna otra heurística con mejores probabilidades.

(Mirando el diccionario CMU, me complació ver que incluye sustantivos propios para países y otros lugares, así que encontrará ejemplos como "un ucraniano", "un periódico de USA Today", "una pintura inspirada en los Urales").

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


Simplemente me parece un conjunto de heurísticas. Necesita 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 el último tiene más sentido).

Una búsqueda rápida se realizó en bibliotecas lingüísticas que hablan sobre cómo manejar el prefijo singular en inglés, pero probablemente puedas encontrar algo si cavas suficientemente. Y si no, siempre puedes escribir tu propia biblioteca de inflexión y ganar fama mundial :-).


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 casos poco frecuentes en los que esto sea un problema, use el formulario que se esperará en su país o la mayoría de sus lectores.


Tienes que implementarlo manualmente y agregar las excepciones que desees como, por ejemplo, si la primera letra es ''H'' y seguida de una ''O'' como honesta, hora ... y también las opuestas como europe, university, used ...


Utilizaría un algoritmo basado en reglas para cubrir tantas como pudiera, y luego usar una lista de excepciones. Si quieres ser elegante, puedes intentar determinar algunas nuevas "reglas" de tu lista de excepciones.


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