NLP کے ساتھ ایک بایومیڈیکل نالج گراف بنائیں

ماخذ نوڈ: 1401511

میں نے پہلے ہی دکھایا ہے کہ کس طرح کرنا ہے۔ ویکیپیڈیا کے صفحے سے علم کا گراف بنائیں. تاہم، چونکہ پوسٹ کو بہت زیادہ توجہ ملی، اس لیے میں نے دوسرے ڈومینز کو تلاش کرنے کا فیصلہ کیا ہے جہاں علمی گراف بنانے کے لیے NLP تکنیک کا استعمال کرنا معنی خیز ہے۔ میری رائے میں، بایومیڈیکل فیلڈ ایک اہم مثال ہے جہاں ڈیٹا کو گراف کے طور پر پیش کرنا سمجھ میں آتا ہے کیونکہ آپ اکثر جینز، بیماریوں، ادویات، پروٹین وغیرہ کے درمیان تعاملات اور تعلقات کا تجزیہ کرتے رہتے ہیں۔

مثال کے ذیلی گراف جو دیگر بائیو میڈیکل تصورات سے ascorbic ایسڈ کے تعلقات کو ظاہر کرتا ہے۔ مصنف کی طرف سے تصویر.

مندرجہ بالا تصور میں، ہمارے پاس ascorbic ایسڈ ہے، جسے وٹامن C بھی کہا جاتا ہے، اور اس کے کچھ دوسرے تصورات سے تعلقات ہیں۔ مثال کے طور پر، یہ ظاہر کرتا ہے کہ وٹامن سی کو دائمی گیسٹرائٹس کے علاج کے لیے استعمال کیا جا سکتا ہے۔

اب، آپ کے پاس ڈومین ماہرین کی ایک ٹیم آپ کے لیے ادویات، بیماریوں اور دیگر حیاتیاتی تصورات کے درمیان ان تمام رابطوں کا نقشہ بنا سکتی ہے۔ لیکن، بدقسمتی سے، ہم میں سے بہت سے لوگ ہمارے لیے کام کرنے کے لیے طبی ڈاکٹروں کی ٹیم کی خدمات حاصل کرنے کے متحمل نہیں ہو سکتے۔ اس صورت میں، ہم ان رشتوں کو خود بخود نکالنے کے لیے NLP تکنیکوں کا سہارا لے سکتے ہیں۔ اچھی بات یہ ہے کہ ہم وہاں موجود تمام تحقیقی مقالوں کو پڑھنے کے لیے NLP پائپ لائن کا استعمال کر سکتے ہیں، اور بری بات یہ ہے کہ تمام حاصل کردہ نتائج بہترین نہیں ہوں گے۔ تاہم، یہ دیکھتے ہوئے کہ میرے پاس سائنس دانوں کی ٹیم دستی طور پر تعلقات کو نکالنے کے لیے تیار نہیں ہے، میں خود کا ایک بایومیڈیکل علمی گراف بنانے کے لیے NLP تکنیکوں کا سہارا لوں گا۔

میں اس بلاگ پوسٹ میں ایک تحقیقی مقالہ استعمال کروں گا تاکہ آپ کو بایومیڈیکل نالج گراف بنانے کے لیے درکار تمام مراحل سے آگاہ کیا جا سکے۔ جلد کی تخلیق نو اور بالوں کی نشوونما کی ٹشو انجینئرنگ.

کاغذ کی طرف سے لکھا گیا تھا محمد رضا احمدی. مضمون کا پی ڈی ایف ورژن CC0 1.0 لائسنس کے تحت دستیاب ہے۔ علم کا گراف بنانے کے لیے ہم درج ذیل مراحل سے گزریں گے۔

  • OCR کے ساتھ پی ڈی ایف دستاویز پڑھنا
  • ٹیکسٹ پری پروسیسنگ
  • بائیو میڈیکل تصور کی شناخت اور لنکنگ
  • رشتہ نکالنا
  • بیرونی ڈیٹا بیس کی افزودگی

اس پوسٹ کے اختتام تک، آپ درج ذیل اسکیما کے ساتھ ایک گراف بنائیں گے۔

بائیو میڈیکل گراف سکیما۔ مصنف کی طرف سے تصویر.

