4

文字列のリスト(元の文字列の順列)を生成するプログラム(C#)があります。ほとんどの文字列は、予想どおり元の文字をランダムにグループ化したものです(つまり、etam、aemt、team)。プログラムで、実際の英語の単語である1つの文字列をリストから見つけたいと思います。各文字列を検索して比較するには、シソーラス/辞書が必要です。誰もが利用可能なリソースを知っています。C#でVS2008を使用しています。

4

2 に答える 2

3

Webから単語のリストをダウンロードして(たとえば、ここに記載されているファイルの1つ: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);
    }
}
于 2010-02-11T23:46:12.053 に答える
1

Wiktionaryを使用することもできます。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を使ってみましたが、あまり馴染みがないので苦労して諦めました。

于 2010-02-15T11:52:29.293 に答える