NLP দিয়ে একটি বায়োমেডিকাল নলেজ গ্রাফ তৈরি করুন

উত্স নোড: 1401511

আমি ইতিমধ্যে প্রদর্শন করেছি কিভাবে একটি উইকিপিডিয়া পৃষ্ঠা থেকে একটি জ্ঞান গ্রাফ তৈরি করুন. যাইহোক, যেহেতু পোস্টটি অনেক মনোযোগ পেয়েছে, তাই আমি অন্য ডোমেনগুলি অন্বেষণ করার সিদ্ধান্ত নিয়েছি যেখানে জ্ঞানের গ্রাফ তৈরি করার জন্য NLP কৌশল ব্যবহার করা অর্থপূর্ণ। আমার মতে, বায়োমেডিকাল ক্ষেত্র হল একটি প্রধান উদাহরণ যেখানে গ্রাফ হিসাবে ডেটা উপস্থাপন করা অর্থপূর্ণ কারণ আপনি প্রায়শই জিন, রোগ, ওষুধ, প্রোটিন এবং আরও অনেক কিছুর মধ্যে মিথস্ক্রিয়া এবং সম্পর্ক বিশ্লেষণ করছেন৷

উদাহরণ সাবগ্রাফ যা অন্যান্য বায়োমেডিকাল ধারণার সাথে অ্যাসকরবিক অ্যাসিডের সম্পর্ক দেখায়। লেখক দ্বারা ছবি.

উপরের ভিজ্যুয়ালাইজেশনে, আমাদের কাছে অ্যাসকরবিক অ্যাসিড রয়েছে, যা ভিটামিন সি নামেও পরিচিত, এবং অন্যান্য ধারণার সাথে এর কিছু সম্পর্ক রয়েছে। উদাহরণস্বরূপ, এটি দেখায় যে ভিটামিন সি দীর্ঘস্থায়ী গ্যাস্ট্রাইটিসের চিকিত্সার জন্য ব্যবহার করা যেতে পারে।

এখন, আপনার ডোমেন বিশেষজ্ঞদের একটি দল থাকতে পারে আপনার জন্য ওষুধ, রোগ এবং অন্যান্য বায়োমেডিকাল ধারণাগুলির মধ্যে সেই সমস্ত সংযোগগুলিকে ম্যাপ করতে। কিন্তু, দুর্ভাগ্যবশত, আমাদের অনেকেরই আমাদের জন্য কাজ করার জন্য মেডিকেল ডাক্তারদের একটি দল নিয়োগ করার সামর্থ্য নেই। সেক্ষেত্রে, আমরা স্বয়ংক্রিয়ভাবে সেই সম্পর্কগুলি বের করতে NLP কৌশলগুলি ব্যবহার করতে পারি। ভাল অংশটি হল যে আমরা একটি NLP পাইপলাইন ব্যবহার করতে পারি সেখানে সমস্ত গবেষণাপত্র পড়ার জন্য, এবং খারাপ দিকটি হল যে সমস্ত প্রাপ্ত ফলাফল নিখুঁত হবে না। যাইহোক, ম্যানুয়ালি সম্পর্ক বের করার জন্য আমার পাশে বিজ্ঞানীদের একটি দল প্রস্তুত না থাকায়, আমি আমার নিজের একটি বায়োমেডিকাল জ্ঞান গ্রাফ তৈরি করতে NLP কৌশল ব্যবহার করব।

একটি বায়োমেডিকাল জ্ঞান গ্রাফ নির্মাণের জন্য প্রয়োজনীয় সমস্ত পদক্ষেপের মধ্য দিয়ে আপনাকে হেঁটে যেতে আমি এই ব্লগ পোস্টে একটি একক গবেষণাপত্র ব্যবহার করব - ত্বকের পুনর্জন্ম এবং চুলের বৃদ্ধির টিস্যু ইঞ্জিনিয়ারিং.

