2010-04-06 18 views
9

.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; 
} 

更新:埃蒙指出重複問題的意見:How can I correctly prefix a word with "a" and "an"?我會在這裏和開放的離開這個問答不過,因爲我還沒有真正有一個答案。

+1

根據語法女孩,使用不定冠詞是基於名詞的聲音,值得在這裏注意,我想。 http://grammar.quickanddirtytips.com/ – 2010-04-06 13:23:01

+5

是的,我意識到這一點,但確定從ascii的聲音是相當困難的!因此,想知道是否有任何庫大概檢查基於它們的聲音分組的常用起始字母組合? – 2010-04-06 13:24:52

+0

你應該切換「a」和「an」。 – lugte098 2010-04-06 13:34:45

回答

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; 

所以,你可以定義一些情況下,一些字母組​​合彼此形成一定的聲音。希望這可以幫助。

+1

你的'if'語句對於'h'是非常錯誤的。它會產生'一擊'和'榮譽',這兩者都是不正確的。 – 2010-04-06 14:25:22

+0

您是否熟悉名爲'switch'的控制語句? – ANeves 2010-04-06 14:37:41

+0

@Matthew Ferreira:請記住,這只是一個概念的例子。 – lugte098 2010-04-06 14:44:15

2

因爲你真正要做的就是檢查字符串中的模式,所以可以使用正則表達式。這也應該允許字母連擊的未來擴張就像lutge098談到:

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

這可能是一個漫長而困難的正則表達式,但更有效 – lugte098 2010-04-06 14:42:57

+1

@lugte在看到驗證電子郵件地址的正確方法之前,您還沒有看到一個漫長而困難的正則表達式。這是**超過6行!** – Earlz 2010-04-18 09:55:25

+1

@Earlz如果你這樣說,我想我沒有:D – lugte098 2010-04-19 07:23:11

6

如果這是你需要認真做,你可以考慮移植紅寶石語言學(英語)庫.NET。它是開源的&在計算正確的文章方面做得不錯。

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

+2

+1回答這個問題(是否有一個庫),而不是一起繞過一些代碼。 – 2010-04-18 10:29:32

+1

看來IronRuby剛剛發佈,可能不需要移植!我明天打球。謝謝 – 2010-04-18 20:51:16

0

的基本規則「一」前輔音和「一種」前元音讓你最的方式出現,那將是非常容易實現。問題在於「聽起來像一個元音=」情況 - 這會更難。

0

不,它不像一個額外的n那麼簡單,當下一個字符是元音時。圍繞它有一大堆的細微之處,你也必須考慮如何處理h - 有些使用an之前,有些則沒有。

這也是英文具體的,框架是相對語言不可知的。

這意味着你將不得不煮它自己:)

2

我實現了一個庫來執行此操作:https://github.com/eamonnerbonne/a-vs-an;它是在nuget上的AvsAn。它基於維基百科中的實際使用模式,因此甚至可以處理棘手的事情,比如......

  • 「的0800號」
  • 「牛至∞」
  • 「美國航空航天局飛行」
  • 「國家安全局分析師」

換句話說,它通常甚至會合理地處理很多不是正常詞彙的事情。