【问题标题】:Data structure for synonyms同义词的数据结构
【发布时间】:2013-04-24 04:54:21
【问题描述】:

我正在寻找一种数据结构来保留同义词。我希望“华盛顿特区”、“华盛顿特区”或“华盛顿特区”都与“华盛顿”相关联。类似于List => Value 结构。

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

【问题讨论】:

  • Ruby 中的哈希允许任何类型的对象作为键,包括数组,因此您的“类似于Array => Value”是完全可能的。这是否真的是一个有用的结构完全取决于你打算如何使用它,这还不清楚。
  • 您有什么要求?记忆不足?快速查找?从任何同义词访问其他人?你试过什么?你的尝试有什么问题? -1 似乎是一个不明确且懒惰的问题。
  • 我有一项服务,如果他们的城市在特定网站上被提及,我会向用户发送电子邮件。当他们注册时,他们输入他们的电子邮件和城市。然而,有些人会进入“华盛顿”,有些人会进入“华盛顿特区”。现在我希望这些都在同一个“桶”中,如果网站上提到“华盛顿特区”或“华盛顿”,则向所有这些人发送一封电子邮件。

标签: ruby database data-structures


【解决方案1】:
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

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

【讨论】:

  • 我想如果第一个元素始终是我正在寻找的“主”元素,这可能会起作用。谢谢
【解决方案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)

【讨论】:

  • 如果 OP 想要查看“Washington”的同义词,那就太好了。如果 OP 想看看“华盛顿特区”的同义词,那就太糟糕了。这是一个非常不明确的问题的答案。
  • 抱歉,不确定如何指定问题。我想要的实际上是@Phrogz 提到的。我想知道“华盛顿特区”是什么意思。
  • 更新了,这更像你问的吗?
  • 我认为这可能不是一个有效的解决方案。原因是,算法必须检查字典中的每个这样的列表,即每个城市,直到找到包含匹配词的列表。之后将返回键值。
【解决方案3】:

根据您明确的需求,最简单的解决方案可能是一个简单的哈希,其中每个可能的同义词都只是指向规范的城市名称:

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",然后联系符合规范城市偏好的人。

【讨论】:

  • 我认为这是最简单的解决方案。谢谢
  • 但是当你的城市数量不断增加时,这将是空间无效的。我不知道。我想是的。
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多