2010-02-11 2 views
4

У меня есть программа (C#), которая генерирует список строк (перестановки исходной строки). Большинство строк представляют собой случайную группировку исходных букв, как ожидалось (т.е. etam, aemt, team). Я хочу найти одну строку в списке, которая является актуальным английским словом, программно. Мне нужен словарь тезауруса/словаря для поиска и сравнения каждой строки. Любой знает доступный ресурс. Im использует VS2008 в C#.Сравнение списка строк с доступным словарем/тезауром

ответ

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

+0

Возможно, это поможет: http://www.outpost9.com/files/WordLists.html – 2010-02-11 23:57:21

+0

+1 Я бы выбрал это решение, так как оно может обеспечить наилучшую производительность. Я бы, наверное, просто придерживал каждое слово в HashSet , хотя - поскольку здесь нет «значения» - всего лишь набор слов. –

1

Вы также можете использовать Wiktionary. API MediaWiki (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 к XML, но я не знаком с ним, так что это была боль, и я отказался от него.

+0

Я думаю, что WCF с WebHttpBinding должен использоваться здесь для вызова веб-службы. Это довольно легко сделать, и вы сможете получить результат как список объектов, которые вы могли бы просто использовать LINQ-to-Objects. – casperOne

+0

@casperOne. Ах, я никогда раньше не использовал WCF, поэтому я совершенно не знаком с ним. Однако WebClient и XPath были достаточно лёгкими. Сначала я написал LINQ для XML, в основном используя ту же логику, что и выше, но проклятая вещь продолжала возвращать ILinqQueryable или какую-то другую вещь, не относящуюся к объекту. Легко ли настроить WCF и использовать? –

Смежные вопросы