我正在寻找一个数据结构来保留同义词。我希望“华盛顿特区”,“华盛顿特区”或“华盛顿特区”都联系到“华盛顿”。类似于List
=>Value
结构。同义词的数据结构
我有一个服务,发送电子邮件给用户,如果他们的城市在特定网站上提到。他们在注册时输入他们的电子邮件和城市。但是有些人会进入“华盛顿”,还有一些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿特区”或“华盛顿”,我希望这些人都在同一个“桶”中,并向这些人发送电子邮件。
我正在寻找一个数据结构来保留同义词。我希望“华盛顿特区”,“华盛顿特区”或“华盛顿特区”都联系到“华盛顿”。类似于List
=>Value
结构。同义词的数据结构
我有一个服务,发送电子邮件给用户,如果他们的城市在特定网站上提到。他们在注册时输入他们的电子邮件和城市。但是有些人会进入“华盛顿”,还有一些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿特区”或“华盛顿”,我希望这些人都在同一个“桶”中,并向这些人发送电子邮件。
我会推荐使用列表的散列。
例如:
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)
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
接下来,创建一个哈希映射每个已知的同义词它的列表,或循环通过它们,或其他。
我想这可以工作,如果第一个元素始终是我正在寻找的“主”元素。谢谢 – Chris911 2013-04-24 05:11:27
不错的代表!从你的代码中学到很多东西。 :) – 2013-04-24 07:17:27
根据您的明确需求,最简单的解决方案可能是一个简单的哈希,其中每一个可能的同义词仅指向规范城市名称:
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"
,然后联系那些规范的城市偏好匹配的人。
我认为这是最简单的解决方案。谢谢 – Chris911 2013-04-24 05:23:25
Ruby中的哈希允许任何类型的对象作为关键字,包括数组,因此您的“类似于数组”=>“值”的东西是完全可能的。这实际上是否是一个有用的结构完全取决于你打算如何使用它,这是不明确的。 – 2013-04-24 04:59:47
你有什么要求?记忆不足?快速查找?从任何同义词访问其他人?你有什么尝试?你的尝试有什么问题? -1看起来是一个不明确的和懒惰的问题。 – Phrogz 2013-04-24 05:00:06
我有一项服务,如果用户在特定网站上提到的城市发送电子邮件给用户。他们在注册时输入他们的电子邮件和城市。但是有些人会进入“华盛顿”,还有一些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿特区”或“华盛顿”,我希望这些人都在同一个“桶”中,并向这些人发送电子邮件。 – Chris911 2013-04-24 05:05:16