Анализ из файла JSON в Ruby и извлечение чисел из вложенных хэшей

Теперь я работаю над извлечением информации из файла JSON в Ruby. Тогда как я могу извлечь только цифры рядом со словом "оценка" из следующего текстового файла? Например, я хочу получить 0.6748984055823062, 0.6280145725181376.

{
  "sentiment_analysis": [
    {
      "positive": [
        {
          "sentiment": "Popular",
          "topic": "games",
          "score": 0.6748984055823062,
          "original_text": "Popular games",
          "original_length": 13,
          "normalized_text": "Popular games",
          "normalized_length": 13,
          "offset": 0
        },
        {
          "sentiment": "engaging",
          "topic": "pop culture-inspired games",
          "score": 0.6280145725181376,
          "original_text": "engaging pop culture-inspired games",
          "original_length": 35,
          "normalized_text": "engaging pop culture-inspired games",
          "normalized_length": 35,
          "offset": 370
        },
     "negative": [
    {
      "sentiment": "get sucked into",
      "topic": "the idea of planning",
      "score": -0.7923352042939829,
      "original_text": "Students get sucked into the idea of planning",
      "original_length": 45,
      "normalized_text": "Students get sucked into the idea of planning",
      "normalized_length": 45,
      "offset": 342
    },
    {
      "sentiment": "be daunted",
      "topic": null,
      "score": -0.5734506634410159,
      "original_text": "initially be daunted",
      "original_length": 20,
      "normalized_text": "initially be daunted",
      "normalized_length": 20,
      "offset": 2104
    },

Что я пробовал, так это то, что я мог прочитать файл и установить текстовый файл в хэш-переменную с помощью метода JSON.

require 'json'
json = JSON.parse(json_string)

Ответ 1

Вы можете использовать Array#map для сбора отзывов.

reviews = json['sentiment_analysis'][0]
positive_reviews = reviews['positive']
negative_reviews = reviews['negative']

positive_reviews.map { |review| review['score'] }
=> [0.6748984055823062, 0.6280145725181376]

negative_reviews.map { |review| review['score'] }
=> [-0.7923352042939829, -0.5734506634410159]

Надеюсь это поможет!

Ответ 2

Используя класс JSON:

Импорт файла:

require "json"
file = File.open "/path/to/your/file.json"
data = JSON.load file

При желании вы можете закрыть его сейчас:

file.close

Файл выглядит так:

{
  "title": "Facebook",
  "url": "https://www.facebook.com",
  "posts": [
    "lemon-car",
    "dead-memes"
  ]
}

Теперь файл можно прочитать так:

data["title"]
=> "Facebook"
data.keys
=> ["title", "url", "posts"]
data['posts']
=> ["lemon-car", "dead-memes"]
data["url"]
=> "https://www.facebook.com"

Надеюсь, это помогло!

Ответ 3

Разбор данных из файла

data_hash = JSON.parse(File.read('file-name-to-be-read.json'))

Тогда просто сопоставьте данные!

reviews = data_hash['sentiment_analysis'].first
reviews.map do |sentiment, reviews|
  puts "#{sentiment} #{reviews.map { |review| review['score'] }}"
end

Я думаю, что это самый простой ответ.