图书馆确定名词的不定冠词?

And*_*ock 9 c#

是否有任何.NET库用于确定名词的Indefinite Article

我的粗略尝试是在下面,这可能适用于我的99%的使用(这是可以接受的)只是想知道是否有任何已建立的替代方案?

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;
}
Run Code Online (Sandbox Code Playgroud)

更新:Eamon在评论中指出了一个重复的问题:如何正确地在单词前加上"a"和"an"?我会把这个Q留在这里然后打开,因为我还没有真正得到答案.

Mar*_*ald 6

如果这是您需要认真对待的事情,您可以考虑将Ruby语言学(英语)库移植到.Net.它是开源的,并且在计算正确的文章方面做得非常好.

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

  • +1回答问题(是否有库)而不是拼凑一些代码. (2认同)

CAb*_*ott 5

由于您真正要做的只是检查字符串中的模式,因此您可以使用正则表达式。这也应该允许未来扩展像lutge098谈到的字母组合:

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

  • @lugte 在您了解验证电子邮件地址的正确方法之前,您还没有看到过又长又困难的正则表达式。**超过 6 行长!** (2认同)

lug*_*098 0

我要做的是:

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;
Run Code Online (Sandbox Code Playgroud)

因此,您可以定义某些情况,其中某些字母相互组合形成某种声音。希望这可以帮助。

  • h是一个没有字典就无法解决的问题。让你的程序说伦敦话,他们总是有一个不发音的 h,所以你总是可以选择“an”。 (3认同)