اسناد حاوی محتوای جدولی دست نویس را با استفاده از Amazon Textract و Amazon A2I پردازش کنید

گره منبع: 748571

حتی در این عصر دیجیتال که شرکت‌های بیشتری به سمت فضای ابری حرکت می‌کنند و از یادگیری ماشینی (ML) یا فناوری برای بهبود فرآیندهای تجاری استفاده می‌کنند، همچنان شاهد هستیم که تعداد زیادی از شرکت‌ها به سراغ پردازش اسناد، به‌ویژه اسناد با دست خط می‌روند. ما فرم های استخدام، کارت های وقت و درخواست های مالی را با جداول و فرم هایی می بینیم که علاوه بر اطلاعات چاپی حاوی دست خط هستند. برای پیچیده‌تر کردن مسائل، هر سند می‌تواند در قالب‌های مختلف باشد و هر موسسه در هر صنعت معین ممکن است چندین قالب مختلف داشته باشد. سازمان ها به دنبال راه حل ساده ای هستند که بتواند اسناد پیچیده را با فرمت های مختلف از جمله جداول، فرم ها و داده های جدولی پردازش کند.

استخراج داده ها از این اسناد، به ویژه زمانی که ترکیبی از متن چاپی و دست نویس دارید، مستعد خطا، زمان بر، پرهزینه و مقیاس پذیر نیست. متن جاسازی شده در جداول و فرم ها به پیچیدگی استخراج و پردازش می افزاید. متن آمازون یک سرویس هوش مصنوعی AWS است که به طور خودکار متن چاپ شده، دست خط و سایر داده ها را از اسناد اسکن شده استخراج می کند که فراتر از تشخیص ساده کاراکتر نوری (OCR) برای شناسایی، درک و استخراج داده ها از فرم ها و جداول است.

پس از استخراج داده ها، مرحله پس پردازش در یک گردش کار مدیریت اسناد شامل بررسی ورودی ها و ایجاد تغییرات مورد نیاز برنامه های پردازش پایین دستی است. هوش مصنوعی آمازون افزوده شده است (Amazon A2I) پیکربندی یک بررسی انسانی را در گردش کار ML شما آسان می کند. این به شما این امکان را می دهد که به طور خودکار یک مرحله انسانی برای بررسی خط لوله ML خود داشته باشید، اگر نتایج زیر یک آستانه اطمینان مشخص قرار گرفتند، گردش کار بررسی و ممیزی را تنظیم کنید، و نتایج پیش بینی را در صورت نیاز اصلاح کنید.

در این پست، ما نشان می‌دهیم که چگونه می‌توانید از ویژگی دست‌نویس آمازون برای استخراج داده‌های جدولی از اسناد و داشتن یک حلقه بازبینی انسانی با استفاده از نوع وظیفه سفارشی Amazon A2I تا مطمئن شوید که پیش بینی ها بسیار دقیق هستند. ما نتایج را در آمازون DynamoDB، که یک پایگاه داده با ارزش کلید و سند است که عملکرد میلی ثانیه ای تک رقمی را در هر مقیاسی ارائه می دهد و داده ها را برای پردازش پایین دستی در دسترس قرار می دهد.

ما با استفاده از a شما را از طریق مراحل زیر راهنمایی می کنیم دفترچه ژوپیتر:

  1. از متن آمازون برای بازیابی داده های جدولی از سند و بررسی پاسخ استفاده کنید.
  2. یک حلقه انسانی Amazon A2I برای بررسی و اصلاح پاسخ آمازون متن تنظیم کنید.
  3. ارزیابی پاسخ Amazon A2I و ذخیره آن در DynamoDB برای پردازش پایین دست.

پیش نیازها

قبل از شروع، بیایید نوت بوک Jupyter را با استفاده از یک پیکربندی کنیم AWS CloudFormation قالب و سپس یک نیروی کار خصوصی Amazon A2I ایجاد کنید، که در نوت بوک برای تنظیم گردش کار سفارشی Amazon A2I مورد نیاز است.

راه اندازی نوت بوک Jupyter

