我有一個生成字符串列表(原始字符串的排列)的程序(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. 將列表與字典進行比較
- 2. 將字符串的字符與字典進行比較python
- 3. 如何將字符串與字典元素進行比較?
- 4. 二進制字符串比較/分類與字典字符串比較/排序
- 5. python - 如何將字典的鍵與字符串字符進行比較
- 6. 將數組/字符串及其排列與字典進行比較
- 7. 將字典中的值與列表中的值進行比較
- 8. 迭代列表並將其值與字典進行比較
- 9. 將字典的鍵與列表進行比較
- 10. 將字符串與字符列表進行比較
- 11. 比較字典列表
- 12. 比較列表和字典
- 13. 分割字符串辭典(表)
- 14. 將字典與不可比較的值或不可比較的值進行比較? (如列表或數據框)
- 15. 將字典中的鍵與字符串列表進行比較並對值進行求和
- 16. 通過字符串與字符串列表進行比較
- 17. 將DataTable列表與字符串列表進行比較
- 18. 將字符串列表與布爾列表進行比較
- 19. 解碼比較列表與字典
- 20. 比較兩個字典(字典<字符串,列表<string>>)
- 21. 可以將結構體與散列表或字典進行比較
- 22. 兩個字典在C#與字符串比較,字典<串,對象>>
- 23. 將sqlite與字符串進行比較
- 24. 將char與字符串進行比較
- 25. 將Arraylist與字符串進行比較
- 26. 將列表與字典進行比較以在python中創建新列表
- 27. 字典列表和比較列表python
- 28. 比較字典
- 29. 將用戶輸入整數與字典值進行比較? (Python)
- 30. 如何將字符串與PHP中的字符串列表進行比較?
謝謝。我主要關注的是從哪裏獲得單詞列表(是否有現成的可用資源),這最好是對英語的廣泛表示。 但是你的代碼已經回答了我想要的任何進一步的問題......「那麼我該如何使用它?」 謝謝 – 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