Я работаю над определением позиции сообщения, используя 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
, но это будет связано с стреляя п число запросов, а не закончить работу с помощью одного запроса ... Есть ли другой способ достижения этой цели?
Вы можете хранить количество каждого слова в базе данных, если у вас есть возможность обрабатывать содержимое перед вставкой. Вероятно, вам нужно изменить тип данных столбца в hstore. В качестве альтернативы вы можете сделать счет на слово, возвращающее целое число, которое вы можете умножить на свой счет. – Ash