एनएलपी के साथ बायोमेडिकल नॉलेज ग्राफ बनाएं

स्रोत नोड: 1401511

मैं पहले ही दिखा चुका हूँ कि कैसे विकिपीडिया पृष्ठ से एक ज्ञान ग्राफ बनाएँ. हालाँकि, चूंकि इस पोस्ट पर बहुत ध्यान दिया गया है, इसलिए मैंने अन्य डोमेन का पता लगाने का निर्णय लिया है जहाँ ज्ञान ग्राफ बनाने के लिए NLP तकनीकों का उपयोग करना समझ में आता है। मेरी राय में, बायोमेडिकल क्षेत्र एक प्रमुख उदाहरण है जहां डेटा को ग्राफ के रूप में प्रस्तुत करना समझ में आता है क्योंकि आप अक्सर जीन, बीमारियों, दवाओं, प्रोटीन और अन्य के बीच संबंधों और संबंधों का विश्लेषण कर रहे हैं।

उदाहरण सबग्राफ जो अन्य बायोमेडिकल अवधारणाओं के साथ एस्कॉर्बिक एसिड संबंध दिखाता है। लेखक द्वारा छवि।

उपरोक्त दृश्य में, हमारे पास एस्कॉर्बिक एसिड है, जिसे विटामिन सी के रूप में भी जाना जाता है, और इसके कुछ अन्य अवधारणाओं के संबंध हैं। उदाहरण के लिए, यह दर्शाता है कि विटामिन सी का उपयोग पुरानी गैस्ट्र्रिटिस के इलाज के लिए किया जा सकता है।

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

बायोमेडिकल ज्ञान ग्राफ बनाने के लिए आवश्यक सभी चरणों के माध्यम से चलने के लिए मैं इस ब्लॉग पोस्ट में एक शोध पत्र का उपयोग करूँगा – त्वचा पुनर्जनन और बालों के विकास के ऊतक इंजीनियरिंग.

पेपर द्वारा लिखा गया था मोहम्मद्रेज़ा अहमदीक. लेख का पीडीएफ संस्करण CC0 1.0 लाइसेंस के तहत उपलब्ध है। ज्ञान ग्राफ बनाने के लिए हम निम्नलिखित चरणों से गुजरेंगे:

  • OCR के साथ PDF दस्तावेज़ पढ़ना
  • टेक्स्ट प्रीप्रोसेसिंग
  • बायोमेडिकल अवधारणा मान्यता और लिंकिंग
  • संबंध निष्कर्षण
  • बाहरी डेटाबेस संवर्धन

इस पोस्ट के अंत तक, आप निम्न स्कीमा के साथ एक ग्राफ का निर्माण करेंगे।

बायोमेडिकल ग्राफ स्कीमा। लेखक द्वारा छवि।

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

रास्ते में, मैं संग्रहित जानकारी को खोजने और उसका विश्लेषण करने के लिए निर्मित ग्राफ़ का उपयोग करने के अनुप्रयोगों को भी प्रदर्शित करूंगा।

चलो सही में गोता!

यदि यह गहन शैक्षिक सामग्री आपके लिए उपयोगी है, हमारी AI रिसर्च मेलिंग लिस्ट को सब्सक्राइब करें जब हम नई सामग्री जारी करते हैं तो सतर्क रहें।

OCR के साथ PDF दस्तावेज़ पढ़ना

जैसा कि उल्लेख किया गया है, शोध पत्र का पीडीएफ संस्करण CC0 1.0 लाइसेंस के तहत जनता के लिए सुलभ है, जिसका अर्थ है कि हम इसे आसानी से पायथन के साथ डाउनलोड कर सकते हैं। हम का उपयोग करेंगे पित्ताशय पीडीएफ से पाठ निकालने के लिए पुस्तकालय। जहाँ तक मुझे पता है, पाइटेसेरैक्ट पुस्तकालय ओसीआर के लिए अधिक लोकप्रिय पुस्तकालयों में से एक है। यदि आप कोड उदाहरणों के साथ अनुसरण करना चाहते हैं, तो मैंने एक तैयार किया है गूगल कोलाब नोटबुक, इसलिए आपको कोड को स्वयं कॉपी-पेस्ट करने की आवश्यकता नहीं है।

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)

