我正在寻找一种保存同义词的数据结构。我希望“华盛顿特区”,“华盛顿特区”或“华盛顿特区”都与“华盛顿”联系在一起。像List
=>这样的东西Value
结构。
我有一项服务,如果在特定网站上提及他们的城市,则会向用户发送电子邮件。注册后,他们会输入他们的电子邮件和城市。然而,有些人会进入“华盛顿”,有些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿D.C”或“华盛顿”,我希望这些都在同一个“桶”中并向所有这些人发送电子邮件。
答案 0 :(得分: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
接下来,创建一个哈希映射,将每个已知的同义词映射到其列表,或循环遍历它们,或者其他任何内容。
答案 1 :(得分:2)
我建议使用列表哈希。
例如:
synonyms = {"Washington" => ["Washington D.C.", "Washington DC", "Washington D.C"], ...}
然后,您可以获得哈希表的快速查找时间,并且可以迭代这些项目并对它们执行列表操作。
<强>更新强>
听起来你想要的仍然是哈希。但是,您需要做的是将同义词列表中的任何给定成员与所有其他同义词的列表相关联。
您可以构建一个简单的函数来执行此操作,例如:
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)
答案 2 :(得分:1)
根据您澄清的需求,最简单的解决方案可能是一个简单的Hash,其中每个可能的同义词只是指向规范的城市名称:
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"
,然后与规范的城市偏好匹配的人联系。