Delen via


Gedetailleerd voorbeeld van vormen en projecties in een kennisarchief

Dit artikel bevat een gedetailleerd voorbeeld dat een aanvulling vormt op concepten op hoog niveau en artikelen op basis van syntaxis door u door de vormgevings- en projectiestappen te begeleiden die nodig zijn om de uitvoer van een uitgebreide vaardighedenset in een kennisarchief volledig uit te drukken.

Als uw toepassingsvereisten meerdere vaardigheden en projecties aanroepen, kunt u in dit voorbeeld beter zien hoe vormen en projecties elkaar snijden.

Voorbeeldgegevens instellen

Voorbeelddocumenten zijn niet opgenomen in de verzameling Projecties, maar de ai-verrijkingsgegevensbestanden bevatten tekst en afbeeldingen die werken met de projecties die in dit voorbeeld worden beschreven.

Maak een blobcontainer in Azure Storage en upload alle 14 items.

Kopieer in Azure Storage een verbindingsreeks.

U kunt het projections.rest bestand gebruiken om de voorbeelden in dit artikel uit te voeren.

Voorbeeldvaardighedenset

Als u de afhankelijkheid tussen shapes en projecties wilt begrijpen, bekijkt u de volgende vaardighedenset waarmee verrijkte inhoud wordt gemaakt. Deze vaardighedenset verwerkt zowel onbewerkte afbeeldingen als tekst, waardoor uitvoer wordt geproduceerd waarnaar wordt verwezen in vormen en projecties.

Let goed op uitvoer van vaardigheden (targetNames). Uitvoer die naar de verrijkte documentstructuur wordt geschreven, wordt in projecties en in vormen (via Shaper-vaardigheden) verwezen.

{
    "name": "projections-demo-ss",
    "description": "Skillset that enriches blob data found in "merged_content". The enrichment granularity is a document.",
    "skills": [
        {
            "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
            "name": "#1",
            "description": null,
            "context": "/document/merged_content",
            "categories": [
                "Person",
                "Quantity",
                "Organization",
                "URL",
                "Email",
                "Location",
                "DateTime"
            ],
            "defaultLanguageCode": "en",
            "minimumPrecision": null,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_content"
                },
                {
                    "name": "languageCode",
                    "source": "/document/language"
                }
            ],
            "outputs": [
                {
                    "name": "persons",
                    "targetName": "people"
                },
                {
                    "name": "organizations",
                    "targetName": "organizations"
                },
                {
                    "name": "locations",
                    "targetName": "locations"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
            "name": "#2",
            "description": null,
            "context": "/document/merged_content",
            "defaultLanguageCode": "en",
            "maxKeyPhraseCount": null,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_content"
                },
                {
                    "name": "languageCode",
                    "source": "/document/language"
                }
            ],
            "outputs": [
                {
                    "name": "keyPhrases",
                    "targetName": "keyphrases"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
            "name": "#3",
            "description": null,
            "context": "/document",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/merged_content"
                }
            ],
            "outputs": [
                {
                    "name": "languageCode",
                    "targetName": "language"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.MergeSkill",
            "name": "#4",
            "description": null,
            "context": "/document",
            "insertPreTag": " ",
            "insertPostTag": " ",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/content"
                },
                {
                    "name": "itemsToInsert",
                    "source": "/document/normalized_images/*/text"
                },
                {
                    "name": "offsets",
                    "source": "/document/normalized_images/*/contentOffset"
                }
            ],
            "outputs": [
                {
                    "name": "mergedText",
                    "targetName": "merged_content"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
            "name": "#5",
            "description": null,
            "context": "/document/normalized_images/*",
            "textExtractionAlgorithm": "printed",
            "lineEnding": "Space",
            "defaultLanguageCode": "en",
            "detectOrientation": true,
            "inputs": [
                {
                    "name": "image",
                    "source": "/document/normalized_images/*"
                }
            ],
            "outputs": [
                {
                    "name": "text",
                    "targetName": "text"
                },
                {
                    "name": "layoutText",
                    "targetName": "layoutText"
                }
            ]
        }
    ],
    "cognitiveServices": {
        "@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
        "description": "An Azure AI services resource in the same region as Search.",
        "key": "<Azure AI services All-in-ONE KEY>"
    },
    "knowledgeStore": null
}

Voorbeeld van Shaper-vaardigheid

