2013-04-24 42 views
1

我正在寻找一个数据结构来保留同义词。我希望“华盛顿特区”,“华盛顿特区”或“华盛顿特区”都联系到“华盛顿”。类似于List =>Value结构。同义词的数据结构

我有一个服务,发送电子邮件给用户,如果他们的城市在特定网站上提到。他们在注册时输入他们的电子邮件和城市。但是有些人会进入“华盛顿”,还有一些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿特区”或“华盛顿”,我希望这些人都在同一个“桶”中,并向这些人发送电子邮件。

+1

Ruby中的哈希允许任何类型的对象作为关键字,包括数组,因此您的“类似于数组”=>“值”的东西是完全可能的。这实际上是否是一个有用的结构完全取决于你打算如何使用它,这是不明确的。 – 2013-04-24 04:59:47

+0

你有什么要求?记忆不足?快速查找?从任何同义词访问其他人?你有什么尝试?你的尝试有什么问题? -1看起来是一个不明确的和懒惰的问题。 – Phrogz 2013-04-24 05:00:06

+0

我有一项服务,如果用户在特定网站上提到的城市发送电子邮件给用户。他们在注册时输入他们的电子邮件和城市。但是有些人会进入“华盛顿”,还有一些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿特区”或“华盛顿”,我希望这些人都在同一个“桶”中,并向这些人发送电子邮件。 – Chris911 2013-04-24 05:05:16

回答

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想要看看“华盛顿特区”是什么意思,那就太差了。这是一个非常不明确的问题的答案。 – Phrogz 2013-04-24 05:01:07

+0

对不起,不知道如何指定问题。我想要的实际上是@Phrogz提到的。我想知道“华盛顿特区”是什么意思。 – Chris911 2013-04-24 05:03:06

+0

更新后,这更像是你在问什么? – mjgpy3 2013-04-24 05:18:41

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 2013-04-24 05:11:27

+0

不错的代表!从你的代码中学到很多东西。 :) – 2013-04-24 07:17:27

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 2013-04-24 05:23:25