কাগজটি লিখেছিলেন মোহাম্মদরেজা আহমদী. নিবন্ধটির PDF সংস্করণ CC0 1.0 লাইসেন্সের অধীনে উপলব্ধ। একটি জ্ঞান গ্রাফ তৈরি করতে আমরা নিম্নলিখিত ধাপগুলি অতিক্রম করব:

  • ওসিআর সহ একটি পিডিএফ নথি পড়া
  • টেক্সট প্রিপ্রসেসিং
  • বায়োমেডিকাল ধারণা স্বীকৃতি এবং লিঙ্কিং
  • সম্পর্ক নিষ্কাশন
  • বাহ্যিক ডাটাবেস সমৃদ্ধকরণ

এই পোস্টের শেষে, আপনি নিম্নলিখিত স্কিমা সহ একটি গ্রাফ তৈরি করবেন।

বায়োমেডিকাল গ্রাফ স্কিমা। লেখক দ্বারা ছবি.

আমরা Neo4j ব্যবহার করব, একটি গ্রাফ ডাটাবেস যা লেবেলযুক্ত প্রপার্টি গ্রাফ মডেলকে বৈশিষ্ট্যযুক্ত করে, আমাদের গ্রাফ সংরক্ষণ করতে। প্রতিটি নিবন্ধে এক বা একাধিক লেখক থাকতে পারে। আমরা নিবন্ধের বিষয়বস্তুকে বাক্যে বিভক্ত করব এবং চিকিৎসা সংস্থা এবং তাদের সম্পর্ক উভয়ই বের করতে NLP ব্যবহার করব। এটা একটু পাল্টা স্বজ্ঞাত হতে পারে যে আমরা সত্তাগুলির মধ্যে সম্পর্কগুলি সম্পর্কের পরিবর্তে মধ্যবর্তী নোড হিসাবে সংরক্ষণ করব। এই সিদ্ধান্তের পিছনে গুরুত্বপূর্ণ ফ্যাক্টর হল যে আমরা উৎস টেক্সটের একটি অডিট ট্রেইল করতে চাই যেখান থেকে সম্পর্কটি বের করা হয়েছে। লেবেলযুক্ত সম্পত্তি গ্রাফ মডেলের সাথে, আপনি অন্য সম্পর্কের দিকে নির্দেশ করে এমন একটি সম্পর্ক রাখতে পারবেন না। এই কারণে, আমরা একটি মধ্যবর্তী নোডে চিকিৎসা ধারণাগুলির মধ্যে সংযোগকে রিফ্যাক্টর করি। এটি একটি ডোমেন বিশেষজ্ঞকে একটি সম্পর্ক সঠিকভাবে বের করা হয়েছে কিনা তা মূল্যায়ন করার অনুমতি দেবে।

পথের পাশাপাশি, আমি সঞ্চিত তথ্য অনুসন্ধান এবং বিশ্লেষণ করতে নির্মিত গ্রাফ ব্যবহার করার অ্যাপ্লিকেশনগুলিও প্রদর্শন করব।

এর ঠিক ডুব দিন!

যদি এই গভীর-শিক্ষামূলক সামগ্রী আপনার জন্য দরকারী, আমাদের এআই গবেষণা মেলিং তালিকার সাবস্ক্রাইব করুন সতর্কতা অবলম্বন করার জন্য যখন আমরা নতুন উপাদান প্রকাশ করি।

ওসিআর সহ একটি পিডিএফ নথি পড়া