Een Shaper-vaardigheid is een hulpprogramma voor het werken met bestaande verrijkte inhoud in plaats van nieuwe verrijkte inhoud te maken. Door een Shaper toe te voegen aan een vaardighedenset, kunt u een aangepaste shape maken die u kunt projecteren in tabel- of blobopslag. Zonder een aangepaste shape kunnen projecties slechts verwijzen naar één knooppunt (één projectie per uitvoer), wat niet geschikt is voor tabellen. Als u een aangepaste shape maakt, worden verschillende elementen samengevoegd in een nieuw logisch geheel dat kan worden geprojecteerd als één tabel, of gesegmenteerd en verdeeld over een verzameling tabellen.

In dit voorbeeld combineert de aangepaste shape blobmetagegevens en geïdentificeerde entiteiten en sleuteltermen. De aangepaste shape wordt aangeroepen projectionShape en wordt onder haakje weergegeven /document.

Een doel van het vormgeven is ervoor te zorgen dat alle verrijkingsknooppunten worden uitgedrukt in goed gevormde JSON, die nodig is voor projecteren in kennisarchief. Dit geldt met name wanneer een verrijkingsstructuur knooppunten bevat die geen goed opgemaakte JSON zijn (bijvoorbeeld wanneer een verrijking boven een primitieve zoals een tekenreeks staat).

Let op de laatste twee knooppunten en KeyPhrases Entities. Deze worden verpakt in een geldig JSON-object met de sourceContext. Dit is vereist omdat keyphrases en entities verrijkingen op primitieven zijn en moeten worden geconverteerd naar geldige JSON voordat ze kunnen worden geprojecteerd.

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "ShaperForTables",
    "description": null,
    "context": "/document",
    "inputs": [
        {
            "name": "metadata_storage_content_type",
            "source": "/document/metadata_storage_content_type",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "metadata_storage_name",
            "source": "/document/metadata_storage_name",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "metadata_storage_path",
            "source": "/document/metadata_storage_path",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "metadata_content_type",
            "source": "/document/metadata_content_type",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "keyPhrases",
            "source": null,
            "sourceContext": "/document/merged_content/keyphrases/*",
            "inputs": [
                {
                    "name": "KeyPhrases",
                    "source": "/document/merged_content/keyphrases/*"
                }

            ]
        },
        {
            "name": "Entities",
            "source": null,
            "sourceContext": "/document/merged_content/entities/*",
            "inputs": [
                {
                    "name": "Entities",
                    "source": "/document/merged_content/entities/*/name"
                }

            ]
        }
    ],
    "outputs": [
        {
            "name": "output",
            "targetName": "projectionShape"
        }
    ]
}

Shapers toevoegen aan een vaardighedenset

De voorbeeldvaardighedenset die aan het begin van dit artikel is geïntroduceerd, bevat niet de Shaper-vaardigheid, maar Shaper-vaardigheden behoren tot een vaardighedenset en worden vaak aan het einde geplaatst.

In een vaardighedenset kan een Shaper-vaardigheid er als volgt uitzien:

{
    "name": "projections-demo-ss",
    "skills": [
        {
            <Shaper skill goes here>
            }
        ],
    "cognitiveServices":  "A key goes here",
    "knowledgeStore": []
}  

Projecteren naar tabellen

Op basis van de bovenstaande voorbeelden is er een bekende hoeveelheid verrijkingen en gegevensshapes waarnaar kan worden verwezen in tabelprojecties. In de onderstaande tabelprojectie worden drie tabellen gedefinieerd door de tableNameen source generatedKeyName eigenschappen in te stellen.

Alle drie deze tabellen zijn gerelateerd via gegenereerde sleutels en door de gedeelde bovenliggende /document/projectionShapetabel.

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [
                {
                    "tableName": "tblDocument",
                    "generatedKeyName": "Documentid",
                    "source": "/document/projectionShape"
                },
                {
                    "tableName": "tblKeyPhrases",
                    "generatedKeyName": "KeyPhraseid",
                    "source": "/document/projectionShape/keyPhrases/*"
                },
                {
                    "tableName": "tblEntities",
                    "generatedKeyName": "Entityid",
                    "source": "/document/projectionShape/Entities/*"
                }
            ],
            "objects": [],
            "files": []
        }
    ]
}

Uw werk testen

