【Azure Document intelligence】事前構築済みモデルで遊んでみる
執筆日
2024/10/24
前提
- Azure Document intelligenceのS0をデプロイ済みであること
code(名刺の読み取り)
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# AzureリソースのエンドポイントとAPIキーを設定
endpoint = "https://<your-resource-name>.cognitiveservices.azure.com/"
api_key = "<your-api-key>"
# クライアントの作成
client = DocumentAnalysisClient(endpoint=endpoint, credential=AzureKeyCredential(api_key))
# 名刺画像のパスを指定
business_card_path = "<path-to-your-business-card-image>"
# 画像を読み込んで分析を開始
with open(business_card_path, "rb") as fd:
business_card_image = fd.read()
# 名刺の読み取りモデルを指定
poller = client.begin_analyze_document("prebuilt-businessCard", business_card_image)
result = poller.result()
# 結果を出力
for document in result.documents:
print("Document type: {}".format(document.doc_type))
for name, field in document.fields.items():
field_value = field.value if field.value else "N/A"
print(f"Field '{name}': {field_value}")
出力結果
※個人情報は,***とマスキングをしました。実際の出力では読み取られた内容が出力しています。
{
"DocumentType": "businessCard",
"Fields": {
"Addresses": [
{
"ValueType": "address",
"Value": {
"HouseNumber": "***",
"City": "***",
"State": "***",
"PostalCode": "***",
"StreetAddress": "***",
"CityDistrict": "***",
"House": "***"
},
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 106.0, "y": 2453.0},
{"x": 1148.0, "y": 2453.0},
{"x": 1148.0, "y": 2614.0},
{"x": 106.0, "y": 2614.0}
]
}
],
"Spans": [
{"Offset": 137, "Length": 46}
],
"Confidence": 0.925
}
],
"CompanyNames": [
{
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 124.0, "y": 2343.0},
{"x": 1062.0, "y": 2343.0},
{"x": 1062.0, "y": 2416.0},
{"x": 124.0, "y": 2416.0}
]
}
],
"Spans": [
{"Offset": 122, "Length": 14}
],
"Confidence": 0.925
},
{
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 299.0, "y": 1881.0},
{"x": 1069.0, "y": 1880.0},
{"x": 1065.0, "y": 2011.0},
{"x": 299.0, "y": 2008.0}
]
}
],
"Spans": [
{"Offset": 53, "Length": 10}
],
"Confidence": 0.865
}
],
"ContactNames": [
{
"ValueType": "dictionary",
"Value": {
"FirstName": {
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1767.0, "y": 1678.0},
{"x": 2016.0, "y": 1678.0},
{"x": 2016.0, "y": 1831.0},
{"x": 1767.0, "y": 1831.0}
]
}
],
"Spans": [
{"Offset": 50, "Length": 2}
],
"Confidence": 0.957
},
"LastName": {
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1407.0, "y": 1681.0},
{"x": 1601.0, "y": 1680.0},
{"x": 1602.0, "y": 1829.0},
{"x": 1408.0, "y": 1830.0}
]
}
],
"Spans": [
{"Offset": 47, "Length": 2}
],
"Confidence": 0.903
}
},
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1408.0, "y": 1678.0},
{"x": 2016.0, "y": 1678.0},
{"x": 2016.0, "y": 1831.0},
{"x": 1408.0, "y": 1831.0}
]
}
],
"Spans": [
{"Offset": 47, "Length": 5}
],
"Confidence": 0.866
},
{
"ValueType": "dictionary",
"Value": {
"FirstName": {
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1770.0, "y": 1848.0},
{"x": 2023.0, "y": 1844.0},
{"x": 2023.0, "y": 1914.0},
{"x": 1770.0, "y": 1919.0}
]
}
],
"Spans": [
{"Offset": 73, "Length": 6}
],
"Confidence": 0.835
},
"LastName": {
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1377.0, "y": 1853.0},
{"x": 1732.0, "y": 1848.0},
{"x": 1732.0, "y": 1920.0},
{"x": 1376.0, "y": 1920.0}
]
}
],
"Spans": [
{"Offset": 64, "Length": 8}
],
"Confidence": 0.694
}
},
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1375.0, "y": 1849.0},
{"x": 2023.0, "y": 1844.0},
{"x": 2024.0, "y": 1918.0},
{"x": 1376.0, "y": 1923.0}
]
}
],
"Spans": [
{"Offset": 64, "Length": 15}
],
"Confidence": 0.636
}
],
"Departments": [
{
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1368.0, "y": 1376.0},
{"x": 2309.0, "y": 1364.0},
{"x": 2312.0, "y": 1612.0},
{"x": 1371.0, "y": 1624.0}
]
}
],
"Spans": [
{"Offset": 0, "Length": 38}
],
"Confidence": 0.925
}
],
"Emails": [
{
"ValueType": "string",
"Value": "***@***.co.jp",
"Content": "***@***.co.jp",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1375.0, "y": 2072.0},
{"x": 2512.0, "y": 2065.0},
{"x": 2512.0, "y": 2130.0},
{"x": 1374.0, "y": 2130.0}
]
}
],
"Spans": [
{"Offset": 89, "Length": 32}
],
"Confidence": 0.995
}
],
"JobTitles": [
{
"ValueType": "string",
"Value": "***",
"Content": "***",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 1985.0, "y": 1550.0},
{"x": 2379.0, "y": 1539.0},
{"x": 2381.0, "y": 1605.0},
{"x": 1987.0, "y": 1616.0}
]
}
],
"Spans": [
{"Offset": 39, "Length": 7}
],
"Confidence": 0.925
}
],
"Websites": [
{
"ValueType": "string",
"Value": "https://www.***.co.jp",
"Content": "https://www.***.co.jp",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 81.0, "y": 2779.0},
{"x": 932.0, "y": 2785.0},
{"x": 930.0, "y": 2844.0},
{"x": 81.0, "y": 2836.0}
]
}
],
"Spans": [
{"Offset": 209, "Length": 28}
],
"Confidence": 0.987
}
],
"WorkPhones": [
{
"ValueType": "phoneNumber",
"Value": "+81**********",
"Content": "03-****-****",
"BoundingRegions": [
{
"PageNumber": 1,
"Polygon": [
{"x": 87.0, "y": 2683.0},
{"x": 547.0, "y": 2680.0},
{"x": 547.0, "y": 2744.0},
{"x": 85.0, "y": 2736.0}
]
}
],
"Spans": [
{"Offset": 184, "Length": 13}
],
"Confidence": 0.988
}
]
}
}
主な構造
DocumentType: ドキュメントのタイプ(この場合は「businessCard」)。
Fields: 各情報項目が含まれるオブジェクト。
各フィールドの内容
Addresses
住所情報を格納。
ValueType: データの種類(address)。
Value: 住所の詳細(市区町村、郵便番号など)。
Content: 完全な住所文字列。
BoundingRegions: 住所の位置を示すデータ。
Confidence: 抽出の信頼度。
CompanyNames
会社名。
ValueType: データの種類(string)。
Content: 会社名。
BoundingRegions: 会社名の位置。
Confidence: 抽出の信頼度。
ContactNames
名前情報。
ValueType: データの種類(dictionary)。
Value: 名前の詳細(姓と名)。
BoundingRegions: 名前の位置。
Confidence: 抽出の信頼度。
Departments:
部署名。
ValueType: データの種類(string)。
Content: 部署名。
BoundingRegions: 部署名の位置。
Confidence: 抽出の信頼度。
Emails
メールアドレス。
ValueType: データの種類(string)。
Content: メールアドレス。
BoundingRegions: メールアドレスの位置。
Confidence: 抽出の信頼度。
JobTitles
役職名。
ValueType: データの種類(string)。
Content: 役職名。
BoundingRegions: 役職名の位置。
Confidence: 抽出の信頼度。
Websites
ウェブサイトのURL。
ValueType: データの種類(string)。
Content: URL。
BoundingRegions: URLの位置。
Confidence: 抽出の信頼度。
WorkPhones
電話番号。
ValueType: データの種類(phoneNumber)。
Content: 電話番号。
BoundingRegions: 電話番号の位置。
Confidence: 抽出の信頼度。
事前構築済みモデルの種類について
以下の種類があります。
↓Docsより引用
- 請求書モデル。 請求書から一般的なフィールドとその値を抽出します。
- 領収書モデル。 領収書から一般的なフィールドとその値を抽出します。
- 米国税モデル。 W-2、1098、1099、1040 などのフォームから抽出できる統一された米国税モデル。
- ID ドキュメント モデル。 米国の運転免許証、欧州連合の ID と運転免許証、国際パスポートから共通のフィールドとその値を抽出します。
- 名刺モデル。 名刺から一般的なフィールドとその値を抽出します。
- 医療保険カード モデル。 医療保険カードから共通フィールドとその値を抽出します。
- 結婚証明書。 結婚証明書から情報を抽出します。
- クレジット/デビット カード モデル。 銀行カードから共通の情報を抽出します。
- 住宅ローンのドキュメント。 住宅ローン契約締結開示説明書、Uniform Residential Loan Application (フォーム 1003)、Appraisal (フォーム 1004)、Validation of Employment (フォーム 1005)、Uniform Underwriting and Transmittal Summary (フォーム 1008) から情報を抽出します。
- 口座取引明細書モデル。 口座情報 (開始残高と終了残高、取引明細など) を口座取引明細書から抽出します。
- 給与明細書モデル。 賃金、時間、控除、手取り額、その他の一般的な給与明細書フィールドを抽出します。
- 小切手モデル。 支払い先、金額、日付、その他の関連情報を小切手から抽出します。
細かいモデルの名前は以下のDocsで確認できます。
事前構築済みモデルの料金
東日本リージョンでは、1,000ページあたり$10。
まとめ
Azure Document intelligenceの事前構築済みモデルで遊んでみました。
APIとして利用するのも簡単でした。出力でConfidenceが出力されるのはいいなーと。
次はカスタムモデルを触ってみようかなと。
Discussion