উল্লিখিত হিসাবে, গবেষণা পত্রের PDF সংস্করণটি CC0 1.0 লাইসেন্সের অধীনে জনসাধারণের কাছে অ্যাক্সেসযোগ্য, যার মানে আমরা এটি পাইথন দিয়ে সহজেই ডাউনলোড করতে পারি। আমরা ব্যবহার করা হবে পাইটস্রেক্ট পিডিএফ থেকে পাঠ্য বের করার জন্য লাইব্রেরি। যতদূর আমি জানি, পাইটেসার্যাক্ট লাইব্রেরি ওসিআর-এর জন্য আরও জনপ্রিয় লাইব্রেরিগুলির মধ্যে একটি। আপনি যদি কোড উদাহরণ সহ অনুসরণ করতে চান, আমি একটি প্রস্তুত করেছি Google Colab নোটবুক, তাই আপনাকে কোডটি কপি-পেস্ট করতে হবে না।

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 মডেল পাঠ্যে জিন, রোগ, ওষুধ, প্রজাতি, মিউটেশন এবং পথ চিহ্নিত করেছে। উল্লিখিত হিসাবে, এই প্রক্রিয়াটিকে নামযুক্ত সত্তা স্বীকৃতি বলা হয়। নামযুক্ত সত্তা স্বীকৃতিতে একটি আপগ্রেড তথাকথিত নামযুক্ত সত্তা লিঙ্কিং। নামযুক্ত সত্তা লিঙ্ক করার কৌশলটি পাঠ্যের প্রাসঙ্গিক ধারণাগুলি সনাক্ত করে এবং লক্ষ্য জ্ঞানের ভিত্তিতে সেগুলিকে ম্যাপ করার চেষ্টা করে। বায়োমেডিকাল ডোমেনে, কিছু লক্ষ্য জ্ঞানের ভিত্তি হল:

কেন আমরা একটি লক্ষ্য জ্ঞান বেস চিকিৎসা সত্তা লিঙ্ক করতে চাই? প্রাথমিক কারণ হল যে এটি আমাদের সত্তা দ্ব্যর্থতা মোকাবেলা করতে সাহায্য করে। উদাহরণস্বরূপ, আমরা অ্যাসকরবিক অ্যাসিড এবং ভিটামিন সি প্রতিনিধিত্বকারী গ্রাফে আলাদা সত্তা চাই না কারণ ডোমেন বিশেষজ্ঞরা আপনাকে বলতে পারেন যে সেগুলি একই জিনিস। গৌণ কারণ হল লক্ষ্য জ্ঞানের ভিত্তিতে ধারণাগুলি ম্যাপ করার মাধ্যমে, আমরা লক্ষ্য জ্ঞান বেস থেকে ম্যাপ করা ধারণাগুলি সম্পর্কে তথ্য সংগ্রহ করে আমাদের গ্রাফ মডেলকে সমৃদ্ধ করতে পারি। যদি আমরা আবার অ্যাসকরবিক অ্যাসিডের উদাহরণ ব্যবহার করি, তাহলে আমরা সহজেই CHEBI ডাটাবেস থেকে অতিরিক্ত তথ্য আনতে পারি CHEBI আইডি.

CHEBI ওয়েবসাইটে অ্যাসকরবিক অ্যাসিড সম্পর্কে সমৃদ্ধ তথ্য উপলব্ধ। ওয়েবসাইটের সমস্ত বিষয়বস্তু নীচে উপলব্ধ CC BY 4.0 লাইসেন্স। লেখকের ছবি।

আমি কিছু সময়ের জন্য একটি শালীন ওপেন-সোর্স প্রাক-প্রশিক্ষিত বায়োমেডিকাল নামের সত্তা লিঙ্কিং খুঁজছি। প্রচুর এনএলপি মডেল শুধুমাত্র জিন বা রোগের মতো চিকিৎসা ধারণার একটি নির্দিষ্ট উপসেট বের করার উপর ফোকাস করে। এটি এমন একটি মডেল খুঁজে পাওয়া আরও বিরল যেটি বেশিরভাগ মেডিকেল ধারণাগুলি সনাক্ত করে এবং সেগুলিকে একটি লক্ষ্য জ্ঞান বেসের সাথে লিঙ্ক করে। ভাগ্যক্রমে আমি হোঁচট খেয়েছি বার্ন[১], একটি নিউরাল বায়োমেডিকাল সত্তা স্বীকৃতি এবং মাল্টি-টাইপ নরমালাইজেশন টুল। যদি আমি সঠিকভাবে বুঝতে পারি, এটি একটি সূক্ষ্ম-টিউনড বায়োবার্ট মডেল যার সাথে বিভিন্ন নামযুক্ত সত্তা লিঙ্কিং মডেলগুলি বায়োমেডিকাল টার্গেট জ্ঞান বেসে ধারণাগুলি ম্যাপ করার জন্য সমন্বিত। শুধু তাই নয়, তারা একটি বিনামূল্যের REST এন্ডপয়েন্টও প্রদান করে, তাই আমাদের নির্ভরতা এবং মডেলটি কাজ করার জন্য মাথাব্যথার সাথে মোকাবিলা করতে হবে না। আমি উপরে যে বায়োমেডিকাল নামের সত্তা স্বীকৃতি ভিজ্যুয়ালাইজেশনটি ব্যবহার করেছি তা 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 এখনও সেরা ওপেন সোর্স বায়োমেডিকাল মডেল যা আমি আমার তদন্তের সময় খুঁজে পেয়েছি।

