2010-04-06 11 views
9

¿Hay alguna biblioteca para .NET que se ocupe de determinar el Indefinite Article de un sustantivo?Biblioteca para determinar el artículo indefinido de un sustantivo?

Mi intento crudo está por debajo, lo que probablemente funcionará para el 99% de mi uso (lo cual es aceptable) solo me pregunto si hay alguna alternativa establecida.

public static string GetIndefinateArticle(string noun) 
{ 
    if(string.IsNullOrEmpty(noun)) 
     return noun; 

    var first = noun[0]; 

    if(first == 'a' || 
     first == 'e' || 
     first == 'i' || 
     first == 'o') 
     return "an " + noun; 

    return "a " + noun; 
} 

actualización: Eamon señaló una pregunta duplicado en los comentarios: How can I correctly prefix a word with "a" and "an"? voy a dejar este Q aquí y abierta, sin embargo, porque todavía no tengo realmente una respuesta.

+1

Según Grammar Girl, el uso del artículo indefinido se basa en el sonido del sustantivo, digno de mención aquí, creo. http://grammar.quickanddirtytips.com/ –

+5

Sí, me doy cuenta de esto, ¡pero determinar el sonido de ascii es bastante difícil! De ahí que nos preguntemos si hay alguna libs que presumiblemente controle las combinaciones de letras de inicio comunes agrupadas en función de su sonido. –

+0

debes cambiar la "a" y la "an". – lugte098

Respuesta

0

lo que haría es:

var first = noun[0]; 
var second = noun[1]; 

if(first == 'a' || 
    first == 'e' || 
    first == 'i' || 
    first == 'o') 
    return "an " + self; 

if(first == 'u') 
    if (second == 'n' || 
     second == 'l') 
     return "an " + self; 

if(first == 'h') 
    if (second == 'i') 
     return "an " + self; 

return "a " + self; 

Así se puede definir algunos casos en los que algunas letras en combinación entre sí forman un cierto sonido. Espero que esto ayude.

+1

Tu declaración 'if' para' h' es muy incorrecta. Produciría "un golpe" y "un honor", ambos incorrectos. –

+0

¿Está familiarizado con una instrucción de control llamada 'switch'? – ANeves

+0

@Matthew Ferreira: tenga en cuenta que esto es solo un ejemplo de concepto. – lugte098

2

Dado que lo único que estás haciendo realmente es buscar patrones en la cadena, podrías usar una expresión regular. Esto también debe permitir la futura expansión de las combinaciones de letras como lutge098 hablado de:

public static string GetIndefinateArticle(string noun) 
{ 
    if (Regex.IsMatch(noun, "^([aeio]|un|ul)", RegexOptions.IgnoreCase)) 
     return "an " + noun; 
    else 
     return "a " + noun; 
} 
+0

Probablemente será una expresión regular larga y difícil, pero más efectiva – lugte098

+1

@lugte No ha visto una expresión regular larga y difícil hasta que haya visto la forma correcta de validar una dirección de correo electrónico. Fue ** más de 6 líneas de largo! ** – Earlz

+1

@Earlz Si lo pones de esa manera, supongo que no tengo: D – lugte098

6

Si esto es algo que necesita hecho en serio, usted puede considerar portar la librería Ruby Lingüística (Inglés) para .Net. Es de código abierto & hace un buen trabajo al calcular los artículos correctos.

http://deveiate.org/projects/Linguistics/

+2

+1 para responder a la pregunta (¿hay una biblioteca) en lugar de improvisar algún código. –

+1

¡Ya que IronRuby acaba de ser lanzado, es posible que no haya necesidad de portarlo! Jugaré mañana. Gracias –

0

La regla básica de "a" delante de una consonante y "una" antes de una vocal que obtiene la mayor parte del camino, que sería muy fácil de implementar. El problema es el caso "suena como una vocal = un", eso sería mucho más difícil.

0

No, y no es tan simple como simplemente golpear un extra n cuando el siguiente caracter es una vocal. Hay un montón de sutilezas a su alrededor, y también debe considerar cómo manejar h - algunos usan an antes, y otros no.

Esto también es específico del inglés, y el marco es relativamente independiente del idioma.

Esto significa que usted tendrá que cocinar usted mismo :)

2

Implementé una biblioteca para hacer esto: https://github.com/eamonnerbonne/a-vs-an; es AvsAn en nuget. Se basa en patrones de uso reales en wikipedia y, por lo tanto, incluso se ocupa de cosas complicadas como ...

  • "un número 0800"
  • "una ∞ de orégano"
  • "un vuelo de la NASA"
  • "analista de la NSA"

En otras palabras, por lo general, incluso se tratar razonablemente con muchas cosas que no son palabras normales.

Cuestiones relacionadas