ما یک الگوی CloudFormation را مستقر می کنیم که بسیاری از کارهای راه اندازی اولیه را برای شما انجام می دهد، مانند ایجاد یک هویت AWS و مدیریت دسترسی (IAM) نقش برای آمازون SageMaker، ایجاد یک نمونه نوت بوک SageMaker و شبیه سازی مخزن GitHub در نمونه نوت بوک.

  1. را انتخاب کنید Stack را راه اندازی کنید برای پیکربندی نوت بوک در منطقه شرقی ایالات متحده (ویرجینیای شمالی):

  1. هیچ تغییری در نام پشته یا پارامترها ایجاد نکنید.
  2. در توانمندی ها بخش، انتخاب کنید من تصدیق می کنم که AWS CloudFormation ممکن است منابع IAM را ایجاد کند.
  3. را انتخاب کنید پشته ایجاد کنید.

ایجاد پشته را انتخاب کنید

تصویر زیر از صفحه جزئیات پشته وضعیت پشته را به عنوان نشان می دهد CREATE_IN_PROGRESS. تغییر وضعیت ممکن است تا 20 دقیقه طول بکشد CREATE_COMPLETE.

تصویر زیر از صفحه جزئیات پشته وضعیت پشته را به عنوان CREATE_IN_PROGRESS نشان می دهد

  1. در کنسول SageMaker، را انتخاب کنید نمونه های نوت بوک.
  2. را انتخاب کنید ژوپیتر را باز کنید برای TextractA2INotebook نوت بوکی که ساختید
  3. باز کن textract-hand-written-a2i-forms.ipynb و آنجا را دنبال کنید.

راه اندازی نیروی کار خصوصی Amazon A2I

برای این پست، یک تیم کاری خصوصی ایجاد می کنید و تنها یک کاربر (شما) را به آن اضافه می کنید. برای دستورالعمل، نگاه کنید ایجاد یک نیروی کار خصوصی (کنسول آمازون SageMaker). وقتی کاربر (شما) دعوت نامه را پذیرفت، باید خود را به نیروی کار اضافه کنید. برای دستورالعمل، نگاه کنید به یک کارگر را به یک تیم کاری اضافه کنید بخش در مدیریت نیروی کار (کنسول آمازون SageMaker).

پس از ایجاد نیروی کار برچسب‌گذاری، ARN نیروی کار را کپی کنید و آن را در سلول نوت بوک وارد کنید تا نیروی کار بازبینی خصوصی راه اندازی شود:

WORKTEAM_ARN= "<your workteam ARN>"

در بخش های بعدی شما را با مراحل استفاده از این نوت بوک آشنا می کنیم.

بازیابی داده های جدولی از سند و بررسی پاسخ

در این بخش مراحل زیر را با استفاده از دفترچه راهنما:

  1. داده های نمونه را که دارای محتوای چاپی و دست نویس هستند، مرور کنید.
  2. توابع کمکی را برای تجزیه پاسخ آمازون متن تنظیم کنید.
  3. پاسخ Amazon Texttract را بررسی و تجزیه و تحلیل کنید.

بررسی داده های نمونه

داده های نمونه را با اجرای سلول نوت بوک زیر بررسی کنید:

# Document documentName = "test_handwritten_document.png" display(Image(filename=documentName)) 

ما از نمونه سند زیر استفاده می کنیم که دارای محتوای چاپی و دست نویس در جداول است.

ما از نمونه سند زیر استفاده می کنیم که دارای محتوای چاپی و دست نویس در جداول است.

از کتابخانه تجزیه کننده متن آمازون برای پردازش پاسخ استفاده کنید

ما اکنون وارد می کنیم تجزیه کننده پاسخ متن آمازون کتابخانه برای تجزیه و استخراج آنچه ما از پاسخ آمازون متن نیاز داریم. در اینجا دو عملکرد اصلی وجود دارد. اول، داده‌های فرم (جفت‌های کلید-مقدار) را بخشی از قسمت سرصفحه سند استخراج می‌کنیم. دوم، ما جدول و سلول ها را تجزیه می کنیم تا یک فایل csv حاوی داده های جدولی ایجاد کنیم. در این نوت بوک، ما از Amazon Textract's Sync API برای استخراج سند استفاده خواهیم کرد. آنالیز سند. این فایل های تصویری (png یا jpeg) را به عنوان ورودی می پذیرد.

client = boto3.client( service_name='textract', region_name= 'us-east-1', endpoint_url='https://textract.us-east-1.amazonaws.com', ) with open(documentName, 'rb') as file: img_test = file.read() bytes_test = bytearray(img_test) print('Image loaded', documentName) # process using image bytes response = client.analyze_document(Document={'Bytes': bytes_test}, FeatureTypes=['TABLES','FORMS']) 