একটি জ্ঞান গ্রাফ তৈরি করুন

সম্পর্ক নিষ্কাশন কৌশলগুলি দেখার আগে, আমরা শুধুমাত্র সত্তা ব্যবহার করে একটি বায়োমেডিকাল জ্ঞান গ্রাফ তৈরি করব এবং সম্ভাব্য অ্যাপ্লিকেশনগুলি পরীক্ষা করব। উল্লিখিত হিসাবে, আমি একটি প্রস্তুত করেছি Google Colab নোটবুক যে আপনি এই পোস্টে কোড উদাহরণ অনুসরণ করতে ব্যবহার করতে পারেন. আমাদের গ্রাফ সংরক্ষণ করতে, আমরা 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

সম্পর্ক নিষ্কাশন

এখন আমরা চিকিৎসা ধারণার মধ্যে সম্পর্ক বের করার চেষ্টা করব। আমার অভিজ্ঞতা থেকে, রিলেশন এক্সট্রাকশন নামক সত্তা এক্সট্রাকশনের চেয়ে কম পরিমাণে কঠিন। আপনি যদি নামযুক্ত সত্তা লিঙ্কের সাথে নিখুঁত ফলাফলের আশা না করেন, তাহলে আপনি অবশ্যই সম্পর্ক নিষ্কাশন কৌশলের সাথে কিছু ভুল আশা করতে পারেন।

আমি উপলব্ধ বায়োমেডিকাল রিলেশন এক্সট্রাকশন মডেলগুলি খুঁজছি কিন্তু এমন কিছুই পাইনি যা বাক্সের বাইরে কাজ করে বা ফাইন-টিউনিংয়ের প্রয়োজন হয় না। এটা মনে হচ্ছে যে সম্পর্ক নিষ্কাশনের ক্ষেত্রটি কাটিয়া প্রান্তে রয়েছে এবং আশা করি, আমরা ভবিষ্যতে এটি সম্পর্কে আরও মনোযোগ দেখতে পাব। দুর্ভাগ্যবশত, আমি একজন এনএলপি বিশেষজ্ঞ নই, তাই আমি আমার নিজের মডেল ফাইন-টিউনিং এড়িয়ে চলি। পরিবর্তে, আমরা কাগজের উপর ভিত্তি করে জিরো-শট রিলেশন এক্সট্র্যাক্টর ব্যবহার করব FewRel-এর শূন্য-শট সীমা অন্বেষণ করা হচ্ছে[৩]। যদিও আমি এই মডেলটিকে উৎপাদনে রাখার সুপারিশ করব না, এটি একটি সাধারণ প্রদর্শনের জন্য যথেষ্ট। মডেল পাওয়া যায় জড়িয়ে আছে, তাই আমাদের প্রশিক্ষণ বা মডেল সেট আপ করতে হবে না।

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-এর মতো বাহ্যিক ডেটাবেস ব্যবহার করতে পারি। উদাহরণস্বরূপ, আমাদের গ্রাফে একটি চিকিৎসা সত্তা রয়েছে এপিডার্মোলাইসিস বুলোসা এবং আমরা এর MeSH আইডিও জানি।