ہم اپنے گراف کو ذخیرہ کرنے کے لیے Neo4j، ایک گراف ڈیٹا بیس کا استعمال کریں گے جس میں لیبل شدہ پراپرٹی گراف ماڈل شامل ہے۔ ہر مضمون میں ایک یا زیادہ مصنفین ہو سکتے ہیں۔ ہم مضمون کے مواد کو جملوں میں تقسیم کریں گے اور طبی اداروں اور ان کے تعلقات دونوں کو نکالنے کے لیے NLP کا استعمال کریں گے۔ یہ تھوڑا سا متضاد ہوسکتا ہے کہ ہم اداروں کے درمیان تعلقات کو رشتوں کی بجائے انٹرمیڈیٹ نوڈس کے طور پر محفوظ کریں گے۔ اس فیصلے کے پیچھے اہم عنصر یہ ہے کہ ہم اس سورس ٹیکسٹ کا آڈٹ ٹریل حاصل کرنا چاہتے ہیں جہاں سے رشتہ نکالا گیا تھا۔ لیبل والے پراپرٹی گراف ماڈل کے ساتھ، آپ کسی دوسرے رشتے کی طرف اشارہ کرنے والا رشتہ نہیں رکھ سکتے۔ اس وجہ سے، ہم طبی تصورات کے درمیان تعلق کو ایک انٹرمیڈیٹ نوڈ میں ری ایکٹر کرتے ہیں۔ یہ ڈومین کے ماہر کو یہ جانچنے کی بھی اجازت دے گا کہ آیا کوئی رشتہ صحیح طریقے سے نکالا گیا تھا یا نہیں۔

راستے میں، میں ذخیرہ شدہ معلومات کو تلاش کرنے اور تجزیہ کرنے کے لیے تعمیر شدہ گراف کو استعمال کرنے کی ایپلی کیشنز کا بھی مظاہرہ کروں گا۔

چلو اسی میں ڈوبکی!

اگر یہ گہرائی میں تعلیمی مواد آپ کے لیے مفید ہے، ہماری AI ریسرچ میلنگ لسٹ کو سبسکرائب کریں۔ جب ہم نیا مواد جاری کرتے ہیں تو متنبہ کیا جائے۔

OCR کے ساتھ پی ڈی ایف دستاویز پڑھنا

جیسا کہ ذکر کیا گیا ہے، تحقیقی مقالے کا پی ڈی ایف ورژن CC0 1.0 لائسنس کے تحت عوام کے لیے قابل رسائی ہے، جس کا مطلب ہے کہ ہم اسے Python کے ساتھ آسانی سے ڈاؤن لوڈ کر سکتے ہیں۔ ہم استعمال کریں گے pytesseract پی ڈی ایف سے متن نکالنے کے لیے لائبریری۔ جہاں تک میں جانتا ہوں، pytesseract لائبریری OCR کے لیے زیادہ مقبول لائبریریوں میں سے ایک ہے۔ اگر آپ کوڈ کی مثالوں کے ساتھ پیروی کرنا چاہتے ہیں، تو میں نے ایک تیار کیا ہے۔ گوگل کولاب نوٹ بک، لہذا آپ کو خود کوڈ کو کاپی پیسٹ کرنے کی ضرورت نہیں ہے۔

import requests
import pdf2image
import pytesseract pdf = requests.get('https://arxiv.org/pdf/2110.03526.pdf')
doc = pdf2image.convert_from_bytes(pdf.content) # Get the article text
article = []
for page_number, page_data in enumerate(doc): txt = pytesseract.image_to_string(page_data).encode("utf-8") # Sixth page are only references if page_number < 6: article.append(txt.decode("utf-8"))
article_txt = " ".join(article)

ٹیکسٹ پری پروسیسنگ

اب جبکہ ہمارے پاس مضمون کا مواد دستیاب ہے، ہم آگے بڑھیں گے اور متن سے سیکشن کے عنوانات اور اعداد و شمار کی تفصیل کو ہٹا دیں گے۔ اگلا، ہم متن کو جملوں میں تقسیم کریں گے۔

import nltk
nltk.download('punkt') def clean_text(text): """Remove section titles and figure descriptions from text""" clean = "n".join([row for row in text.split("n") if (len(row.split(" "))) > 3 and not (row.startswith("(a)")) and not row.startswith("Figure")]) return clean text = article_txt.split("INTRODUCTION")[1]
ctext = clean_text(text)
sentences = nltk.tokenize.sent_tokenize(ctext)

بایومیڈیکل نامی ہستی کو جوڑنا

اب آتا ہے دلچسپ حصہ۔ ان لوگوں کے لیے جو NLP میں نئے ہیں اور نام کی ہستی کی شناخت اور لنک کرنے کے لیے، آئیے کچھ بنیادی باتوں سے شروعات کرتے ہیں۔ متن میں متعلقہ اداروں یا تصورات کا پتہ لگانے کے لیے نام شدہ ہستی کی شناخت کی تکنیکوں کا استعمال کیا جاتا ہے۔ مثال کے طور پر، بائیو میڈیکل ڈومین میں، ہم متن میں مختلف جینز، ادویات، بیماریوں اور دیگر تصورات کی شناخت کرنا چاہتے ہیں۔

بائیو میڈیکل تصورات نکالنا۔ مصنف کی طرف سے تصویر.