बायोमेडिकल नामित इकाई लिंकिंग

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

बायोमेडिकल अवधारणा निष्कर्षण। लेखक द्वारा छवि।

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

हम चिकित्सा संस्थाओं को लक्ष्य ज्ञान आधार से क्यों जोड़ना चाहेंगे? प्राथमिक कारण यह है कि यह हमें इकाई असंबद्धता से निपटने में मदद करता है। उदाहरण के लिए, हम एस्कॉर्बिक एसिड और विटामिन सी का प्रतिनिधित्व करने वाले ग्राफ़ में अलग-अलग इकाइयां नहीं चाहते हैं क्योंकि डोमेन विशेषज्ञ आपको बता सकते हैं कि वे एक ही चीज़ हैं। दूसरा कारण यह है कि अवधारणाओं को लक्ष्य ज्ञान आधार पर मैप करके, हम लक्ष्य ज्ञान आधार से मैप की गई अवधारणाओं के बारे में जानकारी प्राप्त करके अपने ग्राफ मॉडल को समृद्ध कर सकते हैं। यदि हम एस्कॉर्बिक एसिड उदाहरण का फिर से उपयोग करते हैं, तो हम आसानी से CHEBI डेटाबेस से अतिरिक्त जानकारी प्राप्त कर सकते हैं यदि हम पहले से ही जानते हैं चेबी आईडी.

CHEBI वेबसाइट पर एस्कॉर्बिक एसिड के बारे में समृद्ध डेटा उपलब्ध है। वेबसाइट पर सभी सामग्री के तहत उपलब्ध है सीसी बाय 4.0 लाइसेंस। लेखक द्वारा छवि।

मैं कुछ समय के लिए एक अच्छे ओपन-सोर्स पूर्व-प्रशिक्षित बायोमेडिकल नामित इकाई लिंकिंग की तलाश में हूं। बहुत सारे एनएलपी मॉडल जीन या बीमारियों जैसी चिकित्सा अवधारणाओं के केवल एक विशिष्ट उपसमुच्चय को निकालने पर ध्यान केंद्रित करते हैं। ऐसा मॉडल ढूंढना और भी दुर्लभ है जो अधिकांश चिकित्सा अवधारणाओं का पता लगाता है और उन्हें लक्ष्य ज्ञान आधार से जोड़ता है। सौभाग्य से मैं ठोकर खाई है बर्न[1], एक तंत्रिका जैव चिकित्सा इकाई मान्यता और बहु-प्रकार सामान्यीकरण उपकरण। अगर मैं सही ढंग से समझूं, तो यह बायोमेडिकल टारगेट नॉलेज बेस के लिए अवधारणाओं को मैप करने के लिए एकीकृत विभिन्न नामित एंटिटी लिंकिंग मॉडल के साथ एक फाइन-ट्यून बायोबर्ट मॉडल है। इतना ही नहीं, वे एक मुफ्त आरईएसटी एंडपॉइंट भी प्रदान करते हैं, इसलिए हमें निर्भरता और मॉडल को काम करने के सिरदर्द से निपटने की ज़रूरत नहीं है। बायोमेडिकल नामित इकाई पहचान विज़ुअलाइज़ेशन जिसका मैंने ऊपर उपयोग किया है, BERN मॉडल का उपयोग करके बनाया गया था, इसलिए हम जानते हैं कि यह पाठ में जीन, बीमारियों, दवाओं, प्रजातियों, उत्परिवर्तन और मार्गों का पता लगाता है।

दुर्भाग्य से, BERN मॉडल सभी अवधारणाओं को लक्ष्य ज्ञान आधार आईडी निर्दिष्ट नहीं करता है। इसलिए मैंने एक स्क्रिप्ट तैयार की है जो पहले यह देखती है कि क्या किसी अवधारणा के लिए एक अलग आईडी दी गई है, और यदि ऐसा नहीं है, तो यह आईडी के रूप में इकाई के नाम का उपयोग करेगी। जब हम रिलेशन एक्सट्रैक्शन कर रहे होंगे, तब हम बाद में विशिष्ट वाक्यों को आसानी से पहचानने के लिए वाक्यों के टेक्स्ट के 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 सैंडबॉक्स इंस्टेंस का उपयोग कर सकते हैं।

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

