Вы также можете использовать Викисловарь. 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). Это «настоящие слова».
Я написал реализацию и протестировал ее (используя простой «собачий» пример сверху). Вернулись только «собака» и «бог». Вы должны проверить это более подробно.
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, но я не настолько знаком с ним, поэтому это было больно, и я отказался от него.