문자열 목록 (원래 문자열의 순열)을 생성하는 프로그램 (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를 사용합니다)를 사용하면 기사 제목 목록을 쿼리 할 수 있습니다. 위키 백과 사전에서, 기사 제목은 (다른 것들 중에서) 사전의 단어 항목입니다. 유일한 어법은 외국어도 사전에 있기 때문에 때로는 "잘못된"일치를 얻을 수도 있습니다. 물론 인터넷 사용자도 필요합니다.
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를 사용하여 시도하지만 고통이었고 나는 그것을 포기 그래서 나는 그것으로 그 익숙하지 않다.
WebHttpBinding이있는 WCF는 여기 웹 서비스 호출에 사용되어야한다고 생각합니다. 꽤 쉽게 할 수 있고 결과를 LINQ-to-Objects를 사용할 수있는 개체 목록으로 가져올 수 있습니다. – casperOne
@casperOne. 아, 전에 WCF를 사용한 적이 없으므로 완전히 익숙하지 않습니다. 그러나 WebClient와 XPath는 쉽게 할 수있었습니다. 기본적으로 위와 같은 논리를 사용하여 XML에 LINQ를 작성했지만 ILINqQueryable 또는 기타 객체가 아닌 원하는 것을 반환했습니다. WCF는 쉽게 설정하고 사용할 수 있습니까? –
감사합니다. 가장 주요한 관심사는 영어를 폭넓게 사용하는 단어 목록을 어디에서 얻을 수 있는지 (준비된 자료가 있는지 여부에 관계없이)였습니다. 그러나 귀하의 코드가 내가 가진 모든 질문에 대답했습니다 ... "어떻게 사용합니까?" 감사합니다. – sMaN
아마도 도움이 될 것입니다. http://www.outpost9.com/files/WordLists.html –
+1 최고의 성능을 제공 할 가능성이 있으므로이 솔루션을 고려해보십시오. 아마 각 단어를 HashSet에 붙여 두는 편이 좋을 것입니다. 여기에 '가치'가 없기 때문에 단어 집합 만 있습니다. –