2008-12-02 137 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'); 
    });