2010-02-11 3 views
4

문자열 목록 (원래 문자열의 순열)을 생성하는 프로그램 (C#)이 있습니다. 대부분의 문자열은 예상대로 원래 문자를 무작위로 그룹화합니다 (예 : etam, aemt, team). 목록에있는 하나의 문자열을 실제 영어 단어 인 프로그램 적으로 찾고 싶습니다. 조회하고 각 문자열을 비교하기 위해 시소러스/사전이 필요합니다. 어느 누구도 사용 가능한 리소스를 알고 있습니다. 임 VS2008 C#을 사용하여.문자열 목록과 사용 가능한 사전/동의어 사전 비교

답변

2

웹에서 단어의 목록을 다운로드 할 수 있습니다 (예를 들어 여기에 언급 된 파일 중 하나를 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); 
    } 
} 
+0

감사합니다. 가장 주요한 관심사는 영어를 폭넓게 사용하는 단어 목록을 어디에서 얻을 수 있는지 (준비된 자료가 있는지 여부에 관계없이)였습니다. 그러나 귀하의 코드가 내가 가진 모든 질문에 대답했습니다 ... "어떻게 사용합니까?" 감사합니다. – sMaN

+0

아마도 도움이 될 것입니다. http://www.outpost9.com/files/WordLists.html –

+0

+1 최고의 성능을 제공 할 가능성이 있으므로이 솔루션을 고려해보십시오. 아마 각 단어를 HashSet 에 붙여 두는 편이 좋을 것입니다. 여기에 '가치'가 없기 때문에 단어 집합 만 있습니다. –

1

또한 위키 낱말 사전을 사용할 수 있습니다. MediaWiki API (Wikionary는 MediaWiki를 사용합니다)를 사용하면 기사 제목 목록을 쿼리 할 수 ​​있습니다. 위키 백과 사전에서, 기사 제목은 (다른 것들 중에서) 사전의 단어 항목입니다. 유일한 어법은 외국어도 사전에 있기 때문에 때로는 "잘못된"일치를 얻을 수도 있습니다. 물론 인터넷 사용자도 필요합니다.

http://en.wiktionary.org/w/api.php?action=query&format=xml&titles=dog|god|ogd|odg|gdo 

이 다음 XML 반환 : 여기에 쿼리 URL의 예입니다 http://en.wiktionary.org/w/api.php

: 당신의 API에 대한 도움과 정보를 얻을 수

C#에서
<?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> 

, 당신은 할 수 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); 

나는 XML에 LINQ를 사용하여 시도하지만 고통이었고 나는 그것을 포기 그래서 나는 그것으로 그 익숙하지 않다.

+0

WebHttpBinding이있는 WCF는 여기 웹 서비스 호출에 사용되어야한다고 생각합니다. 꽤 쉽게 할 수 있고 결과를 LINQ-to-Objects를 사용할 수있는 개체 목록으로 가져올 수 있습니다. – casperOne

+0

@casperOne. 아, 전에 WCF를 사용한 적이 없으므로 완전히 익숙하지 않습니다. 그러나 WebClient와 XPath는 쉽게 할 수있었습니다. 기본적으로 위와 같은 논리를 사용하여 XML에 LINQ를 작성했지만 ILINqQueryable 또는 기타 객체가 아닌 원하는 것을 반환했습니다. WCF는 쉽게 설정하고 사용할 수 있습니까? –