Pular para o conteúdo principal
Já começamos a extrair dados dos documentos em alemão, então primeiro vamos configurar a atividade Extraction Rules para esses documentos.

Etapas preparatórias

  1. Abra a atividade “Sick Note DE” no Activity Editor.
  2. Selecione um dos documentos do conjunto de documentos.
  3. Verifique se o modo avançado das propriedades do elemento está habilitado. Para ativar ou desativar esse modo, clique no ícone no painel Properties.
  4. Todos os documentos carregados passaram por pré-reconhecimento, e é útil ver quais objetos foram encontrados na imagem. Clique no ícone. Se você não vir esse ícone devido ao tamanho da tela, clique no ícone e selecione Recognized Words. Os objetos correspondentes serão destacados na imagem do documento. Você pode alternar entre vários tipos de objetos destacados a qualquer momento. Por exemplo, alternar para Recognized Lines pode ser útil ao procurar parágrafos, e alternar para Separators facilitará a configuração de um elemento de pesquisa do tipo Separator.
  5. Se um elemento de pesquisa estiver fora da área de pesquisa, ele não será encontrado. Habilite a opção Show search area no menu de contexto da imagem do documento. A área de pesquisa de cada elemento ficará destacada em verde quando você avaliar os resultados da correspondência.
Lembre-se de que pode ser útil experimentar as propriedades avançadas dos elementos de pesquisa para melhorar a precisão da extração. Também recomendamos clicar frequentemente em Match para verificar como suas regras de extração funcionam e comparar os resultados de extração em diferentes documentos do conjunto. Você pode testar um único elemento sem relação com outros elementos clicando em Match Element no menu de contexto dele. Nesse caso, a qualidade da hipótese para elementos anteriores não afetará os resultados da correspondência.

Extraindo os dados do paciente

Vamos começar extraindo os dados ausentes do paciente. Para isso, precisamos criar vários elementos de pesquisa. Recomendamos agrupar todos os elementos relacionados a uma mesma entidade. Os elementos são avaliados em sequência, e não encontrar o elemento superior reduzirá a qualidade da hipótese para os elementos seguintes. Ao mesmo tempo, grupos de elementos de pesquisa são processados de forma independente durante a correspondência, e uma hipótese individual é formulada para cada grupo. Assim, você controla como os elementos influenciam uns aos outros. Você também pode avaliar rapidamente os resultados da correspondência verificando se os elementos do grupo foram encontrados com sucesso. Por fim, o agrupamento pode ajudar a reduzir o tempo de correspondência.
  1. Clique em Create Element e selecione o elemento Group na lista suspensa. Altere o nome para “PatientDataArea”.
  2. Um novo elemento de pesquisa do tipo grupo é definido como obrigatório por padrão. Se um elemento obrigatório não for encontrado, o Activity Editor gera um erro e a correspondência é interrompida. Esse cenário permite que atividades sejam ignoradas se não forem adequadas para um determinado documento. No entanto, neste tutorial estamos criando uma atividade para extrair dados de todos os documentos recebidos, portanto queremos que o grupo seja opcional. Na seção Under what conditions, altere o valor Element is para Optional.
  3. Queremos localizar o parágrafo que contém o nome e o endereço do paciente. Em documentos em alemão, o parágrafo que procuramos está sempre no campo com o rótulo “Name, Vorname … ”. Precisamos encontrar esse texto no documento e usá-lo como referência para buscar os dados que queremos extrair.
    a. Palavras-chave podem ser encontradas usando o elemento de pesquisa Static Text. Clique em Create Element e selecione o elemento Static Text na lista suspensa. Altere o nome para “kwPatientTitle”.
    b. Insira o texto “Name, Vorname” no campo Text to find no painel Properties.
    c. Clique em Match. Quando o processamento terminar, você verá a Tree of Hypotheses abaixo do documento. Verifique se o Advanced Designer encontrou o texto estático desejado. Um ponto verde ao lado do nome do elemento indica que um elemento correspondente foi encontrado no documento. Se você clicar no nome do elemento na Tree of Hypotheses, verá uma moldura violeta ao redor da região correspondente no documento.
