2013-04-24 3 views
1

동의어를 유지하기위한 데이터 구조를 찾고 있습니다. 저는 "Washington D.C.", "Washington DC"또는 "Washington D.C"를 "Washington"과 관련된 모든 사람들에게 나누고 싶습니다. List =>Value 구조와 같은 것입니다.동의어에 대한 데이터 구조

저는 특정 웹 사이트에서 도시에 대한 언급이있는 경우 사용자에게 전자 메일을 보내는 서비스가 있습니다. 그들은 등록 할 때 이메일과 도시를 입력합니다. 그러나 어떤 사람들은 "Washington"과 다른 사람들은 "Washington D.C."에 들어갈 것입니다. 이제 저는이 웹 사이트에 "Washington D.C"또는 "Washington"이 언급되어있는 경우 이들을 동일한 "양동이"에 넣어 이메일에 모두 보내주기를 바랍니다.

+1

Ruby의 Hash는 배열을 포함하여 모든 유형의 객체를 키로 허용하므로 "Array =>'Value'와 같은 것이 완전히 가능합니다. 실제로 유용한 구조인지 여부는 사용 방법에 전적으로 달려 있습니다. 이는 명확하지 않습니다. –

+0

귀하의 요구 사항은 무엇입니까? 메모리 부족? 빠른 조회? 어떤 동의어에서 다른 사람에게 액세스 할 수 있습니까? 너 뭐 해봤 니? 당신의 시도에 어떤 문제가 있습니까? 잘못 지정된 게으른 질문 인 것처럼 -1. – Phrogz

+0

특정 도시에서 언급 된 도시가 사용자에게 전자 메일을 보내는 서비스가 있습니다. 그들은 등록 할 때 이메일과 도시를 입력합니다. 그러나 어떤 사람들은 "Washington"과 다른 사람들은 "Washington D.C."에 들어갈 것입니다. 이제 저는이 웹 사이트에 "Washington D.C"또는 "Washington"이 언급되어있는 경우 이들을 동일한 "양동이"에 넣어 이메일에 모두 보내주기를 바랍니다. – Chris911

답변

2

목록의 해시를 사용하는 것이 좋습니다. 예를 들어

:

synonyms = {"Washington" => ["Washington D.C.", "Washington DC", "Washington D.C"], ...} 

그런 다음 당신은 해시 테이블의 빠른 검색 시간의 혜택을받을 당신은 항목을 반복하고 그들에 목록 작업을 수행 할 수 있습니다.

UPDATE

당신이 원하는 것은 여전히 ​​해시처럼 소리. 그러나해야 할 일은 동의어 목록의 주어진 멤버를 다른 모든 동의어 목록과 연관시키는 것입니다.

당신은 예를 들어,이 작업을 수행하는 간단한 함수를 만들 수있다 :

def associate_synonyms(synonyms, syn_hash) 
    synonyms.length.times do 

    synonym = synonyms.pop 

    p synonyms 

    syn_hash[synonym] = synonyms.collect {|x| x} 
    synonyms.insert(0, synonym) 
    end 
end 

그래서, 예를 들어, 사용을 위해 :

place = ["Washington", "Washington D.C.", "Washington DC", "Washington D.C"] 
synonym_lookup = {} 

associate_synonyms(place, synonym_lookup) 
+0

OP가 "Washington"의 동의어를보고 싶으면 좋을 것입니다. OP가 "워싱턴 DC"가 동의어 인 것을보고 싶어하지 않으면 열악합니다. 이는 매우 구체적인 질문에 대한 하나의 대답입니다. – Phrogz

+0

죄송합니다. 질문을 지정하는 방법을 모르 셨습니다. 내가 원하는 것은 실제로 @Phrogz가 언급 한 것입니다. 나는 "워싱턴 DC"가 동의어임을 알고 싶습니다. – Chris911

+0

업데이트 되었습니까? 더 묻고있는 것과 비슷합니까? – mjgpy3

3
class Synonyms 
    def initialize(*syns) 
    @all = [] 
    @idx = {} 
    syns.each{ |syn| self << syn } 
    end 
    def <<(syn) 
    p syn 
    unless @idx.include?(syn) 
     @all << syn 
     @idx[syn] = @all 
    end 
    end 
    def [](syn) 
    @idx[syn] 
    end 
end 

wash = Synonyms.new "Washington DC", "Washington", "Washington D.C." 

p wash["Washington"] #=> ["Washington DC", "Washington", "Washington D.C."] 
p wash["Washington DC"] #=> ["Washington DC", "Washington", "Washington D.C."] 
p wash["Nope"]   #=> nil 

다음, 각 알려진 동의어를 매핑 해시를 생성 그것의 목록, 또는 그들을 통해 루프, 또는 뭐든간에. 당신 명확히 요구 사항에 따라

+0

첫 번째 요소가 항상 내가 찾고있는 "마스터"요소 인 경우이 방법이 효과가 있다고 생각합니다. 감사합니다 – Chris911

+0

멋진 표현! 귀하의 코드에서 많은 것을 배웠습니다. :) –

1

, 가장 간단한 해결책은 아마도 가능한 각 동의어는 단순히 표준 도시 이름을 가리키는 간단한 해시, 다음과 같습니다

city_name_map = {"Washington D.C." => "Washington", 
       "Washington DC" => "Washington", 
       "Washington D.C" => "Washington", 
       "Washington"  => "Washington", 
       # and so forth 
       } 

명는 "Washington D.C."에 자신의 도시 환경을 가입 할 때 데이터베이스는 city_name_map["Washington D.C."]의 값으로 저장되고 "Washington"입니다. 마찬가지로 도시 멘션에 대한 페이지를 검색 할 때 도시의 정식 이름을지도에서 확인하십시오. 웹 사이트에 "Washington DC"이 표시되면이를 검색하여 "Washington"으로 설정 한 다음 정규 도시 선호와 일치하는 사람들에게 연락하십시오.

+0

나는 이것이 가장 쉬운 해결책이라고 생각한다. 감사 – Chris911

관련 문제