У меня есть программа (C#), которая генерирует список строк (перестановки исходной строки). Большинство строк представляют собой случайную группировку исходных букв, как ожидалось (т.е. etam, aemt, team). Я хочу найти одну строку в списке, которая является актуальным английским словом, программно. Мне нужен словарь тезауруса/словаря для поиска и сравнения каждой строки. Любой знает доступный ресурс. Im использует VS2008 в C#.Сравнение списка строк с доступным словарем/тезауром
ответ
Вы можете загрузить список слов из Интернета (например один из файлов, упомянутых здесь: 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);
}
}
Вы также можете использовать 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, но я не знаком с ним, так что это была боль, и я отказался от него.
Я думаю, что WCF с WebHttpBinding должен использоваться здесь для вызова веб-службы. Это довольно легко сделать, и вы сможете получить результат как список объектов, которые вы могли бы просто использовать LINQ-to-Objects. – casperOne
@casperOne. Ах, я никогда раньше не использовал WCF, поэтому я совершенно не знаком с ним. Однако WebClient и XPath были достаточно лёгкими. Сначала я написал LINQ для XML, в основном используя ту же логику, что и выше, но проклятая вещь продолжала возвращать ILinqQueryable или какую-то другую вещь, не относящуюся к объекту. Легко ли настроить WCF и использовать? –
- 1. Сравнение двух элементов списка строк
- 2. Сравнение строк как объектов списка
- 3. Сравнение ArrayList строк с массивом строк
- 4. Сравнение строк в представлении списка в android
- 5. Сравнение списка строк со списком boolean
- 6. сравнение строк и индексной ошибки списка
- 7. Сравнение строк с кавычками
- 8. Сравнение строк с дефисом
- 9. сравнение строк не с ++
- 10. Сравнение строк с C++
- 11. Сравнение строк с C
- 12. Сравнение строк с ==
- 13. Сравнение строк с равными
- 14. Сравнение строк с document.getElementById()
- 15. Сравнение строк с часами
- 16. Сравнение строк с условиями
- 17. Сравнение строк на С ++
- 18. Сравнение строк с Javascript
- 19. Сравнение строк с допуском
- 20. Сравнение строк с префикс
- 21. Сравнение строк с гольцов
- 22. Сравнение строк с перегрузкой
- 23. Сравнение строк с использованием ==
- 24. Запретить сравнение строк с ==
- 25. Сравнение строк с QuickConverter
- 26. Сравнение строк с цифрами
- 27. Сравнение строк с QSort
- 28. Сравнение списка с haskell
- 29. Сравнение списка с словарем?
- 30. Сравнение строк в Python с помощью списка слов
Спасибо. Моя главная проблема заключалась в том, где можно получить список слов (имеется ли готовый ресурс), который предпочтительно представляет собой довольно обширное представление английского языка. Но ваш код ответил на любые другие вопросы, которые у меня были бы ... «так как я могу его использовать?» Спасибо – sMaN
Возможно, это поможет: http://www.outpost9.com/files/WordLists.html – 2010-02-11 23:57:21
+1 Я бы выбрал это решение, так как оно может обеспечить наилучшую производительность. Я бы, наверное, просто придерживал каждое слово в HashSet, хотя - поскольку здесь нет «значения» - всего лишь набор слов. –