U kunt projectiedefinities controleren door de volgende stappen uit te voeren:

  1. Stel de eigenschap van storageConnectionString het kennisarchief in op een geldig V2-opslagaccount voor algemeen gebruik verbindingsreeks.

  2. Werk de vaardighedenset bij door de PUT-aanvraag uit te geven.

  3. Nadat u de vaardighedenset hebt bijgewerkt, voert u de indexeerfunctie uit.

U hebt nu een werkende projectie met drie tabellen. Als u deze tabellen in Power BI importeert, moeten de relaties worden ontdekt in Power BI .

Voordat u verdergaat met het volgende voorbeeld, gaan we terug naar aspecten van de tabelprojectie om inzicht te krijgen in de mechanismen van segmentering en gerelateerde gegevens.

Een tabel segmenteren in meerdere onderliggende tabellen

Segmentering is een techniek die een hele geconsolideerde vorm in samenstellende delen onderverdeelt. Het resultaat bestaat uit afzonderlijke, maar gerelateerde tabellen waarmee u afzonderlijk kunt werken.

In het voorbeeld projectionShape is de geconsolideerde shape (of verrijkingsknooppunt). In de projectiedefinitie wordt projectionShape gesegmenteerd in extra tabellen, waarmee u delen van de shape kunt ophalen en keyPhrases Entities. In Power BI is dit handig omdat er meerdere entiteiten en keyPhrases aan elk document zijn gekoppeld en u meer inzichten krijgt als u entiteiten en keyPhrases als gecategoriseerde gegevens kunt zien.

Met segmentering wordt impliciet een relatie tussen de bovenliggende en onderliggende tabellen gegenereerd, waarbij de generatedKeyName bovenliggende tabel wordt gebruikt om een kolom met dezelfde naam in de onderliggende tabel te maken.

Naamgevingsrelaties

De generatedKeyName eigenschappen en referenceKeyName eigenschappen worden gebruikt om gegevens in tabellen of zelfs over projectietypen te relateren. Elke rij in de onderliggende tabel heeft een eigenschap die naar het bovenliggende item wijst. De naam van de kolom of eigenschap in het onderliggende item is de referenceKeyName naam van het bovenliggende item. Wanneer de referenceKeyName service niet is opgegeven, wordt deze standaard ingesteld op de generatedKeyName bovenliggende service.

Power BI is afhankelijk van deze gegenereerde sleutels om relaties in de tabellen te detecteren. Als u de kolom in de onderliggende tabel anders wilt noemen, stelt u de referenceKeyName eigenschap in op de bovenliggende tabel. Een voorbeeld hiervan is het instellen van de generatedKeyName as-id in de tblDocument-tabel en de referenceKeyName als DocumentID. Dit zou resulteren in de kolom in de tabellen tblEntities en tblKeyPhrases met de document-id met de naam DocumentID.

Blob-documenten projecteren

Objectprojecties zijn JSON-representaties van de verrijkingsstructuur die kan worden opgehaald uit elk knooppunt. In vergelijking met tabelprojecties zijn objectprojecties eenvoudiger te definiëren en worden ze gebruikt bij het projecteren van hele documenten. Objectprojecties zijn beperkt tot één projectie in een container en kunnen niet worden gesegmenteerd.

Als u een objectprojectie wilt definiëren, gebruikt u de objects matrix in de eigenschap projecties.

De bron is het pad naar een knooppunt van de verrijkingsstructuur die de hoofdmap van de projectie is. Hoewel dit niet vereist is, is het knooppuntpad meestal de uitvoer van een Shaper-vaardigheid. Dit komt doordat de meeste vaardigheden geen geldige JSON-objecten zelf uitvoeren, wat betekent dat een vorm van vormgeving noodzakelijk is. In veel gevallen kan dezelfde Shaper-vaardigheid waarmee een tabelprojectie wordt gemaakt, worden gebruikt om een objectprojectie te genereren. De bron kan ook worden ingesteld op een knooppunt met een inline-vormgeving om de structuur te bieden.

Het doel is altijd een blobcontainer.

Het volgende voorbeeld projecteert afzonderlijke hoteldocumenten, één hoteldocument per blob, in een container met de naam hotels.

"knowledgeStore": {
  "storageConnectionString": "an Azure storage connection string",
  "projections" : [
    {
      "tables": [ ]
    },
    {
      "objects": [
        {
        "storageContainer": "hotels",
        "source": "/document/objectprojection",
        }
      ]
    },
    {
        "files": [ ]
    }
  ]
}

