Сравнение списка строк с доступным словарем / тезаурусом - PullRequest
4 голосов
/ 12 февраля 2010

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Вы можете загрузить список слов из Интернета (например, один из файлов, упомянутых здесь: 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);
    }
}
1 голос
/ 15 февраля 2010

Вы также можете использовать Викисловарь. 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, но я не настолько знаком с ним, поэтому это было больно, и я отказался от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...