اس مثال میں، این ایل پی ماڈل نے متن میں جین، بیماریوں، ادویات، پرجاتیوں، تغیرات، اور راستوں کی نشاندہی کی۔ جیسا کہ ذکر کیا گیا ہے، اس عمل کو نام ہستی کی شناخت کہا جاتا ہے۔ نامزد ہستی کی شناخت میں ایک اپ گریڈ نام نہاد نامزد ہستی کو جوڑنا ہے۔ نام کی ہستی کو جوڑنے والی تکنیک متن میں متعلقہ تصورات کا پتہ لگاتی ہے اور انہیں ہدف کے علم کی بنیاد پر نقشہ بنانے کی کوشش کرتی ہے۔ بایومیڈیکل ڈومین میں، کچھ ہدف علمی بنیادیں ہیں:

ہم طبی اداروں کو ٹارگٹ نالج بیس سے کیوں جوڑنا چاہیں گے؟ بنیادی وجہ یہ ہے کہ یہ ہمیں ہستی کے ابہام سے نمٹنے میں مدد کرتا ہے۔ مثال کے طور پر، ہم گراف میں ایسکوربک ایسڈ اور وٹامن سی کی نمائندگی کرنے والے الگ الگ ادارے نہیں چاہتے ہیں کیونکہ ڈومین کے ماہرین آپ کو بتا سکتے ہیں کہ وہ ایک ہی چیز ہیں۔ ثانوی وجہ یہ ہے کہ ٹارگٹ نالج بیس میں تصورات کی نقشہ سازی کرکے، ہم ہدف علم کی بنیاد سے میپ کیے گئے تصورات کے بارے میں معلومات حاصل کرکے اپنے گراف ماڈل کو بہتر بنا سکتے ہیں۔ اگر ہم ascorbic ایسڈ کی مثال دوبارہ استعمال کرتے ہیں، تو ہم آسانی سے CHEBI ڈیٹا بیس سے اضافی معلومات حاصل کر سکتے ہیں اگر ہمیں پہلے سے ہی معلوم ہو CHEBI آئی ڈی.

CHEBI کی ویب سائٹ پر ascorbic acid کے بارے میں افزودگی کا ڈیٹا دستیاب ہے۔ ویب سائٹ پر موجود تمام مواد کے تحت دستیاب ہے۔ CC BY 4.0 لائسنس۔ مصنف کی طرف سے تصویر.

میں کچھ عرصے سے ایک مہذب اوپن سورس پری ٹرینڈ بایومیڈیکل نامی ہستی کو جوڑنے کی تلاش کر رہا ہوں۔ بہت سے NLP ماڈل طبی تصورات جیسے جین یا بیماریوں کے صرف ایک مخصوص ذیلی سیٹ کو نکالنے پر توجہ مرکوز کرتے ہیں۔ ایسا ماڈل تلاش کرنا بھی نایاب ہے جو زیادہ تر طبی تصورات کا پتہ لگاتا ہو اور انہیں ٹارگٹ نالج بیس سے جوڑتا ہو۔ خوش قسمتی سے میں نے ٹھوکر کھائی ہے۔ برن[1]، ایک عصبی بایومیڈیکل ہستی کی شناخت اور ملٹی ٹائپ نارملائزیشن ٹول۔ اگر میں صحیح طور پر سمجھتا ہوں، تو یہ بائیو برٹ ماڈل ہے جس میں مختلف ناموں والی ہستی کو جوڑنے والے ماڈلز کو بایومیڈیکل ٹارگٹ نالج بیسز پر تصورات کی نقشہ سازی کے لیے مربوط کیا گیا ہے۔ نہ صرف یہ، بلکہ وہ ایک مفت REST اینڈ پوائنٹ بھی فراہم کرتے ہیں، لہذا ہمیں انحصار اور ماڈل کو کام کرنے کے لیے سر درد سے نمٹنے کی ضرورت نہیں ہے۔ میں نے اوپر استعمال کیا ہوا بایومیڈیکل نامی ہستی کی شناخت کا تصور BERN ماڈل کا استعمال کرتے ہوئے بنایا گیا تھا، لہذا ہم جانتے ہیں کہ یہ متن میں جینز، بیماریوں، ادویات، انواع، تغیرات، اور راستوں کا پتہ لگاتا ہے۔

بدقسمتی سے، BERN ماڈل تمام تصورات کو ٹارگٹ نالج بیس ids تفویض نہیں کرتا ہے۔ لہذا میں نے ایک اسکرپٹ تیار کیا ہے جو پہلے نظر آتا ہے کہ آیا کسی تصور کے لیے ایک الگ آئی ڈی دی گئی ہے، اور اگر یہ نہیں ہے، تو یہ ہستی کا نام بطور ID استعمال کرے گی۔ ہم جملوں کے متن کے sha256 کی بھی گنتی کریں گے تاکہ بعد میں جب ہم رشتہ نکالیں گے تو مخصوص جملوں کی آسانی سے شناخت کر سکیں۔

