2013-04-24 3 views
1

Я ищу структуру данных для хранения синонимов. Я бы хотел, чтобы «Вашингтон Д.К.», «Вашингтон, округ Колумбия» или «Вашингтон Д.К.» присоединились к «Вашингтону». Что-то вроде List =>Value Структура.Структура данных для синонимов

У меня есть служба, которая отправляет электронное письмо пользователям, если их город указан на конкретном веб-сайте. Когда они регистрируются, они вводят свой адрес электронной почты и город. Однако некоторые люди войдут в «Вашингтон» и некоторые другие «Вашингтон Д.К.». Теперь я хочу, чтобы они были в одном «ведре» и отправляли всем этим людям электронное письмо, если на сайте упоминаются «Вашингтон Д.С.» или «Вашингтон».

+1

Хеши в Ruby позволяют использовать любой тип объекта в качестве ключа, включая массивы, поэтому ваше «что-то вроде« Array' => 'Value'» вполне возможно. На самом деле это полезная структура полностью зависит от того, как вы собираетесь ее использовать, что неясно. –

+0

Что вы требуете? Мало памяти? Быстрый поиск? Доступ от любого синонима к другим? Что вы пробовали? Какие проблемы у вас возникают с вашими попытками? -1 для того, что, по-видимому, является непродуманным и ленивым вопросом. – Phrogz

+0

У меня есть служба, которая отправляет электронное письмо пользователям, если их город упоминается на конкретном веб-сайте. Когда они регистрируются, они вводят свой адрес электронной почты и город. Однако некоторые люди войдут в «Вашингтон» и некоторые другие «Вашингтон Д.К.». Теперь я хочу, чтобы они были в одном «ведре» и отправляли всем этим людям электронное письмо, если на сайте упоминаются «Вашингтон Д.С.» или «Вашингтон». – Chris911

ответ

2

Я бы порекомендовал использовать хэш списков.

Например:

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) 
+0

Отлично, если OP хочет увидеть синонимы для «Вашингтон». Плохо, если OP хочет увидеть, что «Вашингтонский округ Колумбия» является синонимом. Это один ответ на очень неопределенный вопрос. – Phrogz

+0

Извините, не был уверен, как задать вопрос. То, что я хочу, это то, что упомянул @Phrogz. Я хотел бы знать, что «Вашингтонский округ Колумбия» является синонимом. – Chris911

+0

Обновлено, это больше похоже на то, что вы спрашиваете? – mjgpy3

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 

Далее создайте хэш переводящий каждый известный синоним его список, или через них, или что-то еще.

+0

Я думаю, это может сработать, если первый элемент всегда является «основным» элементом, который я ищу. Спасибо – Chris911

+0

Хорошее представительство! Выучил много из вашего кода. :) –

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", а затем свяжитесь с людьми, чьи канонические предпочтения города совпадают.

+0

Я думаю, что это самое простое решение. благодаря – Chris911

Смежные вопросы