【问题标题】:Dictionary API (lexical) [closed]字典 API(词法)[关闭]
【发布时间】:2010-09-25 00:45:45
【问题描述】:

有谁知道好的 .NET 字典 API 吗?我对含义不感兴趣,而是需要能够以多种不同方式查询单词——返回 x 长度的单词、返回部分匹配等等......

【问题讨论】:

    标签: c# .net api


    【解决方案1】:

    从像 ASpell (http://aspell.net/) 这样的开源拼写检查器中获取平面文本文件,并将其加载到列表或任何您喜欢的结构中。

    例如,

    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"); });
    

    【讨论】:

    • 我相信代码需要 C# 3.0,以及带有 LINQBridge 的 .NET 3.5 或 .NET 2.0。在这方面,.NET 3.0 没有提供任何比 .NET 2.0 有用的东西。
    • 没错,我已经在 3.0 中工作了一段时间,所以我想我已经习惯了在需要时使用 LINQ。编辑为包含非 3.0 示例。
    • 为什么我只能投票一次? ;)
    • 我浏览了aspell.net,但找不到纯文本文件。我怎样才能得到平面文本文件?我是否必须安装 Aspell 并在安装目录中搜索该文件?
    • @kiltek 这个命令aspell -d en dump master | aspell -l en expand &gt; my.dict 将使用 aspell 生成一个纯文本文件,如在此处回答 --> superuser.com/a/137990/1430 (但是,我将 pl 替换为英语的 en
    【解决方案2】:

    您可能想要寻找Trie 实现。这肯定有助于“以 XYZ 开头的单词”以及完全匹配。您可能希望将所有数据放在多个数据结构中,每个数据结构都针对特定任务进行调整 - 例如一个用于字谜,一个用于“按长度”等。如今,与 RAM 相比,自然语言词典相对较小,因此如果您真的想要快速查找,这可能是要走的路。

    【讨论】:

      【解决方案3】:

      根据您的查询涉及的程度,可能值得研究WordNet,它基本上是一个语义词典。它包括词性、同义词以及词之间的其他类型的关系。

      【讨论】:

        【解决方案4】:

        NetSpell (http://www.loresoft.com/netspell/) 是一个用 .NET 编写的拼写检查器,其中包含多种语言的单词列表供您使用。

        【讨论】:

          【解决方案5】:

          我支持Barry Fandango,但您可以不使用 LINQ。 .NET 2.0 在 List(T) 类型上有一些不错的过滤方法。我建议的是

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

          此方法将通过谓词方法将列表中的每个元素放入并返回返回'true'的单词列表。因此,按照开源词典的建议将您的单词加载到 List(String) 中。查找所有长度为 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');
              });
          

          【讨论】:

          • 哦,快,他也写了 C# 2.0 代码……哎呀。 (自我说明:完整阅读答案)
          猜你喜欢
          • 2011-07-06
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          相关资源
          最近更新 更多