Сравнение списка строк с доступным словарем / тезаурусом
-
20-09-2019 - |
Вопрос
У меня есть программа (C #), которая генерирует список строк (перестановки исходной строки).Большинство строк представляют собой случайную группировку исходных букв, как и ожидалось (например, etam, aemt, team).Я хочу программно найти одну строку в списке, которая является реальным английским словом.Мне нужен тезаурус / словарь для поиска и сравнения каждой строки.Любой человек знает о доступном ресурсе.Я использую 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);
}
}
Другие советы
Вы также можете использовать Викисловарь.MediaWiki API (Wikionary использует MediaWiki) позволяет запрашивать список названий статей.В викисловаре названия статей - это (помимо прочего) словарные записи в словаре.Единственная загвоздка в том, что иностранные слова также есть в словаре, так что иногда вы можете получить "неправильные" совпадения.Вашему пользователю, конечно, также понадобится доступ в Интернет.Вы можете получить справку и информацию об 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).Это "настоящие слова".
Я написал реализацию и протестировал ее (используя простой пример "dog", приведенный выше).Он вернул просто "собаку" и "бога".Вам следует протестировать его более тщательно.
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, но я не настолько хорошо знаком с ним, так что это было непросто, и я отказался от этого.