paint-brush
दस्तावेज़ सारांशों को स्वचालित करने के लिए AI और PDF सेवाओं का उपयोग कैसे करेंद्वारा@raymondcamden
5,330 रीडिंग
5,330 रीडिंग

दस्तावेज़ सारांशों को स्वचालित करने के लिए AI और PDF सेवाओं का उपयोग कैसे करें

द्वारा Raymond Camden8m2024/02/04
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

तो पाठ, फ़ॉन्ट, रंग, स्थिति, इत्यादि। यह छवियां और सारणीबद्ध डेटा भी ढूंढ सकता है जिससे कुछ बहुत शक्तिशाली उपयोग के मामले सामने आते हैं। (इसके अच्छे उदाहरण के लिए, मेरा ब्लॉग पोस्ट देखें जहां मैं खगोलीय डेटा एकत्र करने और रिपोर्ट बनाने के लिए कई वैज्ञानिक पत्रिकाओं को स्कैन करता हूं।) इस डेमो के लिए, हमें वस्तुतः केवल पाठ की आवश्यकता है। उसके लिए, मैं REST API का उपयोग करूँगा। उपलब्ध पीडीएफ सेवाओं के लगभग सभी पहलुओं के लिए "प्रवाह" हैं:
featured image - दस्तावेज़ सारांशों को स्वचालित करने के लिए AI और PDF सेवाओं का उपयोग कैसे करें
Raymond Camden HackerNoon profile picture


मैंने पहली बार डिफबॉट को 2021 में खोजा था जब मैंने एडोब डेवलपर ब्लॉग ( "नेचुरल लैंग्वेज प्रोसेसिंग, एडोब पीडीएफ एक्सट्रैक्ट, और डीप पीडीएफ इंटेलिजेंस" ) के लिए उनके एपीआई का डेमो बनाया था।


उस समय, मैं इस बात से प्रभावित हुआ कि डिफबॉट की एपीआई कितनी आसान थी और इसने कितनी जल्दी प्रतिक्रिया दी। मैंने कुछ समय से उनके एपीआई को नहीं देखा था, लेकिन कुछ दिन पहले, उन्होंने पाठ को सारांशित करने के लिए नए समर्थन की घोषणा की थी। मैंने सोचा कि Adobe PDF Extract API के साथ संयोजन करना बहुत अच्छी बात होगी। मुझे यही मिला।


सबसे पहले, यदि आप इसे स्वयं आज़माना चाहते हैं, तो आपको इसकी आवश्यकता होगी:


  • Adobe PDF सेवाएँ क्रेडेंशियल । ये मुफ़्त हैं, और आपको प्रति माह 500 लेनदेन मुफ़्त मिलते हैं। जो लोग नहीं जानते, उनके लिए मैं Adobe के लिए काम करता हूं और यह उन उत्पादों में से एक है जिन्हें मैं कवर करता हूं।


  • डिफबॉट क्रेडेंशियल्स । वे दो सप्ताह का निःशुल्क परीक्षण प्रदान करते हैं लेकिन कोई निःशुल्क स्तर नहीं। ऐसा कहा जा रहा है कि, सामान बनाते समय मुझे कई बार उन तक पहुंचना पड़ा है, और उन्होंने मेरे लिए वास्तव में बहुत अच्छा समर्थन प्रदान किया है, इसलिए मुझे निश्चित रूप से लगता है कि वे आपके जांचने लायक हैं।


ठीक है, आइए देखें कि सारांश प्रवाह कैसे काम कर सकता है।

चरण एक - पाठ निकालें

एक्स्ट्रैक्ट एपीआई (क्षमा करें, "एडोब पीडीएफ एक्स्ट्रैक्ट एपीआई", रुकें, यह मेरा ब्लॉग है, मैं चीजों को छोटा कर सकता हूं!) काफी शक्तिशाली है। यह दस्तावेज़ में प्रत्येक तत्व विवरण को सही ढंग से ढूंढने के लिए पीडीएफ को बुद्धिमानी से पार्स करने के लिए एआई का उपयोग करता है।


तो पाठ, फ़ॉन्ट, रंग, स्थिति, इत्यादि। यह छवियां और सारणीबद्ध डेटा भी ढूंढ सकता है जिससे कुछ बहुत शक्तिशाली उपयोग के मामले सामने आते हैं। (इसके अच्छे उदाहरण के लिए, मेरा ब्लॉग पोस्ट देखें जहां मैं खगोलीय डेटा एकत्र करने और रिपोर्ट बनाने के लिए कई वैज्ञानिक पत्रिकाओं को स्कैन करता हूं।)


इस डेमो के लिए, हमें वस्तुतः केवल पाठ की आवश्यकता है। उसके लिए, मैं REST API का उपयोग करूँगा। उपलब्ध पीडीएफ सेवाओं के लगभग सभी पहलुओं के लिए "प्रवाह" हैं:


  • एक्सेस टोकन के लिए एक्सचेंज क्रेडेंशियल


  • इनपुट के लिए एक फ़ाइल अपलोड करने के लिए कहें (इस मामले में, एक पीडीएफ निकाला जाएगा)


  • दस्तावेज़ अपलोड करें


  • नौकरी बंद करो


  • पूरा करने के लिए मतदान


  • बिट्स डाउनलोड करें


