同义词的数据结构

时间:2013-04-24 04:54:21

标签: ruby database data-structures

我正在寻找一种保存同义词的数据结构。我希望“华盛顿特区”,“华盛顿特区”或“华盛顿特区”都与“华盛顿”联系在一起。像List =>这样的东西Value结构。

我有一项服务,如果在特定网站上提及他们的城市,则会向用户发送电子邮件。注册后,他们会输入他们的电子邮件和城市。然而,有些人会进入“华盛顿”,有些人会进入“华盛顿特区”。现在,如果网站上提到“华盛顿D.C”或“华盛顿”,我希望这些都在同一个“桶”中并向所有这些人发送电子邮件。

3 个答案:

答案 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",然后与规范的城市偏好匹配的人联系。