2010-02-11 111 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

相關問題