परिणाम

लेखक द्वारा छवि।

सह-घटना विश्लेषण

दूसरा विकल्प सह-घटना विश्लेषण है। आप चिकित्सा संस्थाओं के बीच सह-घटना को परिभाषित कर सकते हैं यदि वे एक ही वाक्य या लेख में दिखाई देते हैं। मुझे एक लेख [2] मिला है जो चिकित्सा संस्थाओं के बीच नए संभावित संबंधों की भविष्यवाणी करने के लिए चिकित्सा सह-घटना नेटवर्क का उपयोग करता है।

MeSH सह-घटना नेटवर्क में लिंक भविष्यवाणी: प्रारंभिक परिणाम - PubMed

आप एक ही वाक्य में अक्सर सह-घटित होने वाली संस्थाओं को खोजने के लिए निम्नलिखित साइफर क्वेरी का उपयोग कर सकते हैं।

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
मोहम्मद्रेज़ा अहमदीक एपिडर्मोलिसिस बुलोसा 2

संबंध निष्कर्षण

अब हम चिकित्सा अवधारणाओं के बीच संबंधों को निकालने का प्रयास करेंगे। मेरे अनुभव से, संबंध निष्कर्षण कम से कम परिमाण का एक क्रम है जो नामित इकाई निष्कर्षण से कठिन है। यदि आपको नामित निकाय लिंकिंग के साथ सही परिणामों की अपेक्षा नहीं करनी चाहिए, तो आप निश्चित रूप से संबंध निष्कर्षण तकनीक के साथ कुछ गलतियों की अपेक्षा कर सकते हैं।

