paint-brush
Cách sử dụng dịch vụ AI và PDF để tự động hóa việc tóm tắt tài liệutừ tác giả@raymondcamden
5,330 lượt đọc
5,330 lượt đọc

Cách sử dụng dịch vụ AI và PDF để tự động hóa việc tóm tắt tài liệu

từ tác giả Raymond Camden8m2024/02/04
Read on Terminal Reader

dài quá đọc không nổi

Vì vậy, văn bản, phông chữ, màu sắc, vị trí, v.v. Nó cũng có thể tìm thấy hình ảnh và dữ liệu dạng bảng, dẫn đến một số trường hợp sử dụng khá hiệu quả. (Để có ví dụ điển hình về điều này, hãy xem bài đăng trên blog của tôi nơi tôi quét nhiều tạp chí khoa học để thu thập và tổng hợp dữ liệu thiên văn cũng như tạo báo cáo.) Đối với bản demo này, chúng tôi thực sự chỉ cần văn bản. Vì vậy, tôi sẽ sử dụng API REST. "Dòng" cho gần như tất cả các khía cạnh của dịch vụ PDF hiện có là:
featured image - Cách sử dụng dịch vụ AI và PDF để tự động hóa việc tóm tắt tài liệu
Raymond Camden HackerNoon profile picture


Lần đầu tiên tôi phát hiện ra Diffbot là vào năm 2021 khi tôi xây dựng bản demo API của họ cho blog Nhà phát triển Adobe ( "Xử lý ngôn ngữ tự nhiên, Trích xuất Adobe PDF và Trí tuệ PDF sâu" ).


Vào thời điểm đó, tôi rất ấn tượng với API của Diffbot dễ dàng như thế nào và nó phản hồi nhanh như thế nào. Tôi đã không xem API của họ một thời gian, nhưng vài ngày trước, họ đã công bố hỗ trợ mới cho việc tóm tắt văn bản. Tôi nghĩ đây sẽ là một điều tuyệt vời khi kết hợp với Adobe PDF Extract API . Đây là những gì tôi tìm thấy.


Trước hết, nếu bạn muốn tự mình thử điều này, bạn sẽ cần:


  • Thông tin xác thực của Dịch vụ Adobe PDF . Đây là miễn phí và bạn nhận được 500 giao dịch mỗi tháng miễn phí. Dành cho những người có thể chưa biết, tôi làm việc cho Adobe và đây là một trong những sản phẩm tôi đảm nhiệm.


  • Thông tin xác thực của Diffbot. Họ cung cấp bản dùng thử miễn phí hai tuần nhưng không có cấp miễn phí. Nói như vậy, tôi đã phải liên hệ với họ một vài lần khi xây dựng nội dung và họ đã hỗ trợ tôi rất nhiều, vì vậy tôi chắc chắn nghĩ rằng họ đáng để bạn kiểm tra.


Được rồi, hãy xem quy trình tóm tắt có thể hoạt động như thế nào.

Bước một - Trích xuất văn bản

API trích xuất (xin lỗi, "API trích xuất Adobe PDF", chờ đã, đây là blog của tôi, tôi có thể rút ngắn mọi thứ!) Khá mạnh mẽ. Nó sử dụng AI để phân tích cú pháp PDF một cách thông minh nhằm tìm chính xác từng chi tiết thành phần trong tài liệu.


Vì vậy, văn bản, phông chữ, màu sắc, vị trí, v.v. Nó cũng có thể tìm thấy hình ảnh và dữ liệu dạng bảng, điều này dẫn đến một số trường hợp sử dụng khá hiệu quả. (Để có ví dụ điển hình về điều này, hãy xem bài đăng trên blog của tôi nơi tôi quét nhiều tạp chí khoa học để thu thập và tổng hợp dữ liệu thiên văn cũng như tạo báo cáo.)


Đối với bản demo này, chúng tôi thực sự chỉ cần văn bản. Để làm được điều đó, tôi sẽ sử dụng API REST. "Dòng" cho gần như tất cả các khía cạnh của dịch vụ PDF hiện có là:


  • Trao đổi thông tin đăng nhập để lấy mã thông báo truy cập


  • Yêu cầu tải lên một tệp để nhập liệu (trong trường hợp này là một tệp PDF được trích xuất)


  • Tải tài liệu lên


  • Bắt đầu công việc


  • Thăm dò ý kiến để hoàn thành


  • Tải xuống các bit


