2013-09-12 3 views
1

Я работаю над определением позиции сообщения, используя AFINN 111, который можно найти here. Всякий раз, когда одно из этих слов упоминается в сообщении, их соответствующие значения выбираются и добавляются, чтобы дать кумулятивный балл, который помогает в определении характера сообщения, будь то + ve или -ve.Ruby WHERE Clause - Listing Duplicate Objects (Postgresql)

У меня есть массив content = ["bad", "bad", "dog"]. Я хочу получить общий балл за слова, используемые в этом сообщении. поэтому, я запускаю db-запрос.

score = Sentiment.where(word: content).pluck(:value).inject(:+) 

В результате я получаю -3. Слово «плохо» имеет соответствующий балл -3. так как слово «плохое» повторяется два раза, я хочу, чтобы результат был равен -6.

Я попытался запустить это в консоли rails, чтобы проверить, сколько объектов возвращается.

Sentiment.where(:id => [1,1]) 

возвращает только один объект ... Есть ли опция, позволяющая возвращать повторяющиеся значения?

Одним из довольно простых решений является итерация по массиву.

score = 0 
content.each do |word| 
score += Sentiment.where(word: word).pluck(:value).first 
end 

, но это будет связано с стреляя п число запросов, а не закончить работу с помощью одного запроса ... Есть ли другой способ достижения этой цели?

+0

Вы можете хранить количество каждого слова в базе данных, если у вас есть возможность обрабатывать содержимое перед вставкой. Вероятно, вам нужно изменить тип данных столбца в hstore. В качестве альтернативы вы можете сделать счет на слово, возвращающее целое число, которое вы можете умножить на свой счет. – Ash

ответ

1

Другое решение с одним запросом:

content = ['bad', 'bad', 'dog'] 

sentiments = Sentiment.where(word: content).group_by(&:word) 

score = 0 

content.each do |word| 
    score += sentiments[word].score if sentiments[word] 
end 

score #=> -6 
+0

Thankyou .. Я сделал небольшое изменение ур кода ... я добавил это состояние .. ** если настроение [слово] .present? ** Таким образом, мы можем избежать ошибок класса ноля для те слова, которые не присутствуют в модели настроения :) Я буду проголосовать за ур, ответьте, как только я получу минимальные точки ответа. :) – Bharath

+0

О, да, вы правы для этого состояния. Спасибо за очки! – Damien