4

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

4

2 回答 2

3

你可以从网上下载一个单词列表(比如这里提到的文件之一: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);
    }
}
于 2010-02-11T23:46:12.053 回答
1

您也可以使用维基词典。MediaWiki API(Wikionary 使用 MediaWiki)允许您查询文章标题列表。在维基词典中,文章标题(除其他外)是字典中的单词条目。唯一的问题是字典中也有外来词,所以有时你可能会得到“不正确”的匹配。当然,您的用户还需要访问互联网。您可以在以下网址获得有关 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,但我对它不是很熟悉,所以很痛苦,我放弃了它。

于 2010-02-15T11:52:29.293 回答