De bron is de uitvoer van een Shaper-vaardigheid, genaamd "objectprojection". Elke blob heeft een JSON-weergave van elke veldinvoer.

    {
      "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
      "name": "#3",
      "description": null,
      "context": "/document",
      "inputs": [
        {
          "name": "HotelId",
          "source": "/document/HotelId"
        },
        {
          "name": "HotelName",
          "source": "/document/HotelName"
        },
        {
          "name": "Category",
          "source": "/document/Category"
        },
        {
          "name": "keyPhrases",
          "source": "/document/HotelId/keyphrases/*"
        },
      ],
      "outputs": [
        {
          "name": "output",
          "targetName": "objectprojection"
        }
      ]
    }

Een afbeeldingsbestand projecteren

Bestandsprojecties zijn altijd binaire, genormaliseerde afbeeldingen, waarbij normalisatie verwijst naar mogelijke groottes en rotatie voor gebruik bij het uitvoeren van vaardighedensets. Bestandsprojecties, vergelijkbaar met objectprojecties, worden gemaakt als blobs in Azure Storage en bevatten de afbeelding.

Als u een bestandsprojectie wilt definiëren, gebruikt u de files matrix in de eigenschap projecties.

De bron is altijd /document/normalized_images/*. Bestandsprojecties reageren alleen op de normalized_images verzameling. Indexeerfuncties of een vaardighedenset passeren de oorspronkelijke niet-genormaliseerde afbeelding niet.

Het doel is altijd een blobcontainer, met een mapvoorvoegsel van de base64-gecodeerde waarde van de document-id. Bestandsprojecties kunnen niet dezelfde container delen als objectprojecties en moeten in een andere container worden geprojecteerd.

In het volgende voorbeeld worden alle genormaliseerde afbeeldingen geprojecteerd die zijn geëxtraheerd uit het documentknooppunt van een verrijkt document, in een container met de naam myImages.

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [ ],
            "objects": [ ],
            "files": [
                {
                    "storageContainer": "myImages",
                    "source": "/document/normalized_images/*"
                }
            ]
        }
    ]
}

Projecteren naar meerdere typen

Voor een complexer scenario moet u mogelijk inhoud projecteren over projectietypen. Bijvoorbeeld het projecteren van sleuteltermen en entiteiten naar tabellen, het opslaan van OCR-resultaten van tekst en indelingstekst als objecten en vervolgens het projecteren van de afbeeldingen als bestanden.

Stappen voor meerdere projectietypen:

  1. Maak een tabel met een rij voor elk document.
  2. Maak een tabel met betrekking tot de documenttabel, waarbij elke sleutelterm wordt geïdentificeerd als een rij in deze tabel.
  3. Maak een tabel met betrekking tot de documenttabel met elke entiteit die is geïdentificeerd als een rij in deze tabel.
  4. Maak een objectprojectie met de indelingstekst voor elke afbeelding.
  5. Maak een bestandsprojectie, waarbij elke geëxtraheerde afbeelding wordt geprojecteerd.
  6. Maak een kruisverwijzingstabel die verwijzingen naar de documenttabel, objectprojectie met de indelingstekst en de bestandsprojectie bevat.

Shapegegevens voor kruisprojectie

Als u de shapes wilt ophalen die nodig zijn voor deze projecties, voegt u eerst een nieuwe Shaper-vaardigheid toe waarmee een vormig object wordt gemaakt met de naam crossProjection.

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "ShaperForCrossProjection",
    "description": null,
    "context": "/document",
    "inputs": [
        {
            "name": "metadata_storage_name",
            "source": "/document/metadata_storage_name",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "keyPhrases",
            "source": null,
            "sourceContext": "/document/merged_content/keyphrases/*",
            "inputs": [
                {
                    "name": "KeyPhrases",
                    "source": "/document/merged_content/keyphrases/*"
                }

            ]
        },
        {
            "name": "entities",
            "source": null,
            "sourceContext": "/document/merged_content/entities/*",
            "inputs": [
                {
                    "name": "Entities",
                    "source": "/document/merged_content/entities/*/name"
                }

            ]
        },
        {
            "name": "images",
            "source": null,
            "sourceContext": "/document/normalized_images/*",
            "inputs": [
                {
                    "name": "image",
                    "source": "/document/normalized_images/*"
                },
                {
                    "name": "layoutText",
                    "source": "/document/normalized_images/*/layoutText"
                },
                {
                    "name": "ocrText",
                    "source": "/document/normalized_images/*/text"
                }
                ]
        }
 
    ],
    "outputs": [
        {
            "name": "output",
            "targetName": "crossProjection"
        }
    ]
}