ध्यान दें कि ऐसे SDK भी हैं जिनका आप उपयोग कर सकते हैं, लेकिन मुझे हमारे REST API इतने सरल लगे हैं कि मैं सीधे अंतिम बिंदु पर पहुंच जाता हूं। यहां वह स्क्रिप्ट है जो मैंने एक्स्ट्रैक्ट प्रक्रिया को करने के लिए लिखी थी। यह मूल रूप से वह सब कुछ है जो मैंने ऊपर कहा और अपने स्थानीय फाइल सिस्टम में एक स्रोत पीडीएफ की ओर इशारा किया।


 /* 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.');

ठीक है, उम्मीद है, आप अभी भी पढ़ रहे हैं। सामान्य तौर पर, मैं इस तरह के कोड के विशाल ब्लॉक पोस्ट करने से बचने की कोशिश करता हूं, लेकिन यदि आप अंत में लाइनों पर ध्यान केंद्रित करते हैं, तो आप देखेंगे कि मैं केवल उपयोगिता कार्यों को हिट कर रहा हूं जो वही करते हैं जो मैंने ऊपर प्रवाह में वर्णित किया है। प्रमाणित करें, पीडीएफ अपलोड करने के लिए कहें, काम शुरू करें, उसकी जांच करें और परिणाम डाउनलोड करें।


एक नोट मैं जोड़ूंगा. एक्सट्रैक्ट एक ज़िप फ़ाइल लौटाता है जिसमें JSON परिणाम सेट होता है, और वैकल्पिक रूप से, टेबल और छवियां होती हैं। REST API के बारे में एक अच्छी बात यह है कि मैं सीधे JSON तक पहुंच सकता हूं और इसे संग्रहीत कर सकता हूं।


JSON परिणाम काफी बड़ा हो सकता है. तीन पृष्ठों के मेरे स्रोत पीडीएफ (एक अविश्वसनीय रूप से उबाऊ एडोब सुरक्षा दस्तावेज़) के लिए, परिणामी JSON 4560 लाइन लंबा है। आप मेरा स्रोत पीडीएफ यहां पा सकते हैं, और एक्सट्रैक्ट से कच्चा आउटपुट यहां पा सकते हैं।


यहां सभी 4.5k लाइनें डालने के बजाय, मैं एक स्निपेट दिखाता हूं - एपीआई द्वारा पाए गए दो अद्वितीय तत्व:


 { "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" } },

उपरोक्त नमूने में, आप देख सकते हैं कि पहला तत्व टेक्स्टुअल है और इसमें Text प्रॉपर्टी है, जबकि दूसरा एक आकृति है। अपने डेमो के लिए, मुझे बस Text प्रॉपर्टी के मौजूद होने पर उसका उपयोग करना होगा। आइए इसे क्रियान्वित करके देखें।

चरण दो - सारांश बनाएँ

मैंने पहले उल्लेख किया था कि डिफबॉट एपीआई का उपयोग करना काफी सरल था। मुझे वह प्रदर्शित करने दीजिए.


सबसे पहले, मैं कुछ वेरिएबल सेट करूँगा और पहले चरण से प्राप्त JSON को पढ़ूँगा। स्पष्ट होने के लिए, मैं एक ही प्रक्रिया में सब कुछ कर सकता हूं, लेकिन एक्सट्रैक्ट को एक से अधिक बार चलाने का वास्तव में कोई मतलब नहीं है। अच्छी बात यह है कि मैं वास्तव में परिणाम पर एकाधिक कॉल कर सकता हूं।


उदाहरण के तौर पर, डिफबॉट की एक अन्य अच्छी सुविधा पाठ से इकाइयाँ प्राप्त करना है, अर्थात, दस्तावेज़ किस बारे में बात कर रहा है (लोग, स्थान, आदि)। वैसे भी, यहाँ शुरुआत है:


 /* 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}.`);


इसके बाद, मुझे एक्सट्रेक्ट परिणाम से टेक्स्ट को पार्स करना होगा:


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


इसके बाद, मैं डिफबॉट के लिए एक HTTP अनुरोध तैयार करता हूं। अधिक जानकारी के लिए उनके दस्तावेज़ जाँचें।


 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();


और बस। अंतिम चरण के रूप में, मैं बस इसे आउटपुट करता हूं:


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


स्रोत पीडीएफ को देखते हुए, अंतिम परिणाम है:


 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.


मेरी तीन पेज की पीडीएफ अब एक साधारण पैराग्राफ है। आप कल्पना कर सकते हैं कि लाखों दस्तावेजों वाले संगठनों के लिए यह कितना उपयोगी होगा। इसे अन्य सेवाओं के साथ संयोजित करें (जैसे कि इकाई सुविधा जिसका मैंने पहले उल्लेख किया था), और यह बड़े पुस्तकालयों के साथ काम करना बहुत आसान बना देता है।

इसे अजमाएं!

यदि आप इसे स्वयं जांचना चाहते हैं, तो आप यहां सभी कोड प्राप्त कर सकते हैं: https://github.com/cfjedimaster/document-services-demos/tree/main/random_demos/extract_diffbot_summary । जैसा कि मैंने कहा, यहां हर चीज़ का परीक्षण मुफ़्त में किया जा सकता है, इसलिए इसे आज़माएं, और मुझे नीचे टिप्पणी में बताएं कि आप क्या सोचते हैं।