import hashlib def query_raw(text, url="https://bern.korea.ac.kr/plain"): """Biomedical entity linking API""" return requests.post(url, data={'sample_text': text}).json() entity_list = []
# The last sentence is invalid
for s in sentences[:-1]: entity_list.append(query_raw(s)) parsed_entities = []
for entities in entity_list: e = [] # If there are not entities in the text if not entities.get('denotations'): parsed_entities.append({'text':entities['text'], 'text_sha256': hashlib.sha256(entities['text'].encode('utf-8')).hexdigest()}) continue for entity in entities['denotations']: other_ids = [id for id in entity['id'] if not id.startswith("BERN")] entity_type = entity['obj'] entity_name = entities['text'][entity['span']['begin']:entity['span']['end']] try: entity_id = [id for id in entity['id'] if id.startswith("BERN")][0] except IndexError: entity_id = entity_name e.append({'entity_id': entity_id, 'other_ids': other_ids, 'entity_type': entity_type, 'entity': entity_name}) parsed_entities.append({'entities':e, 'text':entities['text'], 'text_sha256': hashlib.sha256(entities['text'].encode('utf-8')).hexdigest()})

میں نے نامزد کردہ ہستی کو جوڑنے کے نتائج کا معائنہ کیا ہے، اور جیسا کہ توقع ہے، یہ کامل نہیں ہے۔ مثال کے طور پر، یہ طبی تصور کے طور پر سٹیم سیلز کی شناخت نہیں کرتا ہے۔ دوسری طرف، اس نے "دل، دماغ، اعصاب اور گردے" کے نام سے ایک واحد وجود کا پتہ لگایا۔ تاہم، BERN اب بھی بہترین اوپن سورس بائیو میڈیکل ماڈل ہے جو مجھے اپنی تحقیقات کے دوران مل سکا۔

علم کا گراف بنائیں

رشتہ نکالنے کی تکنیکوں کو دیکھنے سے پہلے، ہم صرف اداروں کا استعمال کرتے ہوئے ایک بایومیڈیکل علم کا گراف بنائیں گے اور ممکنہ ایپلی کیشنز کا جائزہ لیں گے۔ جیسا کہ ذکر کیا گیا ہے، میں نے ایک تیار کیا ہے گوگل کولاب نوٹ بک جسے آپ اس پوسٹ میں کوڈ کی مثالوں پر عمل کرنے کے لیے استعمال کر سکتے ہیں۔ اپنے گراف کو ذخیرہ کرنے کے لیے، ہم Neo4j استعمال کریں گے۔ آپ کو مقامی Neo4j ماحول کی تیاری سے نمٹنے کی ضرورت نہیں ہے۔ اس کے بجائے، آپ مفت Neo4j Sandbox مثال استعمال کر سکتے ہیں۔

Neo4j سینڈ باکس

شروع کرو سینڈ باکس میں خالی پروجیکٹ اور کنکشن کی تفصیلات Colab نوٹ بک میں کاپی کریں۔

Neo4j سینڈ باکس کنکشن کی تفصیلات۔ مصنف کی طرف سے تصویر.

اب آپ آگے بڑھ سکتے ہیں اور نوٹ بک میں Neo4j کنکشن تیار کر سکتے ہیں۔

from neo4j import GraphDatabase
import pandas as pd host = 'bolt://3.236.182.55:7687'
user = 'neo4j'
password = 'hydrometer-ditches-windings'
driver = GraphDatabase.driver(host,auth=(user, password)) def neo4j_query(query, params=None): with driver.session() as session: result = session.run(query, params) return pd.DataFrame([r.values() for r in result], columns=result.keys())

ہم مصنف اور مضمون کو گراف میں درآمد کرکے شروع کریں گے۔ مضمون نوڈ میں صرف عنوان ہوگا۔

author = article_txt.split("n")[0]
title = " ".join(article_txt.split("n")[2:4]) neo4j_query("""
MERGE (a:Author{name:$author})
MERGE (b:Article{title:$title})
MERGE (a)-[:WROTE]->(b)
""", {'title':title, 'author':author})

اگر آپ Neo4j براؤزر کھولتے ہیں، تو آپ کو درج ذیل گراف نظر آنا چاہیے۔

مصنف کی طرف سے تصویر.

آپ درج ذیل سائفر استفسار پر عمل کر کے جملے اور ذکر کردہ اداروں کو درآمد کر سکتے ہیں:

neo4j_query("""
MATCH (a:Article)
UNWIND $data as row
MERGE (s:Sentence{id:row.text_sha256})
SET s.text = row.text
MERGE (a)-[:HAS_SENTENCE]->(s)
WITH s, row.entities as entities
UNWIND entities as entity
MERGE (e:Entity{id:entity.entity_id})
ON CREATE SET e.other_ids = entity.other_ids, e.name = entity.entity, e.type = entity.entity_type
MERGE (s)-[m:MENTIONS]->(e)
ON CREATE SET m.count = 1
ON MATCH SET m.count = m.count + 1
""", {'data': parsed_entities})

تعمیر شدہ گراف کا معائنہ کرنے کے لیے آپ درج ذیل سائفر استفسار پر عمل کر سکتے ہیں:

MATCH p=(a:Article)-[:HAS_SENTENCE]->()-[:MENTIONS]->(e:Entity)
RETURN p LIMIT 25

اگر آپ نے صحیح طریقے سے ڈیٹا درآمد کیا ہے، تو آپ کو اسی طرح کا تصور دیکھنا چاہیے۔

ایک گراف کے طور پر ذخیرہ شدہ ہستی نکالنا۔ مصنف کی طرف سے تصویر.

نالج گراف ایپلی کیشنز

یہاں تک کہ رشتہ نکالنے کے بہاؤ کے بغیر بھی، ہمارے گراف کے لیے پہلے سے ہی کچھ استعمال کے کیسز موجود ہیں۔

سرچ انجن

ہم اپنے گراف کو سرچ انجن کے طور پر استعمال کر سکتے ہیں۔ مثال کے طور پر، آپ درج ذیل سائفر استفسار کو ایسے جملوں یا مضامین کو تلاش کرنے کے لیے استعمال کر سکتے ہیں جن میں کسی مخصوص طبی ہستی کا ذکر ہو۔

MATCH (e:Entity)<-[:MENTIONS]-(s:Sentence)
WHERE e.name = "autoimmune diseases"
RETURN s.text as result

نتائج کی نمائش

مصنف کی طرف سے تصویر.

شریک وقوعہ کا تجزیہ

دوسرا آپشن شریک واقعہ تجزیہ ہے۔ آپ طبی اداروں کے درمیان ہم آہنگی کی وضاحت کر سکتے ہیں اگر وہ ایک ہی جملے یا مضمون میں ظاہر ہوں۔ مجھے ایک مضمون ملا ہے

ایک MeSH شریک واقعہ نیٹ ورک میں لنک کی پیشن گوئی: ابتدائی نتائج - پب میڈ

آپ مندرجہ ذیل سائفر استفسار کا استعمال ان اداروں کو تلاش کرنے کے لیے کر سکتے ہیں جو اکثر ایک ہی جملے میں ساتھ ہوتے ہیں۔

MATCH (e1:Entity)<-[:MENTIONS]-()-[:MENTIONS]->(e2:Entity)
MATCH (e1:Entity)<-[:MENTIONS]-()-[:MENTIONS]->(e2:Entity)
WHERE id(e1) < id(e2)
RETURN e1.name as entity1, e2.name as entity2, count(*) as cooccurrence
ORDER BY cooccurrence
DESC LIMIT 3

نتائج کی نمائش

ہستی 1 ہستی 2 ہم آہنگی
جلد کی بیماریوں ذیابیطس کے السر 2
دائمی زخم ذیابیطس کے السر 2
جلد کی بیماریوں دائمی زخم 2

ظاہر ہے، اگر ہم ہزاروں یا اس سے زیادہ مضامین کا تجزیہ کریں تو نتائج بہتر ہوں گے۔

مصنف کی مہارت کا معائنہ کریں۔

آپ اس گراف کا استعمال مصنف کی مہارت کو تلاش کرنے کے لیے ان طبی اداروں کی جانچ کر کے بھی کر سکتے ہیں جن کے بارے میں وہ اکثر لکھتے ہیں۔ اس معلومات کے ساتھ، آپ مستقبل کے تعاون کا مشورہ بھی دے سکتے ہیں۔

ہمارے واحد مصنف نے تحقیقی مقالے میں کن طبی اداروں کا ذکر کیا ہے اس کا معائنہ کرنے کے لیے درج ذیل سائفر استفسار پر عمل کریں۔

MATCH (a:Author)-[:WROTE]->()-[:HAS_SENTENCE]->()-[:MENTIONS]->(e:Entity)
RETURN a.name as author, e.name as entity,
MATCH (a:Author)-[:WROTE]->()-[:HAS_SENTENCE]->()-[:MENTIONS]->(e:Entity)
RETURN a.name as author, e.name as entity, count(*) as count
ORDER BY count DESC
LIMIT 5

نتائج کی نمائش

