Пара значений ключа Textract AWS из GetDocumentAnalysis в GoLang - PullRequest
0 голосов
/ 16 апреля 2019

Я звоню AWS Textract GetDocumentAnalysisRequest для документа PDF, который я отправил в Textract, который возвращает блоки данных. Затем я пытаюсь преобразовать данные в карту значения ключа. Документ был проанализирован для ФОРМ и ТАБЛИЦ. Я пытался перенести пример кода, представленного на python, в go для преобразования блоков в KV Maps (https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/python/example_code/textract/textract-python-kv-parser.py). В python все работало нормально. В моем коде есть случайные пробелы в ключах и значениях. Я предполагаю, это связано с этой строкой в ​​коде text = fmt.Sprintf("%s %s", text, *word.Text).

// Contains tells whether a contains x.
func Contains(a []*string, x string) bool {
    for _, n := range a {
        if x == *n {
            return true
        }
    }
    return false
}

type KeyValueBlock struct {
    KeyMap   map[string]textract.Block
    ValueMap map[string]textract.Block
    BlockMap map[string]textract.Block
}

func getKeyValueMap(blocks []*textract.Block) KeyValueBlock {
    keyMap := map[string]textract.Block{}
    valueMap := map[string]textract.Block{}
    blockMap := map[string]textract.Block{}

    for _, block := range blocks {
        blockID := block.Id
        blockMap[*blockID] = *block

        if *block.BlockType == textract.BlockTypeKeyValueSet {

            if Contains(block.EntityTypes, textract.EntityTypeKey) {
                keyMap[*blockID] = *block
            } else {
                valueMap[*blockID] = *block
            }
        }
    }

    return KeyValueBlock{
        KeyMap:   keyMap,
        ValueMap: valueMap,
        BlockMap: blockMap,
    }
}

func findValueBlock(keyBlock textract.Block, valueMap map[string]textract.Block) textract.Block {
    var valueBlock textract.Block
    for _, relationship := range keyBlock.Relationships {
        if *relationship.Type == textract.EntityTypeValue {
            for _, valueID := range relationship.Ids {
                valueBlock = valueMap[*valueID]
            }
        }
    }
    return valueBlock
}

func getText(result textract.Block, blocksMap map[string]textract.Block) string {
    var text string

    for _, relationship := range result.Relationships {
        if *relationship.Type == textract.RelationshipTypeChild {
            for _, childID := range relationship.Ids {
                word := blocksMap[*childID]
                if *word.BlockType == textract.BlockTypeWord {
                    text = fmt.Sprintf("%s %s", text, *word.Text)
                }
            }
        }
    }

    return text
}

func getKeyValueRelationship(keyValueBlock KeyValueBlock) {
    keyValueMap := map[string]string{}
    for _, keyBlock := range keyValueBlock.KeyMap {
        valueBlock := findValueBlock(keyBlock, keyValueBlock.ValueMap)
        key := getText(keyBlock, keyValueBlock.BlockMap)
        val := getText(valueBlock, keyValueBlock.BlockMap)
        keyValueMap[key] = val
    }
    log.Info(keyValueMap)
}

// Do takes a GetDocumentAnalysisInput and sends to textract
func Do(docAnalysisInput *textract.GetDocumentAnalysisInput, svc textractiface.TextractAPI) error {
    // Sending a request using the StartDocumentAnalysisRequest method.
    req, resp := svc.GetDocumentAnalysisRequest(docAnalysisInput)

    err := req.Send()
    if err == nil { // resp is now filled
        log.Infof("Job completeted with status: %s", *resp.JobStatus)
    }
    data := getKeyValueMap(resp.Blocks)
    getKeyValueRelationship(data)
    return err
}

Получение: {"level": "info", "msg": "map [+: Test Key1 (общая предоставленная сумма): 6002.00 Имя ключа Santance :: Некоторые тексты Некоторые Key3: 0.00 Некоторые символы: $ 5000.00 Som e Key6: 5.88 % Некоторый ключ предложения: значение слова Некоторый длинный ключ: Некоторый ключ2: # 552242] "," время ":" 2019-04-16T19: 06: 18Z "}

Ожидаемый {"level": "info", "msg": "map [Test Key1 (общая предоставленная сумма): 6002.00 Имя ключа santance: Некоторый текст Некоторый Key3: 0.00 Некоторый сбор: $ 5000.00 Некоторый Key6: 5.88% Некоторый ключ предложения: значение слова Some Long Key: Some Key2: # 552242] "," time ":" 2019-04-16T19: 06: 18Z "}

...