2008-12-02 143 views
16

有誰知道一個很好的.NET字典API?我對意義不感興趣,而是需要能夠以多種不同的方式查詢單詞 - 返回單詞x長度,返回部分匹配等等......詞典API(詞法)

回答

21

從像ASpell(http://aspell.net/)這樣的開源拼寫檢查器中獲取平面文本文件,並將其加載到List或任何您喜歡的結構中。

例如,

List<string> words = System.IO.File.ReadAllText("MyWords.txt").Split(new string[]{Environment.NewLine}).ToList(); 

// C# 3.0 (LINQ) example: 

    // get all words of length 5: 
    from word in words where word.length==5 select word 

    // get partial matches on "foo" 
    from word in words where word.Contains("foo") select word 

// C# 2.0 example: 

    // get all words of length 5: 
    words.FindAll(delegate(string s) { return s.Length == 5; }); 

    // get partial matches on "foo" 
    words.FindAll(delegate(string s) { return s.Contains("foo"); }); 
+0

我相信,代碼需要C#3.0,並且或者.NET 3.5。 NET 2.0與LINQBridge。在這方面,.NET 3.0沒有提供比.NET 2.0更有用的東西。 – 2008-12-03 11:15:36

+0

的確,我已經在3.0中工作了一段時間了,所以我想我已經習慣了在我需要時使用LINQ。編輯爲包含非3.0樣本。 – 2008-12-03 14:03:33

4

您可能想要查找Trie執行。這肯定有助於「以XYZ開頭的單詞」以及完全匹配。您可能希望將所有數據都放在多個數據結構中,每個數據結構都針對特定任務進行調整 - 例如一個用於anagrams,一個用於「按長度」等。與RAM相比,自然語言字典與RAM相比是相對較小的,所以如果你真的想快速查找,那可能是一條可行的路。

2

根據您的查詢如何參與將是,它可能是值得研究WordNet,這基本上是一個語義字典。它包括詞的部分,同義詞和其他類型的關係。

2

我與Barry Fandango在這一個,但你可以做到這一點沒有LINQ。 .NET 2.0在List(T)類型上有一些很好的過濾方法。一個我的建議是

List(T).FindAll(Predicate(T)) : List(T) 

這種方法將使每一個元素在列表中通過判斷方法,並返回返回「真」字的列表。因此,按照建議從開源詞典中將您的單詞加載到List(字符串)中。爲了找到長度爲5的所有的話...

List(String) words = LoadFromDictionary(); 
List(String) fiveLetterWords = words.FindAll(delegate(String word) 
    { 
     return word.Length == 5; 
    }); 

還是爲了以 'ABC' 的所有單詞......

List(String) words = LoadFromDictionary(); 
List(String) abcWords = words.FindAll(delegate(String word) 
    { 
     return word.StartsWith('abc'); 
    });