مصنف ہستی شمار
محمد رضا احمدی کولگن 9
محمد رضا احمدی جل 4
محمد رضا احمدی جلد کی بیماریوں 4
محمد رضا احمدی کولیجینیز انزائمز 2
محمد رضا احمدی Epidermolysis bullosa 2

رشتہ نکالنا

اب ہم طبی تصورات کے درمیان تعلقات کو نکالنے کی کوشش کریں گے۔ میرے تجربے سے، رشتہ نکالنا کم از کم ایک ترتیب کا حکم ہے جو نامزد ہستی نکالنے سے زیادہ سخت ہے۔ اگر آپ کو نامزد ہستی کے لنکنگ کے ساتھ کامل نتائج کی توقع نہیں کرنی چاہئے، تو آپ یقینی طور پر رشتہ نکالنے کی تکنیک میں کچھ غلطیوں کی توقع کر سکتے ہیں۔

میں دستیاب بایومیڈیکل ریلیشن ایکسٹرکشن ماڈلز تلاش کر رہا ہوں لیکن مجھے کچھ بھی نہیں ملا جو باکس سے باہر کام کرتا ہو یا اسے ٹھیک ٹیوننگ کی ضرورت نہ ہو۔ ایسا لگتا ہے کہ رشتہ نکالنے کا میدان بہت اہم ہے، اور امید ہے کہ ہم مستقبل میں اس پر مزید توجہ دیکھیں گے۔ بدقسمتی سے، میں NLP ماہر نہیں ہوں، اس لیے میں نے اپنے ماڈل کو ٹھیک کرنے سے گریز کیا۔ اس کے بجائے، ہم کاغذ کی بنیاد پر زیرو شاٹ ریلیشن ایکسٹریکٹر استعمال کریں گے۔ FewRel کی صفر شاٹ کی حد کو تلاش کرنا[3]۔ اگرچہ میں اس ماڈل کو پروڈکشن میں ڈالنے کی سفارش نہیں کروں گا، لیکن یہ ایک سادہ مظاہرہ کے لیے کافی ہے۔ ماڈل پر دستیاب ہے۔ گلے لگانے والا چہرہ، لہذا ہمیں تربیت یا ماڈل ترتیب دینے سے نمٹنے کی ضرورت نہیں ہے۔

from transformers import AutoTokenizer
from zero_shot_re import RelTaggerModel, RelationExtractor model = RelTaggerModel.from_pretrained("fractalego/fewrel-zero-shot")
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
relations = ['associated', 'interacts']
extractor = RelationExtractor(model, tokenizer, relations)

زیرو شاٹ ریلیشن ایکسٹریکٹر کے ساتھ، آپ اس بات کی وضاحت کر سکتے ہیں کہ آپ کن رشتوں کا پتہ لگانا چاہیں گے۔ اس مثال میں، میں نے استعمال کیا ہے منسلک اور انٹرایکٹو تعلقات میں نے تعلقات کی مزید مخصوص قسمیں بھی آزمائی ہیں جیسے کہ سلوک، وجوہات اور دیگر، لیکن نتائج اچھے نہیں تھے۔

اس ماڈل کے ساتھ، آپ کو یہ بتانا ہوگا کہ آپ کن کن اداروں کے درمیان تعلقات کا پتہ لگانا چاہیں گے۔ ہم رشتہ نکالنے کے عمل میں ان پٹ کے طور پر منسلک ہونے والی نامزد ہستی کے نتائج کا استعمال کریں گے۔ سب سے پہلے، ہمیں وہ تمام جملے ملتے ہیں جہاں دو یا دو سے زیادہ ہستیوں کا تذکرہ ہوتا ہے اور پھر کسی بھی کنکشن کو نکالنے کے لیے انہیں ریلیشن ایکسٹرکشن ماڈل کے ذریعے چلاتے ہیں۔ میں نے 0.85 کی حد کی قدر کی بھی وضاحت کی ہے، اس کا مطلب ہے کہ اگر کوئی ماڈل 0.85 سے کم امکان والی ہستیوں کے درمیان تعلق کی پیش گوئی کرتا ہے، تو ہم اس پیشین گوئی کو نظر انداز کر دیں گے۔

import itertools
# Candidate sentence where there is more than a single entity present
candidates = [s for s in parsed_entities if (s.get('entities')) and (len(s['entities']) &gt; 1)]
predicted_rels = []
for c in candidates: combinations = itertools.combinations([{'name':x['entity'], 'id':x['entity_id']} for x in c['entities']], 2) for combination in list(combinations): try: ranked_rels = extractor.rank(text=c['text'].replace(",", " "), head=combination[0]['name'], tail=combination[1]['name']) # Define threshold for the most probable relation if ranked_rels[0][1] &gt; 0.85: predicted_rels.append({'head': combination[0]['id'], 'tail': combination[1]['id'], 'type':ranked_rels[0][0], 'source': c['text_sha256']}) except: pass # Store relations to Neo4j
neo4j_query("""
UNWIND $data as row
MATCH (source:Entity {id: row.head})
MATCH (target:Entity {id: row.tail})
MATCH (text:Sentence {id: row.source})
MERGE (source)-[:REL]-&gt;(r:Relation {type: row.type})-[:REL]-&gt;(target)
MERGE (text)-[:MENTIONS]-&gt;(r)
""", {'data': predicted_rels})