Observação: Se um elemento não for encontrado, você verá um ponto laranja ao lado do nome e uma moldura laranja ao redor da imagem do documento. Lembre-se de que a qualidade da hipótese de um elemento afeta o estado dos elementos seguintes na cadeia e a qualidade geral da cadeia. Você pode encontrar informações detalhadas sobre a qualidade da hipótese na documentação.
  1. Agora vamos encontrar o limite inferior da célula que contém o nome e o endereço do paciente. Faremos isso usando um elemento Separator.
    a. Adicione um elemento Separator ao grupo e nomeie-o como “SeparatorBottom”. Defina o comprimento mínimo como 200.
    b. Clique com o botão direito no elemento e selecione Match Element no menu de contexto. Você verá que a Tree of Hypotheses contém muitos pontos verdes. Eles correspondem a diferentes separadores que atendem aos critérios de busca. Você pode clicar em cada ponto para ver o objeto correspondente na imagem.
    c. Para restringir os critérios de busca, especifique a área de pesquisa do separador. Clique em Match para encontrar o elemento “kwPatientTitle” que será usado como elemento âncora. Na seção Where to search do painel Properties, clique em Draw on Image. Selecione o elemento “kwPatientTitle” no documento e clique no ícone de seta para baixo para definir a área de pesquisa abaixo da palavra-chave e o ícone mais próximo para procurar o separador mais próximo da palavra‑chave. Você pode encontrar uma descrição detalhada dos elementos âncora na documentação.
    d. Clique em Match e verifique se o Advanced Designer encontrou o separador abaixo do elemento “kwPatientTitle”. Você pode verificar a hipótese de cada elemento clicando no seu nome na seção Tree of Hypotheses.
  2. Um rótulo e um separador são elementos de referência confiáveis para os dados do paciente. No entanto, se a qualidade de impressão for muito baixa, há a possibilidade de que o texto do rótulo não seja reconhecido ou que o separador não seja encontrado. Para garantir bons resultados de extração, vamos procurar um parágrafo que esteja entre o rótulo e o separador. Um parágrafo é um bloco uniforme de texto, o que significa que ele pode ser encontrado com sucesso mesmo que alguns elementos de limite não sejam encontrados.
    a. Crie um elemento de pesquisa Paragraph e nomeie-o como “NameAddressParagraph”.
    b. Altere Text alignment para Left.
    c. Os dados do paciente ocupam de duas a cinco linhas; portanto, defina a Line count de 2 a 5.
    d. Especifique a área de pesquisa do parágrafo. Desta vez, use o menu Add na seção Where to search. O elemento deve estar localizado abaixo do elemento “kwPatientTitle” e acima do elemento “SeparatorBottom”.
    e. Clique em Match.
  3. Agora queremos extrair os dados do paciente. Crie um novo elemento de grupo chamado “PatientGroup”.
  4. O nome do paciente pode ocupar uma ou duas linhas. Para capturar várias instâncias de um elemento, usaremos um grupo repetido.
    a. Crie um elemento de pesquisa Repeating Group e nomeie-o como “NameGroup”. Especifique 2 como o número máximo de repetições. Torne o elemento opcional.
    b. Queremos procurar as linhas que fazem parte do parágrafo “NameAddressParagraph”. Para definir a região do elemento como a área de pesquisa, clique no ícone do editor de código abaixo da imagem do documento e cole o seguinte script na seção Search Conditions do Code Editor:
RSA:PatientDataArea.NameAddressParagraph.Rect;
c. Dentro do grupo repetido, crie um elemento Character String projetado para capturar uma linha de caracteres. Dê a ele o nome “NameLine”.
d. O texto que estamos procurando pode conter letras maiúsculas e minúsculas, bem como um conjunto de sinais de pontuação que podem ocorrer em nomes. Configure dois conjuntos de caracteres distintos. O primeiro conjunto deve conter todas as letras latinas maiúsculas e minúsculas. Para adicionar caracteres com sinais diacríticos, altere a subfaixa Unicode ou cole os caracteres diretamente no campo Selected characters.
e. O outro conjunto deve conter os seguintes sinais de pontuação: ,-.()’. Não queremos que a string contenha apenas sinais de pontuação, portanto, defina o Portion in text, % do segundo conjunto como 40%. Essa propriedade define a porcentagem máxima permitida de caracteres de um determinado conjunto.
Observação: As configurações padrão permitem que a string contenha até 30% de caracteres não incluídos em nenhum conjunto. Isso ajuda a encontrar strings mesmo quando alguns caracteres são reconhecidos incorretamente ou não estão incluídos no conjunto (como caracteres com sinais diacríticos). Você pode ajustar essa configuração alterando o valor de Allowed errors no painel Properties. f. Desative a opção Search for parts of words.
g. Especifique a área de pesquisa para o elemento “NameLine”: abaixo do elemento “kwPatientTitle” e o mais próximo possível dele.
h. Clique em Match e revise a Tree of Hypotheses. Você verá que duas strings de caracteres foram encontradas. No entanto, a segunda string contém o endereço do paciente.
i. Para excluir o endereço dos resultados da pesquisa, vamos verificar se a primeira string contém tanto o primeiro quanto o último nome. Isso pode ser feito adicionando uma condição de pesquisa por script simples. Selecione o elemento de pesquisa “NameLine” e abra o editor de código Search Conditions.
j. Consideramos que a primeira linha contém um nome completo se houver uma vírgula e um espaço em branco. Se contiver um nome completo, não queremos pesquisar uma segunda instância do grupo repetido. Cole o seguinte script no editor:
if (NameGroup.HasInstances and LastFound.NameLine.Value.Find(", ") > 0) then DontFind;
k. Clique em Match e verifique se o nome foi encontrado corretamente.
  1. O nome do paciente extraído na etapa 7 será mapeado para o campo “Name”. Também extrairemos e mapearemos o endereço do paciente.
    a. Dentro de “PatientGroup”, crie um elemento de pesquisa Character String chamado “Address” com a mesma configuração de conjunto de caracteres do elemento “NameLine”.
    b. Especifique a área de pesquisa do elemento por código: o endereço deve estar localizado abaixo de “NameLine” ou, caso esse elemento não seja encontrado, abaixo da primeira linha do elemento “NameAddressParagraph”.