Xin lưu ý rằng bạn cũng có thể sử dụng các SDK nhưng tôi nhận thấy API REST của chúng tôi đơn giản đến mức tôi chỉ cần nhấn trực tiếp vào điểm cuối. Đây là đoạn script tôi đã viết để thực hiện quá trình Trích xuất. Về cơ bản, đó là tất cả những gì tôi đã nói ở trên và trỏ tới tệp PDF nguồn trong hệ thống tệp cục bộ của tôi.


 /* This demo is a two step process. This file, step one, handles extracting and storing the JSON from a PDF. */ import 'dotenv/config'; import fs from 'fs'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; const SOURCE_PDF = '../../source_pdfs/boring_adobe_security_doc.pdf'; const REST_API = "https://pdf-services.adobe.io/"; const CLIENT_ID = process.env.CLIENT_ID; const CLIENT_SECRET = process.env.CLIENT_SECRET; async function delay(x) { return new Promise(resolve => { setTimeout(() => resolve(), x); }); } async function getAccessToken(id, secret) { const params = new URLSearchParams(); params.append('client_id', id); params.append('client_secret', secret); let resp = await fetch('https://pdf-services-ue1.adobe.io/token', { method: 'POST', headers: { 'Content-Type':'application/x-www-form-urlencoded' }, body:params }); let data = await resp.json(); return data.access_token; } async function getUploadData(mediaType, token, clientId) { let body = { 'mediaType': mediaType }; body = JSON.stringify(body); let req = await fetch(REST_API+'assets', { method:'post', headers: { 'X-API-Key':clientId, 'Authorization':`Bearer ${token}`, 'Content-Type':'application/json' }, body: body }); let data = await req.json(); return data; } async function uploadFile(url, filePath, mediaType) { let stream = fs.createReadStream(filePath); let stats = fs.statSync(filePath); let fileSizeInBytes = stats.size; let upload = await fetch(url, { method:'PUT', redirect:'follow', headers: { 'Content-Type':mediaType, 'Content-Length':fileSizeInBytes }, duplex:'half', body:stream }); if(upload.status === 200) return; else { throw('Bad result, handle later.'); } } async function pollJob(url, token, clientId) { let status = null; let asset; while(status !== 'done') { let req = await fetch(url, { method:'GET', headers: { 'X-API-Key':clientId, 'Authorization':`Bearer ${token}`, } }); let res = await req.json(); status = res.status; if(status === 'done') { asset = res; } else { await delay(2000); } } return asset; } async function downloadFile(url, filePath) { let res = await fetch(url); const body = Readable.fromWeb(res.body); const download_write_stream = fs.createWriteStream(filePath); return await finished(body.pipe(download_write_stream)); } async function extractJob(asset, token, clientId) { let body = { 'assetID': asset.assetID } let resp = await fetch(REST_API + 'operation/extractpdf', { method: 'POST', headers: { 'Authorization':`Bearer ${token}`, 'X-API-KEY':clientId, 'Content-Type':'application/json' }, body:JSON.stringify(body) }); return resp.headers.get('location'); } let accessToken = await getAccessToken(CLIENT_ID, CLIENT_SECRET); console.log('Got our access token.'); let uploadedAsset = await getUploadData('application/pdf', accessToken, CLIENT_ID); await uploadFile(uploadedAsset.uploadUri, SOURCE_PDF, 'application/pdf'); console.log('Source PDF Uploaded.'); let job = await extractJob(uploadedAsset, accessToken, CLIENT_ID); console.log('Job created. Now to poll it.'); let result = await pollJob(job, accessToken, CLIENT_ID); console.log('Job is done.'); await downloadFile(result.content.downloadUri, 'extract.json'); console.log('All done.');

Ok, hy vọng là bạn vẫn đang đọc. Nói chung, tôi cố gắng tránh đăng các khối mã khổng lồ như vậy, nhưng nếu bạn tập trung vào các dòng ở cuối, bạn sẽ thấy tôi chỉ nhấn vào các chức năng tiện ích thực hiện những gì tôi đã mô tả trong quy trình trên. Xác thực, yêu cầu tải lên bản PDF, bắt đầu công việc, kiểm tra và tải xuống kết quả.


Một lưu ý tôi sẽ thêm. Trích xuất trả về một tệp zip chứa tập kết quả JSON và các bảng và hình ảnh tùy chọn. Một điều thú vị về API REST là tôi có thể truy cập trực tiếp vào JSON và chỉ cần lưu trữ nó.


Kết quả JSON có thể khá lớn. Đối với bản PDF nguồn của tôi (một tài liệu bảo mật Adobe cực kỳ nhàm chán) gồm ba trang, JSON kết quả dài 4560 dòng. Bạn có thể tìm thấy bản PDF nguồn của tôi tại đây và bản thô từ Trích xuất tại đây .