আপনি নিম্নলিখিত প্রশ্নের সাথে এপিডার্মোলাইসিস বুলোসার 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 এন্ডপয়েন্ট থেকে তথ্য আনার জন্য সাইফার ক্যোয়ারী হল:

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]।

উপসংহার

বায়োমেডিকাল ডোমেন একটি প্রধান উদাহরণ যেখানে জ্ঞান গ্রাফ প্রযোজ্য। সাধারণ সার্চ ইঞ্জিন থেকে আরও জটিল মেশিন লার্নিং ওয়ার্কফ্লো পর্যন্ত অনেক অ্যাপ্লিকেশন রয়েছে। আশা করি, এই ব্লগ পোস্টটি পড়ে, আপনি কীভাবে আপনার অ্যাপ্লিকেশনগুলিকে সমর্থন করার জন্য বায়োমেডিকাল জ্ঞান গ্রাফ ব্যবহার করতে পারেন সে সম্পর্কে কিছু ধারণা নিয়ে এসেছেন। আপনি একটি শুরু করতে পারেন বিনামূল্যে Neo4j স্যান্ডবক্স এবং আজ অন্বেষণ শুরু.

সর্বদা হিসাবে, কোড উপলব্ধ GitHub.

তথ্যসূত্র

[১] ডি. কিম এট আল., "বায়োমেডিকাল টেক্সট মাইনিং এর জন্য একটি নিউরাল নামের সত্তা স্বীকৃতি এবং মাল্টি-টাইপ নরমালাইজেশন টুল," IEEE অ্যাক্সেস, ভলিউম। 7, পৃ. 73729–73740, 2019, doi: 10.1109/ACCESS.2019.2920708।

[২] ক্যাস্ট্রিন এ, রিন্ডফ্লেশ টিসি, হরিস্টোভস্কি ডি. একটি MeSH সহ-ঘটনা নেটওয়ার্কে লিঙ্কের পূর্বাভাস: প্রাথমিক ফলাফল। স্টাড স্বাস্থ্য প্রযুক্তি তথ্য. 2;2014:205-579। পিএমআইডি: 83।

[৩] সেটোলি, এ. (3)। FewRel-এর শূন্য-শট সীমা অন্বেষণ করা হচ্ছে। ভিতরে কম্পিউটেশনাল ভাষাবিজ্ঞানের উপর 28তম আন্তর্জাতিক সম্মেলনের কার্যক্রম (পৃ. 1447-1451)। কম্পিউটেশনাল ভাষাবিজ্ঞানের আন্তর্জাতিক কমিটি।

[৪] ঝাং, আর., হ্রিস্টভস্কি, ডি., শুট্টে, ডি., ক্যাস্ট্রিন, এ., ফিজম্যান, এম., এবং কিলিকোগ্লু, এইচ. (4)। জ্ঞানের গ্রাফ সমাপ্তির মাধ্যমে COVID-2021-এর জন্য ওষুধ পুনরায় ব্যবহার করা. বায়োমেডিকাল ইনফরমেটিক্স জার্নাল, 115, 103696।

এই নিবন্ধটি মূলত উপর প্রকাশ করা হয়েছিল ডেটা সায়েন্সের দিকে এবং লেখকের অনুমতি নিয়ে TOPBOTS এ আবার প্রকাশিত।

এই নিবন্ধটি উপভোগ করবেন? আরও এআই আপডেটের জন্য সাইন আপ করুন।

আমরা আরও প্রযুক্তিগত শিক্ষা ছেড়ে দিলে আমরা আপনাকে জানাব।

পোস্টটি NLP দিয়ে একটি বায়োমেডিকাল নলেজ গ্রাফ তৈরি করুন প্রথম দেখা শীর্ষস্থানীয়.

সময় স্ট্যাম্প:

থেকে আরো শীর্ষস্থানীয়