شما می توانید از کتابخانه Amazon Textract Response Parser برای تجزیه آسان JSON بازگشتی توسط Amazon Textract استفاده کنید. این کتابخانه JSON را تجزیه می کند و ساختارهای خاص زبان برنامه نویسی را برای کار با بخش های مختلف سند ارائه می دهد. برای جزئیات بیشتر، لطفا به کتابخانه تجزیه کننده متن آمازون

from trp import Document # Parse JSON response from Textract doc = Document(response) # Iterate over elements in the document for page in doc.pages: # Print lines and words for line in page.lines: print("Line: {}".format(line.text)) for word in line.words: print("Word: {}".format(word.text)) # Print tables for table in page.tables: for r, row in enumerate(table.rows): for c, cell in enumerate(row.cells): print("Table[{}][{}] = {}".format(r, c, cell.text)) # Print fields for field in page.form.fields: print("Field: Key: {}, Value: {}".format(field.key.text, field.value.text)) 

اکنون که محتویات مورد نیاز از تصویر سند را داریم، بیایید یک فایل csv برای ذخیره آن ایجاد کنیم و همچنین از آن برای راه اندازی حلقه انسانی Amazon A2I برای بررسی و اصلاح در صورت نیاز استفاده کنیم.

# Lets get the form data into a csv file with open('test_handwritten_form.csv', 'w', newline='') as csvfile: formwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) for field in page.form.fields: formwriter.writerow([field.key.text+" "+field.value.text]) # Lets get the table data into a csv file with open('test_handwritten_tab.csv', 'w', newline='') as csvfile: tabwriter = csv.writer(csvfile, delimiter=',') for r, row in enumerate(table.rows): csvrow = [] for c, cell in enumerate(row.cells): if cell.text: csvrow.append(cell.text.rstrip()) #csvrow += '{}'.format(cell.text.rstrip())+"," tabwriter.writerow(csvrow) 

از طرف دیگر، اگر می خواهید این نوت بوک را برای استفاده از یک فایل PDF یا برای پردازش دسته ای اسناد تغییر دهید، از StartDocumentAnalysis API. StartDocumentAnalysis یک شناسه شغلی را برمی گرداند (JobId) که برای دریافت نتایج عملیات استفاده می کنید. هنگامی که تجزیه و تحلیل متن به پایان رسید، آمازون متن یک وضعیت تکمیل را در موضوع سرویس اطلاع رسانی ساده آمازون (Amazon SNS) که در آن مشخص کرده اید، منتشر می کند. NotificationChannel. برای به دست آوردن نتایج عملیات تجزیه و تحلیل متن، ابتدا بررسی کنید که مقدار وضعیت منتشر شده در مبحث Amazon SNS موفقیت آمیز باشد. اگر چنین است، تماس بگیرید GetDocumentAnalysis، و شناسه شغل را ارسال کنید (JobId) از تماس اولیه تا StartDocumentAnalysis.

بازرسی و تجزیه و تحلیل پاسخ آمازون متن

اکنون موارد خط فرم را در یک Pandas DataFrame بارگذاری می کنیم و آن را تمیز می کنیم تا مطمئن شویم که ستون ها و ردیف های مربوطه را داریم که برنامه های پایین دستی به آن نیاز دارند. سپس آن را برای بررسی انسانی به Amazon A2I ارسال می کنیم.

سلول نوت بوک زیر را برای بازرسی و تجزیه و تحلیل داده های کلید-مقدار از پاسخ متن آمازون اجرا کنید:

# Load the csv file contents into a dataframe, strip out extra spaces, use comma as delimiter df_form = pd.read_csv('test_handwritten_form.csv', header=None, quoting=csv.QUOTE_MINIMAL, sep=',') # Rename column df_form = df_form.rename(columns={df_form.columns[0]: 'FormHeader'}) # display the dataframe df_form 

تصویر زیر خروجی ما را نشان می دهد.

سلول نوت بوک زیر را برای بررسی و تجزیه و تحلیل داده های جدولی از پاسخ متن آمازون اجرا کنید:

# Load the csv file contents into a dataframe, strip out extra spaces, use comma as delimiter df_tab = pd.read_csv('test_handwritten_tab.csv', header=1, quoting=csv.QUOTE_MINIMAL, sep=',') # display the dataframe df_tab.head() 