Thay vì đặt tất cả 4,5k dòng ở đây, hãy để tôi hiển thị một đoạn trích - hai phần tử duy nhất được API tìm thấy:


 { "Bounds": [ 44.62139892578125, 756.9429931640625, 245.0037841796875, 766.3184967041016 ], "Font": { "alt_family_name": "* Arial", "embedded": true, "encoding": "Identity-H", "family_name": "* Arial", "font_type": "CIDFontType0", "italic": false, "monospaced": false, "name": "*Arial-6539", "subset": false, "weight": 400 }, "HasClip": false, "Lang": "en", "Page": 0, "Path": "//Document/Sect/P", "Text": "Adobe Vendor Security Review Program White Paper ", "TextSize": 8.5, "attributes": { "SpaceAfter": 18 } }, { "Bounds": [ 0.0, 0.0, 630.0, 820.7799987792969 ], "ClipBounds": [ 548.72802734375, 739.1929931640625, 602.5444488525391, 820.7799987792969 ], "Page": 0, "Path": "//Document/Sect/Figure", "attributes": { "BBox": [ 548.9779999999737, 739.4429999999993, 587.61599999998, 790.920999999973 ], "Placement": "Block" } },

Trong mẫu ở trên, bạn có thể thấy phần tử đầu tiên là văn bản và chứa thuộc tính Text , trong khi phần tử thứ hai là hình. Đối với bản demo của mình, tôi chỉ cần sử dụng thuộc tính Text khi nó tồn tại. Hãy xem điều đó trong hành động.

Bước hai - Tạo bản tóm tắt

Tôi đã đề cập trước đó rằng API Diffbot khá đơn giản để sử dụng. Hãy để tôi chứng minh điều đó.


Đầu tiên, tôi sẽ thiết lập một số biến và đọc JSON tôi nhận được từ bước đầu tiên. Nói rõ hơn, tôi có thể làm mọi thứ trong một quy trình, nhưng thực sự chẳng ích gì khi chạy Extract nhiều lần. Điều thú vị là - tôi thực sự có thể thực hiện nhiều lệnh gọi trên kết quả.


Ví dụ: một tính năng thú vị khác mà Diffbot có là lấy các thực thể từ văn bản, tức là tài liệu đang nói về điều gì (con người, địa điểm, v.v.). Dù sao, đây là sự khởi đầu:


 /* In this file, we take the result from our Extract operation and pass it to Diffbot */ import 'dotenv/config'; import fs from 'fs'; const DIFFBOT_KEY = process.env.DIFFBOT_KEY; const SOURCE_JSON = './extract.json'; const data = JSON.parse(fs.readFileSync(SOURCE_JSON, 'utf8')); console.log(`Read in source data from ${SOURCE_JSON}.`);


Tiếp theo, tôi cần phân tích văn bản từ kết quả Trích xuất:


 let text = data.elements.reduce((text, el) => { if(el.Text) text += el.Text + '\n'; return text; },'');


Tiếp theo, tôi tạo một yêu cầu HTTP tới Diffbot. Kiểm tra tài liệu của họ để biết thêm thông tin.


 let fields = 'summary'; let url = `https://nl.diffbot.com/v1/?fields=${fields}&token=${DIFFBOT_KEY}`; let body = [{ content:text, lang:'en', format:'plain text' }]; console.log('Passing text to Diffbot.'); let req = await fetch(url, { method:'POST', body:JSON.stringify(body), headers: { 'Content-Type':'application/json' } }); let result = await req.json();


Và thế là xong. Bước cuối cùng, tôi chỉ cần xuất nó:


 console.log(`Summary of PDF:\n${result[0].summary}`);


Với nguồn PDF, kết quả cuối cùng là:


 Adobe has a vendor security review program that evaluates vendors that collect, store, process, transmit, or dispose of Adobe data outside of Adobe-controlled physical offices or data center locations. The VSR program includes requirements for vendors to follow when handling sensitive data and assigns a risk level score to vendors based on their compliance with Adobe standards. If a vendor fails the VSR program, Adobe holds discussions with the business owner to understand the details of the vendor's security practices and determine whether or not to continue working with them.


Bản PDF ba trang của tôi bây giờ chỉ là một đoạn văn đơn giản. Bạn có thể tưởng tượng điều này sẽ hữu ích như thế nào đối với các tổ chức có hàng triệu tài liệu. Kết hợp điều này với các dịch vụ khác (như tính năng thực thể mà tôi đã đề cập trước đó) và nó giúp làm việc với các thư viện lớn dễ dàng hơn nhiều.

Thử nó!

Nếu bạn muốn tự mình kiểm tra điều này, bạn có thể lấy tất cả mã tại đây: https://github.com/cfjedimaster/document-services-demos/tree/main/random_demos/extract_diffbot_summary . Như tôi đã nói, mọi thứ ở đây đều có thể được kiểm tra miễn phí, vì vậy hãy thử và cho tôi biết suy nghĩ của bạn trong phần bình luận bên dưới.