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

时间:2010-04-06 13:20:30

标签: 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;
}

更新:Eamon在评论中指出了一个重复的问题:How can I correctly prefix a word with "a" and "an"?我会在这里留下这个Q并打开,因为我仍然没有真正的答案。< / p>

7 个答案:

答案 0 :(得分:6)

如果这是您需要认真对待的事情,您可以考虑将Ruby Linguistics(英语)库移植到.Net。它是开源的&amp;在计算正确的文章方面做得很好。

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

答案 1 :(得分:2)

由于你所做的只是检查字符串中的模式,你可以使用正则表达式。这也应该允许将来扩展字母组合,如 lutge098 所述:

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

答案 2 :(得分:2)

我从Python移植了一个函数,该函数正确地确定了C#中的元音,并将其作为问题Programmatically determine whether to describe an object with a or an?的答案发布。您可以看到代码段here。这确实比仅仅看元音更复杂。

答案 3 :(得分:2)

我实施了一个库来执行此操作:https://github.com/eamonnerbonne/a-vs-an;它是AvsAn on nuget。它基于维基百科中的实际使用模式,因此甚至可以处理棘手的事情,如...

  • “一个0800号码”
  • “一个∞的牛至”
  • “美国宇航局的一次飞行”
  • “NSA分析师”

换句话说,它通常会合理地处理很多不正常的词。

答案 4 :(得分: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;

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

答案 5 :(得分:0)

在辅音之前的“a”和在元音之前的“an”的基本规则可以让你在那里大部分时间,这将非常容易实现。问题是“听起来像一个元音=一个”的情况 - 这会更难。

答案 6 :(得分:0)

不,当下一个字符是元音时,并不像只是额外的n那样简单。它周围有很多细微之处,你还必须考虑如何处理h - 有些人在它之前使用an,有些则不然。

这也是英语特有的,并且该框架与语言无关。

这意味着你必须自己做饭:)