تصویر زیر خروجی ما را نشان می دهد.

تصویر زیر خروجی ما را نشان می دهد.

می‌توانیم ببینیم که Amazon Texttract هم محتوای چاپی و هم دست‌نویس را از داده‌های جدولی شناسایی می‌کند.

راه اندازی یک حلقه انسانی آمازون A2I

Amazon A2I از دو نوع وظیفه داخلی پشتیبانی می کند: استخراج جفت کلید-مقدار متن آمازون و تعدیل تصویر آمازون Rekognitionو نوع کار سفارشی که می توانید از آن برای ادغام یک حلقه بررسی انسانی در هر گردش کار ML استفاده کنید. می‌توانید از یک نوع کار سفارشی برای ادغام Amazon A2I با سایر سرویس‌های AWS استفاده کنید درک آمازون, آمازون رونوشتو ترجمه آمازونو همچنین گردش کار ML سفارشی شما. برای کسب اطلاعات بیشتر، ببینید از موارد و مثال ها با استفاده از Amazon A2I استفاده کنید.

در این بخش، نحوه استفاده از نوع وظیفه سفارشی Amazon A2I برای ادغام با جداول متنی آمازون و جفت‌های کلید-مقدار را از طریق دفترچه راهنما برای نمرات تشخیص با اطمینان پایین از پاسخ های آمازون تکست. شامل مراحل زیر است:

  1. یک UI کار انسانی ایجاد کنید.
  2. یک تعریف گردش کار ایجاد کنید.
  3. پیش بینی ها را به حلقه های انسانی آمازون A2I ارسال کنید.
  4. به پورتال کارگر وارد شوید و نتایج متن آمازون را حاشیه نویسی یا تأیید کنید.

ایجاد یک UI کار انسانی

شما می توانید با ایجاد a یک Task UI برای کارگران خود ایجاد کنید الگوی کار کارگر. الگوی کار کارگر یک فایل HTML است که برای نمایش داده‌های ورودی و دستورالعمل‌ها برای کمک به کارگران در تکمیل کار شما استفاده می‌کنید. اگر در حال ایجاد یک گردش کار بازبینی انسانی برای یک نوع کار سفارشی هستید، باید با استفاده از کد HTML یک الگوی کار سفارشی کارگر ایجاد کنید. برای اطلاعات بیشتر ببین الگوی کار Custom Worker Task ایجاد کنید.

برای این پست، یک قالب HTML سفارشی برای رندر کردن جداول آمازون متن و جفت‌های کلید-مقدار در نوت بوک ایجاد کردیم. می توانید قالب را پیدا کنید tables-keyvalue-sample.liquid.html در مخزن GitHub ما و آن را برای مورد استفاده از سند خاص خود سفارشی کنید.

هر زمان که نیاز به حلقه انسانی باشد از این الگو استفاده می شود. ما بیش از 70 رابط کاربری از پیش ساخته شده در دسترس داریم GitHub. به صورت اختیاری، می توانید این تعریف گردش کار را بر روی ایجاد کنید کنسول آمازون A2I. برای دستورالعمل، نگاه کنید یک گردش کار بررسی انسانی ایجاد کنید.

بعد از اینکه این الگوی سفارشی را با استفاده از HTML ایجاد کردید، باید از این الگو برای ایجاد یک UI انسانی آمازون A2I نام منبع آمازون (ARN) استفاده کنید. این ARN دارای فرمت زیر است: arn:aws:sagemaker:<aws-region>:aws-account-number>:human-task-uمن/نام الگو> این ARN با یک منبع الگوی کار کارگر مرتبط است که می توانید از آن در یک یا چند گردش کار بررسی انسانی (تعریف جریان) استفاده کنید. با استفاده از یک الگوی کار کارگر با استفاده از ARN یک UI task انسانی ایجاد کنید CreateHumanTaskUi عملیات API با اجرای سلول نوت بوک زیر:

def create_task_ui(): ''' Creates a Human Task UI resource. Returns: struct: HumanTaskUiArn ''' response = sagemaker_client.create_human_task_ui( HumanTaskUiName=taskUIName, UiTemplate={'Content': template}) return response # Create task UI humanTaskUiResponse = create_task_ui() humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn'] print(humanTaskUiArn) 

کد قبلی یک ARN را به عنوان خروجی به شما می دهد که در مرحله بعد از آن در تنظیم تعاریف جریان استفاده می کنیم:

arn:aws:sagemaker:us-east-1:<aws-account-nr>:human-task-ui/ui-hw-invoice-2021-02-10-16-27-23

ایجاد تعریف گردش کار

در این قسمت یک تعریف جریان ایجاد می کنیم. تعاریف جریان به ما امکان می دهد موارد زیر را مشخص کنیم:

  • نیروی کاری که وظایف شما به آنها فرستاده می شود
  • دستورالعمل هایی که نیروی کار شما دریافت می کند (الگوی وظیفه کارگر)
  • جایی که داده های خروجی شما ذخیره می شود

برای این پست از API در کد زیر استفاده می کنیم:

create_workflow_definition_response = sagemaker_client.create_flow_definition( FlowDefinitionName= flowDefinitionName, RoleArn= role, HumanLoopConfig= { "WorkteamArn": WORKTEAM_ARN, "HumanTaskUiArn": humanTaskUiArn, "TaskCount": 1, "TaskDescription": "Review the table contents and correct values as indicated", "TaskTitle": "Employment History Review" }, OutputConfig={ "S3OutputPath" : OUTPUT_PATH } ) flowDefinitionArn = create_workflow_definition_response['FlowDefinitionArn'] # let's save this ARN for future use 

به صورت اختیاری، می توانید این تعریف گردش کار را بر روی ایجاد کنید کنسول آمازون A2I. برای دستورالعمل، نگاه کنید یک گردش کار بررسی انسانی ایجاد کنید.

ارسال پیش بینی به حلقه های انسانی آمازون A2I

ما یک لیست آیتم از Pandas DataFrame ایجاد می کنیم که در آن خروجی Amazon Texttract ذخیره شده است. سلول نوت بوک زیر را اجرا کنید تا لیستی از مواردی که برای بررسی ارسال می شوند ایجاد کنید:

NUM_TO_REVIEW = len(df_tab) # number of line items to review dfstart = df_tab['Start Date'].to_list() dfend = df_tab['End Date'].to_list() dfemp = df_tab['Employer Name'].to_list() dfpos = df_tab['Position Held'].to_list() dfres = df_tab['Reason for leaving'].to_list() item_list = [{'row': "{}".format(x), 'startdate': dfstart[x], 'enddate': dfend[x], 'empname': dfemp[x], 'posheld': dfpos[x], 'resleave': dfres[x]} for x in range(NUM_TO_REVIEW)] item_list

شما یک خروجی از تمام سطرها و ستون های دریافتی از Amazon Textract دریافت می کنید:

[{'row': '0', 'startdate': '1/15/2009 ', 'enddate': '6/30/2011 ', 'empname': 'Any Company ', 'posheld': 'Assistant baker ', 'resleave': 'relocated '}, {'row': '1', 'startdate': '7/1/2011 ', 'enddate': '8/10/2013 ', 'empname': 'Example Corp. ', 'posheld': 'Baker ', 'resleave': 'better opp. '}, {'row': '2', 'startdate': '8/15/2013 ', 'enddate': 'Present ', 'empname': 'AnyCompany ', 'posheld': 'head baker ', 'resleave': 'N/A current '}] 

سلول نوت بوک زیر را اجرا کنید تا لیستی از جفت های کلید-مقدار دریافت کنید:

dforighdr = df_form['FormHeader'].to_list() hdr_list = [{'hdrrow': "{}".format(x), 'orighdr': dforighdr[x]} for x in range(len(df_form))] hdr_list

کد زیر را برای ایجاد پاسخ JSON برای حلقه آمازون A2I با ترکیب کلید-مقدار و لیست جدول از سلول های قبلی اجرا کنید:

ip_content = {"Header": hdr_list, 'Pairs': item_list, 'image1': s3_img_url } 

حلقه انسان را با اجرای سلول نوت بوک زیر شروع کنید:

# Activate human loops import json humanLoopName = str(uuid.uuid4()) start_loop_response = a2i.start_human_loop( HumanLoopName=humanLoopName, FlowDefinitionArn=flowDefinitionArn, HumanLoopInput={ "InputContent": json.dumps(ip_content) } ) 

وضعیت حلقه انسان را با کد زیر بررسی کنید:

completed_human_loops = [] resp = a2i.describe_human_loop(HumanLoopName=humanLoopName) print(f'HumanLoop Name: {humanLoopName}') print(f'HumanLoop Status: {resp["HumanLoopStatus"]}') print(f'HumanLoop Output Destination: {resp["HumanLoopOutput"]}') print('n') if resp["HumanLoopStatus"] == "Completed": completed_human_loops.append(resp)

خروجی زیر را دریافت می کنید که وضعیت حلقه انسان و سطل مقصد خروجی S3 را نشان می دهد:

HumanLoop Name: f69bb14e-3acd-4301-81c0-e272b3c77df0 HumanLoop Status: InProgress HumanLoop Output Destination: {'OutputS3Uri': 's3://sagemaker-us-east-1-<aws-account-nr>/textract-a2i-handwritten/a2i-results/fd-hw-forms-2021-01-11-16-54-31/2021/01/11/16/58/13/f69bb14e-3acd-4301-81c0-e272b3c77df0/output.json'} 

حاشیه نویسی نتایج از طریق پورتال کارگر

مراحل را در نوت بوک اجرا کنید تا وضعیت حلقه انسان را بررسی کنید. می توانید از همراه استفاده کنید نوت بوک SageMaker Jupyter برای انجام مراحل این پست

  1. سلول نوت بوک زیر را اجرا کنید تا پیوند ورود به سیستم را برای پیمایش به پورتال نیروی کار خصوصی دریافت کنید:
    workteamName = WORKTEAM_ARN[WORKTEAM_ARN.rfind('/') + 1:] print("Navigate to the private worker portal and do the tasks. Make sure you've invited yourself to your workteam!") print('https://' + sagemaker_client.describe_workteam(WorkteamName=workteamName)['Workteam']['SubDomain'])

  1. پیوند ورود به پورتال کارگر خصوصی را انتخاب کنید.
  2. شغل بازبینی انسانی را انتخاب کنید.
  3. را انتخاب کنید شروع به کار.

شروع به کار را انتخاب کنید.

شما به کنسول آمازون A2I هدایت می شوید، جایی که سند اصلی نمایش داده شده، جفت کلید-مقدار خود، پاسخ های متنی شناسایی شده از Amazon Textract و پاسخ های جدول خود را پیدا می کنید.

شروع به کار را انتخاب کنید.

به پایین پیمایش کنید تا فرم تصحیح جفت‌های کلید-مقدار و متن را بیابید، جایی که می‌توانید نتایج را تأیید کنید و پاسخ متن آمازون را با سند اصلی مقایسه کنید. همچنین رابط کاربری را برای اصلاح محتوای دست‌نویس و چاپی جدولی پیدا خواهید کرد.

می توانید هر سلول را بر اساس پاسخ تصویر اصلی تغییر دهید و مقادیر صحیح را دوباره وارد کنید و پاسخ خود را ارسال کنید. هنگامی که پاسخ های خود را ارسال می کنید، گردش کار برچسب گذاری کامل می شود.

ارزیابی نتایج

وقتی کار برچسب‌گذاری کامل شد، نتایج شما باید در مسیر خروجی S3 مشخص شده در تعریف گردش کار بررسی انسانی در دسترس باشد. پاسخ های انسانی برگردانده شده و در فایل JSON ذخیره می شوند. برای دریافت نتایج از Amazon S3، سلول نوت بوک را اجرا کنید:

import re import pprint pp = pprint.PrettyPrinter(indent=4) for resp in completed_human_loops: splitted_string = re.split('s3://' + 'a2i-experiments' + '/', resp['HumanLoopOutput']['OutputS3Uri']) output_bucket_key = splitted_string[1] response = s3.get_object(Bucket='a2i-experiments', Key=output_bucket_key) content = response["Body"].read() json_output = json.loads(content) pp.pprint(json_output) print('n') 

کد زیر قطعه ای از فایل JSON خروجی حاشیه نویسی Amazon A2I را نشان می دهد:

{ 'flowDefinitionArn': 'arn:aws:sagemaker:us-east-1:<aws-account-nr>:flow-definition/fd-hw-invoice-2021-02-22-23-07-53', 'humanAnswers': [ { 'acceptanceTime': '2021-02-22T23:08:38.875Z', 'answerContent': { 'TrueHdr3': 'Full Name: Jane ' 'Smith', 'predicted1': 'relocated', 'predicted2': 'better opp.', 'predicted3': 'N/A, current', 'predictedhdr1': 'Phone ' 'Number: ' '555-0100', 'predictedhdr2': 'Mailing ' 'Address: ' 'same as ' 'above', 'predictedhdr3': 'Full Name: ' 'Jane Doe', 'predictedhdr4': 'Home ' 'Address: ' '123 Any ' 'Street, Any ' 'Town. USA', 'rating1': { 'agree': True, 'disagree': False}, 'rating2': { 'agree': True, 'disagree': False}, 'rating3': { 'agree': False, 'disagree': True}, 'rating4': { 'agree': True, 'disagree': False}, 'ratingline1': { 'agree': True, 'disagree': False}, 'ratingline2': { 'agree': True, 'disagree': False}, 'ratingline3': { 'agree': True, 'disagree': False}}

ذخیره نتایج مشروح آمازون A2I در DynamoDB

اکنون فرم را با محتویات به روز شده در جدول DynamoDB ذخیره می کنیم تا برنامه های پایین دستی بتوانند از آن استفاده کنند. برای خودکار کردن فرآیند، به سادگی یک را تنظیم کنید AWS لامبدا با DynamoDB راه اندازی کنید تا به طور خودکار اطلاعات را به نقاط انتهایی API یا برنامه های کاربردی خود استخراج و ارسال کنید. برای اطلاعات بیشتر ببین DynamoDB Streams و AWS Lambda Triggers.

برای ذخیره نتایج، مراحل زیر را انجام دهید:

  1. پاسخ‌های انسانی برای مقادیر کلیدی و متن را در یک DataFrame دریافت کنید سلول نوت بوک زیر را اجرا می کند:
    #updated array values to be strings for dataframe assignment for i in json_output['humanAnswers']: x = i['answerContent'] for j in range(0, len(df_form)): df_form.at[j, 'TrueHeader'] = str(x.get('TrueHdr'+str(j+1))) df_form.at[j, 'Comments'] = str(x.get('Comments'+str(j+1))) df_form = df_form.where(df_form.notnull(), None) 

  1. با اجرای سلول زیر، پاسخ های بررسی شده توسط انسان برای داده های جدولی را در یک DataFrame دریافت کنید:
    #updated array values to be strings for dataframe assignment for i in json_output['humanAnswers']: x = i['answerContent'] for j in range(0, len(df_tab)): df_tab.at[j, 'TrueStartDate'] = str(x.get('TrueStartDate'+str(j+1))) df_tab.at[j, 'TrueEndDate'] = str(x.get('TrueEndDate'+str(j+1))) df_tab.at[j, 'TrueEmpName'] = str(x.get('TrueEmpName'+str(j+1))) df_tab.at[j, 'TruePosHeld'] = str(x.get('TruePosHeld'+str(j+1))) df_tab.at[j, 'TrueResLeave'] = str(x.get('TrueResLeave'+str(j+1))) df_tab.at[j, 'ChangeComments'] = str(x.get('Change Reason'+str(j+1))) df_tab = df_tab.where(df_tab.notnull(), None)You will get below output:

  1. DataFrames را در یک DataFrame ترکیب کنید تا در جدول DynamoDB ذخیره شود:
    # Join both the dataframes to prep for insert into DynamoDB df_doc = df_form.join(df_tab, how='outer') df_doc = df_doc.where(df_doc.notnull(), None) df_doc

ایجاد جدول DynamoDB

جدول DynamoDB خود را با کد زیر ایجاد کنید:

# Get the service resource. dynamodb = boto3.resource('dynamodb') tablename = "emp_history-"+str(uuid.uuid4()) # Create the DynamoDB table. table = dynamodb.create_table( TableName=tablename, KeySchema=[ { 'AttributeName': 'line_nr', 'KeyType': 'HASH' } ], AttributeDefinitions=[ { 'AttributeName': 'line_nr', 'AttributeType': 'N' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 5, 'WriteCapacityUnits': 5 } ) # Wait until the table exists. table.meta.client.get_waiter('table_exists').wait(TableName=tablename) # Print out some data about the table. print("Table successfully created. Item count is: " + str(table.item_count)) 

شما خروجی زیر را دریافت می کنید:

Table successfully created. Item count is: 0

بارگذاری محتویات DataFrame در جدول DynamoDB

محتویات DataFrame خود را با کد زیر در جدول DynamoDB خود آپلود کنید:

توجه داشته باشید: هنگام اضافه کردن محتویات از چندین سند در جدول DynamoDB خود، لطفاً مطمئن شوید که شماره سند را به عنوان ویژگی برای تمایز بین اسناد اضافه کنید. در مثال زیر ما فقط از ایندکس به عنوان line_nr استفاده می کنیم زیرا با یک سند کار می کنیم.

for idx, row in df_doc.iterrows(): table.put_item( Item={ 'line_nr': idx, 'orig_hdr': str(row['FormHeader']) , 'true_hdr': str(row['TrueHeader']), 'comments': str(row['Comments']), 'start_date': str(row['Start Date ']), 'end_date': str(row['End Date ']), 'emp_name': str(row['Employer Name ']), 'position_held': str(row['Position Held ']), 'reason_for_leaving': str(row['Reason for leaving']), 'true_start_date': str(row['TrueStartDate']), 'true_end_date': str(row['TrueEndDate']), 'true_emp_name': str(row['TrueEmpName']), 'true_position_held': str(row['TruePosHeld']), 'true_reason_for_leaving': str(row['TrueResLeave']), 'change_comments': str(row['ChangeComments']) } ) 

برای بررسی اینکه آیا آیتم ها به روز شده اند، کد زیر را برای بازیابی مقدار جدول DynamoDB اجرا کنید:

response = table.get_item( Key={ 'line_nr': 2 } ) item = response['Item'] print(item) 

همچنین، می توانید مانند تصویر زیر، جدول موجود در کنسول DynamoDB را بررسی کنید.

نتیجه

این پست نشان داد که استفاده از سرویس‌ها در لایه هوش مصنوعی پشته AWS AI/ML، مانند Amazon Textract و Amazon A2I، برای خواندن و پردازش داده‌های جدولی از فرم‌های دست‌نویس چقدر آسان است و آنها را در یک جدول DynamoDB برای برنامه‌های کاربردی پایین‌دست ذخیره می‌کند. برای استفاده. همچنین می توانید داده های فرم افزوده شده را از Amazon A2I به یک سطل S3 ارسال کنید تا توسط برنامه های تحلیلی AWS شما مصرف شود.

برای ارائه‌های ویدیویی، نمونه نوت‌بوک‌های Jupyter، یا اطلاعات بیشتر درباره موارد استفاده مانند پردازش سند، تعدیل محتوا، تجزیه و تحلیل احساسات، ترجمه متن و موارد دیگر، رجوع کنید به منابع هوش مصنوعی افزوده آمازون. اگر این پست به شما کمک می کند یا الهام بخش شما برای حل یک مشکل است، ما دوست داریم در مورد آن بشنویم! کد این راه حل در دسترس است GitHub repo برای استفاده و گسترش مشارکت همیشه خوش آمدید!


درباره نویسنده

پرم رنگا یک معمار Enterprise Solutions مستقر در آتلانتا، GA است. او بخشی از انجمن حوزه فنی یادگیری ماشین است و دوست دارد با مشتریان در سفر ML و AI کار کند. پرم به رباتیک علاقه زیادی دارد، یک محقق وسایل نقلیه خودمختار است و همچنین Beer Pours تحت کنترل الکسا را ​​در هیوستون و مکان‌های دیگر ساخت.

مونا مونا یک معمار راه حل های تخصصی AI/ML است که در آرلینگتون، ویرجینیا مستقر است. او با تیم بخش عمومی جهانی کار می کند و به مشتریان کمک می کند تا یادگیری ماشینی را در مقیاس بزرگ بپذیرند. او به حوزه‌های قابل توضیح NLP و ML در AI/ML علاقه‌مند است.

سریهارشا ام اس یک معمار راه حل متخصص AI/ML در تیم متخصص استراتژیک در خدمات وب آمازون است. او با مشتریان استراتژیک AWS کار می کند که از AI/ML برای حل مشکلات پیچیده تجاری استفاده می کنند. او راهنمایی های فنی و مشاوره طراحی را برای پیاده سازی برنامه های AI/ML در مقیاس ارائه می دهد. تخصص او شامل معماری اپلیکیشن، کلان داده، تجزیه و تحلیل و یادگیری ماشین است.

منبع: https://aws.amazon.com/blogs/machine-learning/process-documents-containing-handwritten-tabular-content-using-amazon-text-and-amazon-a2i/

تمبر زمان:

بیشتر از وبلاگ یادگیری ماشین AWS