ہم رشتوں کے ساتھ ساتھ ماخذ متن کو گراف میں اس رشتے کو نکالنے کے لیے استعمال کرتے ہیں۔

ایک گراف میں محفوظ کیے گئے تعلقات۔ مصنف کی طرف سے تصویر.

آپ درج ذیل سائفر استفسار کے ساتھ اداروں اور ماخذ کے متن کے درمیان نکالے گئے تعلقات کی جانچ کر سکتے ہیں:

MATCH (s:Entity)-[:REL]->(r:Relation)-[:REL]->(t:Entity), (r)<-[:MENTIONS]-(st:Sentence)
RETURN s.name as source_entity, t.name as target_entity, r.type as type, st.text as source_text

نتائج کی نمائش

مصنف کی طرف سے تصویر.

جیسا کہ ذکر کیا گیا ہے، میں نے تعلقات کو نکالنے کے لیے جو NLP ماڈل استعمال کیا ہے وہ کامل نہیں ہے، اور چونکہ میں میڈیکل ڈاکٹر نہیں ہوں، اس لیے مجھے نہیں معلوم کہ اس سے کتنے کنکشن چھوٹ گئے۔ تاہم، اس کا پتہ لگانے والے معقول معلوم ہوتے ہیں۔

بیرونی ڈیٹا بیس کی افزودگی

جیسا کہ میں نے پہلے ذکر کیا ہے، ہم اب بھی بیرونی ڈیٹا بیس جیسے CHEBI یا MESH کو اپنے گراف کو بہتر بنانے کے لیے استعمال کر سکتے ہیں۔ مثال کے طور پر، ہمارے گراف میں ایک طبی ہستی ہے۔ Epidermolysis bullosa اور ہم اس کی MeSH آئی ڈی کو بھی جانتے ہیں۔

آپ درج ذیل استفسار کے ساتھ Epidermolysis bullosa کی MeSH id بازیافت کر سکتے ہیں۔

MATCH (e:Entity)
WHERE e.name = "Epidermolysis bullosa"
RETURN e.name as entity, e.other_ids as other_ids

دستیاب معلومات حاصل کرنے کے لیے آپ آگے بڑھ کر MeSH کا معائنہ کر سکتے ہیں:

MeSH لنکڈ ڈیٹا

مصنف کے ذریعہ اسکرین شاٹ۔ ڈیٹا یو ایس نیشنل لائبریری آف میڈیسن کا بشکریہ ہے۔

Epidermolysis bullosa کے لیے MeSH ویب سائٹ پر دستیاب معلومات کا اسکرین شاٹ یہ ہے۔ جیسا کہ ذکر کیا گیا ہے، میں طبی ڈاکٹر نہیں ہوں، اس لیے میں بالکل نہیں جانتا کہ اس معلومات کو گراف میں ماڈل کرنے کا بہترین طریقہ کیا ہوگا۔ تاہم، میں آپ کو دکھاؤں گا کہ Neo4j میں MeSH REST اینڈ پوائنٹ سے معلومات حاصل کرنے کے لیے apoc.load.json طریقہ کار کا استعمال کرتے ہوئے اس معلومات کو کیسے حاصل کیا جائے۔ اور پھر، آپ ڈومین کے ماہر سے اس معلومات کو ماڈل بنانے میں مدد کے لیے کہہ سکتے ہیں۔

MeSH REST اینڈ پوائنٹ سے معلومات حاصل کرنے کے لیے سائفر استفسار یہ ہے:

MATCH (e:Entity)
WHERE e.name = "Epidermolysis bullosa"
WITH e, [id in e.other_ids WHERE id contains "MESH" | split(id,":")[1]][0] as meshId
CALL apoc.load.json("https://id.nlm.nih.gov/mesh/lookup/details?descriptor=" + meshId) YIELD value
RETURN value

مشین لرننگ ڈیٹا ان پٹ کے بطور نالج گراف