RSA: PatientDataArea.NameAddressParagraph.Rect;
if NameGroup.HasInstances then
  RSA.Top: Max(RSA.Top, LastFound.NameLine.Rect.Bottom);
else
  RSA.Top: PatientDataArea.NameAddressParagraph.Lines[0].Rect.Bottom;
c. Desative a opção Pesquisar partes de palavras. d. Clique em Corresponder. Veja como a estrutura do elemento de pesquisa deve ficar: AD_Tutorial_DE_Patient_Structure
  1. Abra a caixa de diálogo Gerenciar campos, crie os campos correspondentes e faça o mapeamento para os elementos de pesquisa da seguinte forma:
NomeTipoElemento de pesquisa
NomeCampo de Text no grupo “Paciente”NameLine
EndereçoCampo de Text no grupo “Paciente”Address
  1. Exclua os elementos de pesquisa criados automaticamente para os novos campos.

Extraindo o tipo de atestado médico

O campo de tipo de atestado médico tem duas caixas de seleção. Elas são rotuladas como “Erstbescheinigung” e “Folgebescheinigung”. A tarefa é localizar esses rótulos e, em seguida, verificar se há marcas de seleção preenchidas ao lado deles.
  1. Crie um elemento Group chamado “TypeOfSickNoteGroup”. Torne o elemento opcional.
  2. Para armazenar as informações sobre ambas as marcas de seleção, crie um elemento de pesquisa Repeating Group e nomeie-o “PrimaryGroup”.
    a. É recomendável restringir a área de pesquisa do grupo de elementos. Especifique a área de pesquisa por código: à direita do elemento “PatientGroup” e acima do elemento “DoctorAreaGroup” (que será criado posteriormente). Observação: sempre especifique a condição “Exists” ao usar elementos futuros.
if PatientGroup.Exists then RSA.Left: PatientGroup.NameGroup.NameLine.Rect.Right;
if DoctorAreaGroup.Exists then RSA.Bottom: DoctorAreaGroup.DataArea.SeparatorTop.Rect.Top;
b. Crie um elemento de pesquisa Static Text chamado “kwPrimary” (texto a localizar: “Erstbescheinigung”) e defina-o como obrigatório.
c. Crie um elemento de pesquisa Object Collection chamado “Checkmark” com as seguintes configurações: Type: Checkmark, Checkmark state: Checked, Minimum height: 10, Maximum width: 20, Maximum height: 20. Especifique que o elemento está à esquerda do elemento “kwPrimary” e o mais próximo possível dele.
d. Clique em Match.
  1. Copie e cole o grupo “PrimaryGroup”. Renomeie o grupo copiado para “SecondaryGroup”. Esse grupo será obrigatório.
  2. Edite o “SecondaryGroup”.
    a. Renomeie o elemento “kwPrimary” para “kwSecondary” e defina o texto a localizar como “Folgebescheinigung”. Especifique a área de pesquisa: abaixo do elemento “kwPrimary” do “PrimaryGroup”.
    b. Especifique a área de pesquisa para o elemento “Checkmark”: à esquerda de “kwSecondary” e o mais próximo possível.
    c. O elemento de pesquisa Object Collection encontra uma coleção de todos os objetos adequados dentro da área de pesquisa. Se as marcações estiverem na mesma linha, o elemento “Checkmark” do “SecondaryGroup” também pode encontrar a marcação primária. Para evitar isso, exclua a marcação primária (elemento “Checkmark” do “PrimaryGroup”) da área de pesquisa do elemento “Checkmark” do “SecondaryGroup”.
    d. Clique em Match.
É assim que a estrutura do elemento de pesquisa deve ficar: AD_Tutorial_DE_TypeOfSickNote_Structure
  1. Abra a janela Manage Fields, crie os campos correspondentes e faça o mapeamento para os elementos de pesquisa da seguinte forma:
NameTypeSearch element
Type of Sick NoteCheckmark group
PrimaryCheckmark in the “Type of Sick Note” checkmark groupPrimaryGroup -> Checkmark
SecondaryCheckmark in the “Type of Sick Note” checkmark groupSecondaryGroup -> Checkmark
  1. Exclua os elementos de pesquisa que foram criados automaticamente para os novos campos.

Extraindo os dados do médico

Agora precisamos processar o último bloco de dados nesses documentos. Ele contém os dados e a assinatura do médico. Primeiro, encontraremos a caixa que contém os dados e, em seguida, extrairemos um parágrafo com as informações do médico e uma região de imagem contendo a assinatura.
  1. Crie um elemento Group chamado “DoctorAreaGroup”. Defina o elemento como opcional.
  2. A caixa que procuraremos contém um rótulo. Para encontrá-lo, crie um elemento Static Text chamado “kwDoctorTitle” (texto a localizar: “Unterschrift des Arztes”).
  3. Dentro do grupo “DoctorAreaGroup”, crie outro grupo chamado “DataArea”.
  4. A caixa que contém as informações e a assinatura do médico é uma combinação de quatro separadores. Eles estão localizados ao redor do elemento “kwDoctorTitle”. No entanto, devemos configurar os elementos de forma que o programa possa encontrá-los mesmo que o elemento “kwDoctorTitle” não seja encontrado. No grupo “DataArea”, crie quatro elementos de busca Separator com as seguintes propriedades:
NameOrientationMinimum lengthSearch area
SeparatorRightVertical180Right of “kwDoctorTitle”, Nearest to the right page edge
SeparatorLeftVertical180Left of “kwDoctorTitle”, Left of “SeparatorRight” (in case “kwDoctorTitle” wasn’t found), Nearest to “SeparatorRight”, Below “SeparatorRight” (click the icon to the right of the separator name and select Top Boundary of Region), Exclude “SeparatorRight”
SeparatorBottomHorizontal200Below “kwDoctorTitle” (with adjustment of -10 points), Right of “SeparatorLeft”, Left of “SeparatorRight”, Nearest to the bottom page edge (this setting will be useful in case “kwDoctorTitle” wasn’t found)
SeparatorTopHorizontal200Above “kwDoctorTitle”, Right of “SeparatorLeft”, Nearest to “TypeOfSickNoteGroup”, Exclude “SeparatorBottom”
Você também deve desativar a opção Fits entirely within search area para todos esses elementos.
  1. Poderíamos especificar manualmente a área de busca para a assinatura do médico e as informações do médico com base nos separadores encontrados. Em vez disso, criaremos um elemento Region que corresponda à área delimitada pelos separadores. Crie um elemento de busca Region chamado “BoxRegion” e especifique a área de busca: à esquerda de “SeparatorRight”, à direita de “SeparatorLeft”, acima de “SeparatorBottom” e abaixo de “SeparatorTop”.
  2. Crie um novo grupo chamado “DoctorGroup”.
  3. Para localizar a assinatura do médico, crie um elemento Object Collection com as seguintes configurações dentro de “DoctorGroup”:
PropertyValue
NameSignature
TypePicture
Minimum width15
Minimum height15
Maximum width600
Maximum height350
Search Conditions section of the Code EditorA assinatura pode estar parcialmente fora da caixa. Para encontrar a imagem inteira, ampliaremos a área de busca em 100 pontos em cada direção: RSA: DoctorAreaGroup.DataArea.BoxRegion.Rect.GetInflated(100dot,100dot);
  1. Para extrair as informações de texto na caixa, crie um elemento Paragraph com as seguintes configurações:
PropertyValue
NameDoctorInformation
Maximum line count6
Search areaAbove “kwDoctorTitle”, Exclude “Signature”
Search Conditions section of the Code EditorRSA: DoctorAreaGroup.DataArea.BoxRegion.Rect;
  1. Clique em Match e verifique se os elementos foram encontrados corretamente.
Esta é a aparência esperada da estrutura do elemento de busca: AD_Tutorial_DE_Doctor_Structure
  1. Abra a caixa de diálogo Manage Fields, crie os campos correspondentes e mapeie-os aos elementos de busca da seguinte forma:
NameTypeSearch element
Doctor InformationText field in the “Doctor” groupDoctorInformation
SignatureImage field in the “Doctor” groupSignature
  1. Exclua os elementos de busca que foram criados automaticamente para os novos campos.

Testando a atividade

Configuramos todos os elementos de pesquisa e os campos necessários. Selecione todos os documentos, clique em Match e acesse a guia Fields para revisar as regiões dos campos nas imagens do documento. Lembre-se de que uma região só será atribuída a um campo se pertencer à hipótese do melhor caminho. Quando estiver satisfeito com os resultados, clique no ícone de copiar acima da imagem do documento para copiar a rotulagem prevista para a rotulagem de referência.