我有一个生成字符串列表(原始字符串的排列)的程序(C#)。大多数字符串是预期的随机分组的原始字母(即etam,aemt,团队)。我想以编程方式在列表中找到一个实际英文单词中的一个字符串。我需要一个词库/字典来查找并比较每个字符串。任何人都知道可用的资源。我在C#中使用VS2008。将字符串列表与可用字典/辞典进行比较
回答
你可以从网上下载一个单词列表(比如说这里提到的文件之一: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);
}
}
您还可以使用维基。 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,但我并不熟悉它,所以这是一个痛苦,我放弃了它。
我认为用WebHttpBinding的WCF应该在这里用于Web服务调用。这很容易做到,你将能够得到结果作为对象列表,然后你就可以使用LINQ-to-Objects。 – casperOne 2010-02-15 21:32:10
@casperOne。啊,我以前从来没有用过WCF,所以我完全不熟悉它。然而,WebClient和XPath很容易完成。我首先写了LINQ到XML,基本上使用了与上述相同的逻辑,但是不幸的是,我一直在返回一个ILinqQueryable或其他一些不是我想要的东西。 WCF容易设置和使用吗? – 2010-02-16 11:25:55
- 1. 将字符串的字符与字典进行比较python
- 2. 二进制字符串比较/分类与字典字符串比较/排序
- 3. python - 如何将字典的键与字符串字符进行比较
- 4. 将字典中的值与列表中的值进行比较
- 5. 迭代列表并将其值与字典进行比较
- 6. 将字典的键与列表进行比较
- 7. 将字符串与字符列表进行比较
- 8. 比较列表和字典
- 9. 比较字典列表
- 10. 分割字符串辞典(表)
- 11. 将字典与不可比较的值或不可比较的值进行比较? (如列表或数据框)
- 12. 通过字符串与字符串列表进行比较
- 13. 比较两个字典(字典<字符串,列表<string>>)
- 14. 将char与字符串进行比较
- 15. 将Arraylist与字符串进行比较
- 16. 将列表与字典进行比较以在python中创建新列表
- 17. 比较字典
- 18. 将用户输入整数与字典值进行比较? (Python)
- 19. 如何将字符串与PHP中的字符串列表进行比较?
- 20. 将字符串与python中的类列表进行比较
- 21. 完全可分析字典/辞典
- 22. 比较列表与词典
- 23. python - 比较值与字典
- 24. 将字符串与数组中的字符串进行比较
- 25. 将字符串网址与字符串值进行比较
- 26. 将字符串与其他字符串进行排序比较
- 27. 将数组字符串与字符串进行比较
- 28. 比较2字典<字符串,字符串>实例
- 29. 大熊猫 - 在字典中的列值与值进行比较
- 30. 将列表与字典进行比较并根据结果打印消息
谢谢。我主要关注的是从哪里获得单词列表(是否有现成的可用资源),这最好是对英语的广泛表示。 但是你的代码已经回答了我想要的任何进一步的问题......“那么我该如何使用它?” 谢谢 – sMaN 2010-02-11 23:51:46
也许这会帮助:http://www.outpost9.com/files/WordLists.html – 2010-02-11 23:57:21
+1我会去这个解决方案,因为它可能会提供最好的性能。我可能只是将每个单词粘在一个HashSet,但是 - 因为这里没有“价值” - 只是一组单词。 –
2010-02-16 14:09:57