2010-02-11 95 views
4

我有一个生成字符串列表(原始字符串的排列)的程序(C#)。大多数字符串是预期的随机分组的原始字母(即etam,aemt,团队)。我想以编程方式在列表中找到一个实际英文单词中的一个字符串。我需要一个词库/字典来查找并比较每个字符串。任何人都知道可用的资源。我在C#中使用VS2008。将字符串列表与可用字典/辞典进行比较

回答

2

你可以从网上下载一个单词列表(比如说这里提到的文件之一:http://www.outpost9.com/files/WordLists.html),然后接着做一个快速:

// Read words from file. 
string [] words = ReadFromFile(); 

Dictionary<String, List<String>> permuteDict = new Dictionary<String, List<String>>(StringComparer.OrdinalIgnoreCase); 

foreach (String word in words) { 
    String sortedWord = new String(word.ToArray().Sort()); 
    if (!permuteDict.ContainsKey(sortedWord)) { 
     permuteDict[sortedWord] = new List<String>(); 
    } 
    permuteDict[sortedWord].Add(word); 
} 

// To do a lookup you can just use 

String sortedWordToLook = new String(wordToLook.ToArray().Sort()); 

List<String> outWords; 
if (permuteDict.TryGetValue(sortedWordToLook, out outWords)) { 
    foreach (String outWord in outWords) { 
     Console.WriteLine(outWord); 
    } 
} 
+0

谢谢。我主要关注的是从哪里获得单词列表(是否有现成的可用资源),这最好是对英语的广泛表示。 但是你的代码已经回答了我想要的任何进一步的问题......“那么我该如何使用它?” 谢谢 – sMaN 2010-02-11 23:51:46

+0

也许这会帮助:http://www.outpost9.com/files/WordLists.html – 2010-02-11 23:57:21

+0

+1我会去这个解决方案,因为它可能会提供最好的性能。我可能只是将每个单词粘在一个HashSet ,但是 - 因为这里没有“价值” - 只是一组单词。 – 2010-02-16 14:09:57

1

您还可以使用维基。 MediaWiki API(Wikionary使用MediaWiki)允许您查询文章标题列表。在wiktionary中,文章标题是字典中的(除其他之外)单词条目。唯一的问题是外国词也在词典中,所以有时你可能会得到“不正确”的匹配。当然,您的用户也需要访问互联网。你可以得到帮助和信息上的API:http://en.wiktionary.org/w/api.php

这里是您的查询URL的一个例子:

http://en.wiktionary.org/w/api.php?action=query&format=xml&titles=dog|god|ogd|odg|gdo 

这将返回以下XML:

<?xml version="1.0"?> 
<api> 
    <query> 
    <pages> 
     <page ns="0" title="ogd" missing=""/> 
     <page ns="0" title="odg" missing=""/> 
     <page ns="0" title="gdo" missing=""/> 
     <page pageid="24" ns="0" title="dog"/> 
     <page pageid="5015" ns="0" title="god"/> 
    </pages> 
    </query> 
</api> 

在C#中,你就可以使用System.Xml.XPath来获取你需要的部分(带pageid的页面项目)。那些是“真实的话”。

我写了一个实现并测试它(使用上面的简单“狗”示例)。它只是返回“狗”和“神”。你应该更广泛地测试它。

public static IEnumerable<string> FilterRealWords(IEnumerable<string> testWords) 
{ 
    string baseUrl = "http://en.wiktionary.org/w/api.php?action=query&format=xml&titles="; 
    string queryUrl = baseUrl + string.Join("|", testWords.ToArray()); 

    WebClient client = new WebClient(); 
    client.Encoding = UnicodeEncoding.UTF8; // this is very important or the text will be junk 

    string rawXml = client.DownloadString(queryUrl); 

    TextReader reader = new StringReader(rawXml); 
    XPathDocument doc = new XPathDocument(reader); 
    XPathNavigator nav = doc.CreateNavigator(); 
    XPathNodeIterator iter = nav.Select(@"//page"); 

    List<string> realWords = new List<string>(); 
    while (iter.MoveNext()) 
    { 
     // if the pageid attribute has a value 
     // add the article title to the list. 
     if (!string.IsNullOrEmpty(iter.Current.GetAttribute("pageid", ""))) 
     { 
      realWords.Add(iter.Current.GetAttribute("title", "")); 
     } 
    } 

    return realWords; 
} 

这样称呼它:

IEnumerable<string> input = new string[] { "dog", "god", "ogd", "odg", "gdo" }; 
IEnumerable<string> output = FilterRealWords(input); 

我试图使用LINQ to XML,但我并不熟悉它,所以这是一个痛苦,我放弃了它。

+0

我认为用WebHttpBinding的WCF应该在这里用于Web服务调用。这很容易做到,你将能够得到结果作为对象列表,然后你就可以使用LINQ-to-Objects。 – casperOne 2010-02-15 21:32:10

+0

@casperOne。啊,我以前从来没有用过WCF,所以我完全不熟悉它。然而,WebClient和XPath很容易完成。我首先写了LINQ到XML,基本上使用了与上述相同的逻辑,但是不幸的是,我一直在返回一个ILinqQueryable或其他一些不是我想要的东西。 WCF容易设置和使用吗? – 2010-02-16 11:25:55