1

我正在寻找一种数据结构来保留同义词。我希望“Washington DC”、“Washington DC”或“Washington DC”都与“Washington”相关联。类似于List=>Value结构的东西。

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

4

3 回答 3

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

接下来,创建一个哈希映射每个已知的同义词到它的列表,或者遍历它们,或者其他什么。

于 2013-04-24T05:08:30.583 回答
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)
于 2013-04-24T04:57:24.333 回答
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",然后联系那些符合标准城市偏好的人。

于 2013-04-24T05:17:39.830 回答