ایک حتمی سوچ کے طور پر، میں آپ کو جلدی سے بتاؤں گا کہ آپ بایومیڈیکل نالج گراف کو مشین لرننگ ورک فلو میں ان پٹ کے طور پر کیسے استعمال کر سکتے ہیں۔ حالیہ برسوں میں، نوڈ ایمبیڈنگ فیلڈ میں کافی تحقیق اور ترقی ہوئی ہے۔ نوڈ ایمبیڈنگ ماڈل نیٹ ورک ٹوپولوجی کو ایمبیڈنگ اسپیس میں ترجمہ کرتے ہیں۔

کاپی رائٹ © 2017 منان شاہ، SNAP گروپ۔ تصویر ایم آئی ٹی لائسنس کے تحت دستیاب ہے۔ https://github.com/snap-stanford/cs224w-notes.

فرض کریں کہ آپ نے طبی اداروں اور تصورات، ان کے تعلقات اور مختلف طبی ڈیٹا بیس سے افزودگی پر مشتمل ایک بایومیڈیکل علم کا گراف بنایا ہے۔ آپ نوڈ کی نمائندگی کو سیکھنے کے لیے نوڈ ایمبیڈنگ تکنیک استعمال کر سکتے ہیں، جو فکسڈ لینتھ ویکٹر ہیں، اور انہیں اپنے مشین لرننگ ورک فلو میں داخل کر سکتے ہیں۔ مختلف ایپلی کیشنز اس نقطہ نظر کو استعمال کر رہی ہیں جن میں دوائیوں کی دوبارہ تیاری سے لے کر منشیات کے ضمنی اثرات یا منفی اثرات کی پیش گوئیاں شامل ہیں۔ مجھے ایک تحقیقی مقالہ ملا ہے جو استعمال کرتا ہے۔ نئی بیماریوں کے ممکنہ علاج کے لیے لنک کی پیشن گوئی[4].

نتیجہ

بائیو میڈیکل ڈومین ایک اہم مثال ہے جہاں علمی گراف لاگو ہوتے ہیں۔ سادہ سرچ انجنوں سے لے کر زیادہ پیچیدہ مشین لرننگ ورک فلوز تک بہت سی ایپلی کیشنز ہیں۔ امید ہے کہ، اس بلاگ پوسٹ کو پڑھ کر، آپ کو کچھ آئیڈیاز آئے ہوں گے کہ آپ اپنی ایپلی کیشنز کو سپورٹ کرنے کے لیے بایومیڈیکل نالج گراف کا استعمال کیسے کر سکتے ہیں۔ آپ شروع کر سکتے ہیں a مفت Neo4j سینڈ باکس اور آج ہی دریافت کرنا شروع کریں۔

ہمیشہ کی طرح، کوڈ پر دستیاب ہے۔ GitHub کے.

حوالہ جات

[1] ڈی کم ET اللہ تعالی.، "بائیو میڈیکل ٹیکسٹ مائننگ کے لیے ایک نیورل نامی ہستی کی شناخت اور ملٹی ٹائپ نارملائزیشن ٹول،" میں IEEE رسائی، جلد۔ 7، صفحہ 73729–73740، 2019، doi: 10.1109/ACCESS.2019.2920708۔

[2] کاسٹرین اے، رینڈفلیش ٹی سی، ہرسٹووسکی ڈی. ایک میس ایچ کو-ایکرنس نیٹ ورک میں لنک کی پیشن گوئی: ابتدائی نتائج۔ سٹڈ ہیلتھ ٹیکنالوجی انفارمیشن۔ 2014؛ 205:579–83۔ پی ایم آئی ڈی: 25160252۔

[3] سیٹولی، اے (2020)۔ FewRel کی صفر شاٹ کی حد کو تلاش کرنا۔ میں کمپیوٹیشنل لسانیات پر 28ویں بین الاقوامی کانفرنس کی کارروائی (صفحہ 1447-1451)۔ بین الاقوامی کمیٹی برائے کمپیوٹیشنل لسانیات۔

[4] Zhang, R., Hristovski, D., Schutte, D., Kastrin, A., Fiszman, M., & Kilicoglu, H. (2021)۔ علم کے گراف کی تکمیل کے ذریعے COVID-19 کے لیے دوائیوں کا دوبارہ استعمال. جرنل آف بایومیڈیکل انفارمیٹکس، 115، 103696۔

یہ مضمون اصل میں شائع کیا گیا تھا ڈیٹا سائنس کی طرف اور مصنف کی اجازت سے TOPBOTS پر دوبارہ شائع کیا گیا۔

اس مضمون کا لطف اٹھائیں؟ مزید AI اپ ڈیٹس کے لیے سائن اپ کریں۔

جب ہم مزید تکنیکی تعلیم جاری کریں گے تو ہم آپ کو بتائیں گے۔

پیغام NLP کے ساتھ ایک بایومیڈیکل نالج گراف بنائیں پہلے شائع ٹاپ بوٹس.

ٹائم اسٹیمپ:

سے زیادہ ٹاپ بوٹس