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