Как более элегантно преобразовать список словарей в другой формат? - PullRequest
1 голос
/ 05 февраля 2020

У меня есть json файл с некоторой информацией о словах. Структура представляет собой список с надписями и выглядит следующим образом:

file = [{"index": "1", "text": "uhm", "eos": false}, {"index": "2", "text": "moeten", "eos": false}, {"index": "3", "text": "langs", "eos": false}, {"index": "4", "text": "uhm", "eos": true}, {"index": "1", "text": "uh", "eos": false}, {"index": "2", "text": "om", "eos": false}, {"index": "3", "text": "die", "eos": false}, {"index": "4", "text": "afsluiters", "eos": true}]

Мне нужно предварительно обработать данные, чтобы провести дальнейший анализ. Поэтому я написал следующую функцию. Это работает, но выглядит не очень элегантно. Как его можно улучшить, чтобы сделать его более читабельным, менее избыточным и просто красивым =)

def prepare(file):

    # set up variables
    text = []
    sent_dict = {}
    sentence = ""
    chunks = []
    ngram = ""
    maxn = 5

    for word in file:

        if word["eos"] == False:
            # concatenate words
            sentence += word["text"] + " "

            # get last five elements of sentence excluding last space and make chunk
            chunk = " ".join(sentence.split(" ")[:-1][-maxn:])
            index = word["index"]
            chunks.append({index: {"ngram" : chunk}})

        else:
           # concatenate words without last space
           sentence += word["text"]

           # get last five elements of sentence and make chunk
           chunk = " ".join(sentence.split(" ")[-maxn:])
           index = word["index"]
           chunks.append({index: {"ngram" : chunk}})

           # make dict with sentence and list of chunks
           sent_dict["sentence"] = sentence
           sent_dict["chunks"] = chunks
           text.append(sent_dict)

           # set variables back to default
           sent_dict = {}
           sentence = ""
           chunks = []

    return(text)

Если вы скомпилируете prepare(file), он вернет список, похожий на:

[{'sentence' : 'uhm moeten langs uhm', 'chunk' : [{'1' : 'uhm'}, {'2' : 'uhm moeten'}, {'3' : 'uhm moeten langs'}, {'4' : 'uhm moeten langs uhm'}]}] 

1 Ответ

0 голосов
/ 05 февраля 2020

Я предположил, что на каждое предложение приходится 4 фрагмента. Если это не так, я уверен, что вы можете легко настроить мой код, но пока это жестко закодировано для 4 элементов. Это, безусловно, может быть изменено, хотя. То, как я решил вывести эту информацию в списке. Для меня с тонкими списками гораздо проще работать и играть с ними, чем со словарями, и поэтому я сделал это следующим образом: Это будет список, заполненный такими элементами, как

sentence,uhm moeten langs uhm : sentence is made up of the following chunks : 1,uhm : 2,uhm moeten : 3,uhm moeten langs : 4,uhm moeten langs uhm

и следующим элементом. в списке будет

sentence,uh om die afsluiters : sentence is made up of the following chunks : 1,uh : 2,uh om : 3,uh om die : 4,uh om die afsluiters

Причина, по которой я сделал это так, состоит в том, что он легко разделяется, вы можете легко получить любой элемент, который хотите, например, вы можете разделить на

" : " 

, а затем после того, как вы сможете l oop пройти и разделить на

","

, чтобы получить сам элемент.

ваш код в конце для меня выглядел следующим образом.

def prepare(file):

    # set up variables
    text = []
    sent_dict = {}
    sentence = ""
    chunks = []
    ngram = ""
    maxn = 5

    for word in file:

        if word["eos"] == False:
            # concatenate words
            sentence += word["text"] + " "


            chunk = " ".join(sentence.split(" ")[:-1][-maxn:])
            index = word["index"]
            chunks.append({index: {"ngram" : chunk}})

        else:

            sentence += word["text"]

            chunk = " ".join(sentence.split(" ")[-maxn:])
            index = word["index"]
            chunks.append({index: {"ngram" : chunk}})

            sent_dict["sentence"] = sentence
            sent_dict["chunks"] = chunks
            text.append(sent_dict)

            sent_dict = {}
            sentence = ""
            chunks = []

    return(text)



file = [{"index": "1", "text": "uhm", "eos": False}, {"index": "2", "text": "moeten", "eos": False}, {"index": "3", "text": "langs", "eos": False}, {"index": "4", "text": "uhm", "eos": True}, {"index": "1", "text": "uh", "eos": False}, {"index": "2", "text": "om", "eos": False}, {"index": "3", "text": "die", "eos": False}, {"index": "4", "text": "afsluiters", "eos": True}]



final_list = []
x = (prepare(file))
for i in x:
    new_string = "sentence,{} : sentence is made up of the following chunks : 1,{} : 2,{} : 3,{} : 4,{}".format(i["sentence"], i["chunks"][0]["1"]["ngram"], i["chunks"][1]["2"]["ngram"], i["chunks"][2]["3"]["ngram"], i["chunks"][3]["4"]["ngram"])
    final_list.append(new_string)

Помните, список с отформатированными у меня элементами называется final_list. Если вы выполните oop и напечатаете каждый элемент, вы увидите, что я вам показал. Надеюсь, с этим легче работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...