मैं उपलब्ध बायोमेडिकल रिलेशन एक्सट्रैक्शन मॉडल की तलाश कर रहा हूं, लेकिन ऐसा कुछ भी नहीं मिला जो बॉक्स से बाहर काम करता हो या जिसमें फाइन-ट्यूनिंग की आवश्यकता न हो। ऐसा लगता है कि संबंध निष्कर्षण का क्षेत्र अत्याधुनिक है, और उम्मीद है कि हम भविष्य में इसके बारे में अधिक ध्यान देंगे। दुर्भाग्य से, मैं एनएलपी विशेषज्ञ नहीं हूं, इसलिए मैंने अपने मॉडल को ठीक करने से परहेज किया। इसके बजाय, हम पेपर के आधार पर जीरो-शॉट रिलेशन एक्सट्रैक्टर का उपयोग करेंगे FiveRel . की शून्य-शॉट सीमा की खोज[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

परिणाम

लेखक द्वारा छवि।

जैसा कि उल्लेख किया गया है, मैंने संबंधों को निकालने के लिए जिस एनएलपी मॉडल का उपयोग किया है, वह सही नहीं है, और चूंकि मैं एक चिकित्सा चिकित्सक नहीं हूं, इसलिए मुझे नहीं पता कि यह कितने कनेक्शन छूट गया। हालाँकि, जिन लोगों ने इसका पता लगाया, वे उचित प्रतीत होते हैं।

बाहरी डेटाबेस संवर्धन

जैसा कि मैंने पहले उल्लेख किया है, हम अभी भी अपने ग्राफ को समृद्ध करने के लिए CHEBI या MESH जैसे बाहरी डेटाबेस का उपयोग कर सकते हैं। उदाहरण के लिए, हमारे ग्राफ में एक चिकित्सा इकाई है एपिडर्मोलिसिस बुलोसा और हम इसकी MeSH id भी जानते हैं।

आप निम्न क्वेरी के साथ एपिडर्मोलिसिस बुलोसा की MeSH आईडी पुनः प्राप्त कर सकते हैं:

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

आप आगे बढ़ सकते हैं और उपलब्ध जानकारी प्राप्त करने के लिए MeSH का निरीक्षण कर सकते हैं:

MeSH लिंक्ड डेटा

लेखक द्वारा स्क्रीनशॉट। डेटा यूएस नेशनल लाइब्रेरी ऑफ मेडिसिन के सौजन्य से है।

एपिडर्मोलिसिस बुलोसा के लिए MeSH वेबसाइट पर उपलब्ध जानकारी का स्क्रीनशॉट यहां दिया गया है। जैसा कि उल्लेख किया गया है, मैं एक चिकित्सा चिकित्सक नहीं हूं, इसलिए मुझे नहीं पता कि इस जानकारी को ग्राफ़ में मॉडल करने का सबसे अच्छा तरीका क्या होगा। हालाँकि, मैं आपको दिखाता हूँ कि MeSH REST एंडपॉइंट से जानकारी प्राप्त करने के लिए apoc.load.json प्रक्रिया का उपयोग करके Neo4j में इस जानकारी को कैसे प्राप्त किया जाए। और फिर, आप किसी डोमेन विशेषज्ञ से इस जानकारी को मॉडल करने में मदद करने के लिए कह सकते हैं।

MeSH REST समापन बिंदु से जानकारी प्राप्त करने के लिए Cypher क्वेरी है:

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 मनन शाह, स्नैप ग्रुप। छवि एमआईटी लाइसेंस के तहत उपलब्ध है https://github.com/snap-stanford/cs224w-notes.

मान लीजिए आपने एक बायोमेडिकल ज्ञान ग्राफ बनाया है जिसमें चिकित्सा संस्थाओं और अवधारणाओं, उनके संबंधों और विभिन्न चिकित्सा डेटाबेस से संवर्धन शामिल है। आप नोड अभ्यावेदन सीखने के लिए नोड एम्बेडिंग तकनीकों का उपयोग कर सकते हैं, जो निश्चित-लंबाई वाले वैक्टर हैं, और उन्हें अपने मशीन लर्निंग वर्कफ़्लो में इनपुट करें। विभिन्न अनुप्रयोग इस दृष्टिकोण का उपयोग दवा के पुनर्प्रयोजन से लेकर दवा के पक्ष या प्रतिकूल प्रभाव की भविष्यवाणी तक कर रहे हैं। मुझे एक शोध पत्र मिला है जो उपयोग करता है नई बीमारियों के संभावित उपचार के लिए लिंक भविष्यवाणी[4]

निष्कर्ष

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

हमेशा की तरह, कोड पर उपलब्ध है GitHub.

संदर्भ

[1] डी. किम एट अल., "बायोमेडिकल टेक्स्ट माइनिंग के लिए एक तंत्रिका नामांकित इकाई पहचान और बहु-प्रकार सामान्यीकरण उपकरण," में आईईईई प्रवेश, वॉल्यूम। 7, पीपी. 73729–73740, 2019, doi: 10.1109/ACCESS.2019.2920708।

[2] कास्त्रिन ए, रिंडफ्लेश टीसी, हिरस्टोवस्की डी। एक मेश सह-घटना नेटवर्क में लिंक भविष्यवाणी: प्रारंभिक परिणाम। स्टड स्वास्थ्य तकनीक की जानकारी। 2014; 205: 579-83। पीएमआईडी: 25160252।

[3] सिटोली, ए. (2020)। फ्यूरेल की शून्य-शॉट सीमा की खोज। में कम्प्यूटेशनल भाषाविज्ञान पर 28वें अंतर्राष्ट्रीय सम्मेलन की कार्यवाही (पीपी। 1447-1451)। कम्प्यूटेशनल भाषाविज्ञान पर अंतर्राष्ट्रीय समिति।

[4] झांग, आर., हिस्टोवस्की, डी., शुट्टे, डी., कास्त्रिन, ए., फ़िज़मैन, एम., और किलिकोग्लू, एच. (2021)। नॉलेज ग्राफ़ पूर्णता के माध्यम से COVID-19 के लिए दवा का पुनर्प्रयोजन. जर्नल ऑफ बायोमेडिकल इंफॉर्मेटिक्स, 115, 103696।

यह आलेख मूलतः पर प्रकाशित हुआ था डेटा साइंस की ओर और लेखक से अनुमति के साथ TOPBOTS में फिर से प्रकाशित।

इस लेख का आनंद लें? अधिक AI अपडेट के लिए साइन अप करें।

जब हम अधिक तकनीकी शिक्षा जारी करते हैं तो हम आपको बताएंगे।

पोस्ट एनएलपी के साथ बायोमेडिकल नॉलेज ग्राफ बनाएं पर पहली बार दिखाई दिया टॉपबॉट्स.

समय टिकट:

से अधिक टॉपबॉट्स