Tabel-, object- en bestandsprojecties definiëren

Plak het object vanuit het geconsolideerde crossProjection-object in meerdere tabellen, leg de OCR-uitvoer vast als blobs en sla de afbeelding vervolgens op als bestanden (ook in Blob Storage).

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
            {
            "tables": [
                {
                    "tableName": "crossDocument",
                    "generatedKeyName": "Id",
                    "source": "/document/crossProjection"
                },
                {
                    "tableName": "crossEntities",
                    "generatedKeyName": "EntityId",
                    "source": "/document/crossProjection/entities/*"
                },
                {
                    "tableName": "crossKeyPhrases",
                    "generatedKeyName": "KeyPhraseId",
                    "source": "/document/crossProjection/keyPhrases/*"
                },
                {
                    "tableName": "crossReference",
                    "generatedKeyName": "CrossId",
                    "source": "/document/crossProjection/images/*"
                }
                    
            ],
            "objects": [
                {
                    "storageContainer": "crossobject",
                    "generatedKeyName": "crosslayout",
                    "source": null,
                    "sourceContext": "/document/crossProjection/images/*/layoutText",
                    "inputs": [
                        {
                            "name": "OcrLayoutText",
                            "source": "/document/crossProjection/images/*/layoutText"
                        }
                    ]
                }
            ],
            "files": [
                {
                    "storageContainer": "crossimages",
                    "generatedKeyName": "crossimages",
                    "source": "/document/crossProjection/images/*/image"
                }
            ]
        }
    ]
}

Voor objectprojecties is een containernaam vereist voor elke projectie. Objectprojecties en bestandsprojecties kunnen geen container delen.

Relaties tussen tabel-, object- en bestandsprojecties

In dit voorbeeld wordt ook een andere functie van projecties gemarkeerd. Door meerdere typen projecties binnen hetzelfde projectieobject te definiëren, is er een relatie uitgedrukt in en over de verschillende typen (tabellen, objecten, bestanden). Hiermee kunt u beginnen met een tabelrij voor een document en alle OCR-tekst voor de afbeeldingen in dat document zoeken in de objectprojectie.

Als u de gegevens niet wilt, definieert u de projecties in verschillende projectiegroepen. Het volgende codefragment resulteert bijvoorbeeld in gerelateerde tabellen, maar zonder relaties tussen de tabellen en de objectprojecties (OCR-tekst).

Projectiegroepen zijn handig als u dezelfde gegevens in verschillende shapes wilt projecteren voor verschillende behoeften. Bijvoorbeeld een projectiegroep voor het Power BI-dashboard en een andere projectiegroep voor het vastleggen van gegevens die worden gebruikt voor het trainen van een machine learning-model dat is verpakt in een aangepaste vaardigheid.

Bij het bouwen van projecties van verschillende typen worden eerst bestands- en objectprojecties gegenereerd en worden de paden toegevoegd aan de tabellen.

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [
                {
                    "tableName": "unrelatedDocument",
                    "generatedKeyName": "Documentid",
                    "source": "/document/projectionShape"
                },
                {
                    "tableName": "unrelatedKeyPhrases",
                    "generatedKeyName": "KeyPhraseid",
                    "source": "/document/projectionShape/keyPhrases"
                }
            ],
            "objects": [
                
            ],
            "files": []
        }, 
        {
            "tables": [],
            "objects": [
                {
                    "storageContainer": "unrelatedocrtext",
                    "source": null,
                    "sourceContext": "/document/normalized_images/*/text",
                    "inputs": [
                        {
                            "name": "ocrText",
                            "source": "/document/normalized_images/*/text"
                        }
                    ]
                },
                {
                    "storageContainer": "unrelatedocrlayout",
                    "source": null,
                    "sourceContext": "/document/normalized_images/*/layoutText",
                    "inputs": [
                        {
                            "name": "ocrLayoutText",
                            "source": "/document/normalized_images/*/layoutText"
                        }
                    ]
                }
            ],
            "files": []
        }
    ]
}

Volgende stappen

In het voorbeeld in dit artikel ziet u veelvoorkomende patronen voor het maken van projecties. Nu u een goed begrip hebt van de concepten, kunt u beter projecties bouwen voor uw specifieke scenario.