У меня есть файл JSON, сгенерированный с помощью речи в текст, который возвращает все обнаруженные слова с пунктуацией. Теперь я хочу создать предложения из этого.

Я могу сделать цикл while, пока не будет обнаружена точка, добавить все слова в список и вернуть из него предложение. Но этот цикл while останавливается на первой точке. Как сделать так, чтобы этот цикл продолжался до конца файла json?

with open(json_file) as f:
    data = json.load(f)

for word in data['words']:
    while not data['words'][i]['name'] == '.':
        sentenceList.append(data['words'][i]['name'])
        i +=1
    sentence = ' '.join(word for word in sentenceList)
print (sentence)

Пример JSON:

"words": [
    {
      "duration": "0.18", 
      "confidence": "0.990", 
      "name": "Is", 
      "time": "0.80"
    }, 
    {
      "duration": "0.27", 
      "confidence": "1.000", 
      "name": "dit", 
      "time": "0.99"
    }, 
    {
      "duration": "0.24", 
      "confidence": "1.000", 
      "name": "met", 
      "time": "1.50"
    }, 
    {
      "duration": "0.54", 
      "confidence": "0.990", 
      "name": "vaart", 
      "time": "1.86"
    }, 
    {
      "duration": "0.33", 
      "confidence": "0.990", 
      "name": ".", 
      "time": "2.40"
    }, 
    {
      "duration": "0.06", 
      "confidence": "0.910", 
      "name": "We", 
      "time": "2.73"
    }, 
    {
      "duration": "0.21", 
      "confidence": "1.000", 
      "name": "hebben", 
      "time": "2.79"
    }, 
    {
      "duration": "0.09", 
      "confidence": "1.000", 
      "name": "het", 
      "time": "3.00"
    }, 
    {
      "duration": "0.42", 
      "confidence": "1.000", 
      "name": "vandaag", 
      "time": "3.09"
    }, 
    {
      "duration": "0.30", 
      "confidence": "1.000", 
      "name": "over", 
      "time": "3.51"
    }, 
    {
      "duration": "0.60", 
      "confidence": "1.000", 
      "name": "België", 
      "time": "3.81"
    }, 
    {
      "duration": "0.18", 
      "confidence": "1.000", 
      "name": ".", 
      "time": "4.50"
    }
2
user2811144 1 Июл 2019 в 17:00

3 ответа

Лучший ответ

В вашем случае простого if оператора было бы достаточно, чтобы проверить конец предложения (поскольку каждая последовательность слов во входной структуре заканчивается "name": "."):

sentenceList = []
for word in data['words']:
    if word['name'] == '.':
        sentence = ' '.join(word for word in sentenceList)
        sentenceList = []
        print(sentence)
    else:
        sentenceList.append(word['name'])

Выход:

Is dit met vaart
We hebben het vandaag over België
1
RomanPerekhrest 1 Июл 2019 в 14:35

Я думаю, что решение является прямым. Вы говорите: «Но этот цикл while останавливается на первой точке». Это то, что делает какое-то время, пока оно не будет выполнено. Так что просто замените его структурой if.

with open(json_file) as f:
    data = json.load(f)

for word in data['words']:
    # Check if it's a word or a dot
    if not data['words'][i]['name'] == '.':
        # If word, add it to the array
        sentenceList.append(data['words'][i]['name'])
        i +=1
# All words are appended, now join.
sentence = ' '.join(word for word in sentenceList)
print(sentence)
2
Wimanicesir 1 Июл 2019 в 14:07

Используя itertools.groupby:

data = '''{"words": [
    {
      "duration": "0.18",
      "confidence": "0.990",
      "name": "Is",
      "time": "0.80"
    },
    {
      "duration": "0.27",
      "confidence": "1.000",
      "name": "dit",
      "time": "0.99"
    },
    {
      "duration": "0.24",
      "confidence": "1.000",
      "name": "met",
      "time": "1.50"
    },
    {
      "duration": "0.54",
      "confidence": "0.990",
      "name": "vaart",
      "time": "1.86"
    },
    {
      "duration": "0.33",
      "confidence": "0.990",
      "name": ".",
      "time": "2.40"
    },
    {
      "duration": "0.06",
      "confidence": "0.910",
      "name": "We",
      "time": "2.73"
    },
    {
      "duration": "0.21",
      "confidence": "1.000",
      "name": "hebben",
      "time": "2.79"
    },
    {
      "duration": "0.09",
      "confidence": "1.000",
      "name": "het",
      "time": "3.00"
    },
    {
      "duration": "0.42",
      "confidence": "1.000",
      "name": "vandaag",
      "time": "3.09"
    },
    {
      "duration": "0.30",
      "confidence": "1.000",
      "name": "over",
      "time": "3.51"
    },
    {
      "duration": "0.60",
      "confidence": "1.000",
      "name": "België",
      "time": "3.81"
    },
    {
      "duration": "0.18",
      "confidence": "1.000",
      "name": ".",
      "time": "4.50"
    }
]}'''

import json
from itertools import groupby
d = json.loads(data)
lst = [' '.join(i['name'] for i in g) + '.' for v, g in groupby(d['words'], lambda w: w['name'] != '.') if v]

print(lst)

Печать :

['Is dit met vaart.', 'We hebben het vandaag over België.']
1
Andrej Kesely 1 Июл 2019 в 14:16