هر آنچه لازم است از گراف دانش و هوش‌مصنوعی بدانید
۱۳۹۸-۰۹-۰۷ 0

هر آنچه لازم است از گراف دانش و هوش‌مصنوعی بدانید

گراف دانش به عنوان هستی‌شناسی در علوم اطلاعاتی و محاسباتی شناخته ‌می‌شود که یک ساختار برای ذخیره، بازیابی و به اشتراک‌گذاری مفاهیم موجود در یک دامنه و ضوابط و روابط بین آن‌ها است. علوم اطلاعات و علوم محاسبات برای گسترش و کارایی بیشتر و نیز برآورده نمودن نیازهایی مانند وب معنایی، نیازمند به ساخت و ایجاد گراف دانش هستند.

در ساخت گراف دانش، دو وظیفه بایستی به درستی انجام شوند، وظیفه ذخیره اطلاعات  و وظیفه استخراج اطلاعات. پیشرفت‌های نوین هوش‌مصنوعی به خصوص در زمینه یادگیری ماشین و به دنبال آن در یادگیری عمیق، به انجام هر چه بهتر این دو وظیفه کمک می‌کند.

ساخت گراف دانش در حوزه‌های مختلف و استفاده از یادگیری عمیق برای استخراج اطلاعات می‌تواند دریچه نوینی به روی انبوهی از اطلاعات پردازش نشده متنی در آن حوزه باشد. همچون متن‌های فقهی، متن‌های حقوقی، متن‌های ورزشی، سینمایی و امثال این‌ها.

به طور مثال فرض کنید در حوزه ورزشی، قسمت لیگ برتر فوتبال ایران، در تمامی وب‌سایت‌های خبری، وب‌سایت‌های ورزشی، روزنامه‌های عمومی و ورزشی، همواره در ارتباط با این قسمت، نوشته‌ها و متن‌های بسیاری تولید شده و می‌شوند و در بهترین حالت امکان جستجوی متنی بر روی آن‌ها امکان پذیر است.

با کمک گراف دانش و یادگیری عمیق، می‌توان اطلاعات موجود را پردازش کرد، موجودیت‌ها و روابط را شناسایی کرد و از این اطلاعات گراف دانش را در این حوزه ساخت.

به عنوان مثال در شکل زیر موجودیت‌ها و ارتباطات بین آن‌ها برای مسابقه‌های فوتبال نشان داده شده است.

knowledge-graph-for-game

در این شکل ۵ کلاس مسابقه، لیگ، تیم، داور و استادیوم توصیف شده است. نمونه‌های این کلاس‌ها با هم در ارتباط هستند به طور مثال یک تیم در یک یا چند مسابقه که در یک لیگ است بازی ‌می‌کند. ارتباط بین این کلاس‌ها با خصیصه‌ها توصیف ‌می‌شود. به عنوان مثال: خصیصه‌ی MEMBERSHIP، نمونه‌هایی از کلاس تیم را به نمونه‌هایی از کلاس لیگ مرتبط می‌کند که بیان‌گر عضویت یک تیم فوتبال در یک لیگ فوتبال است.

اطلاعات متنی تولید شده در مورد لیگ فوتبال باید به کلاس‌ها، نمونه‌ها و خصیصه‌های گراف دانش لیگ برتر نگاشت شوند. شکل زیر یکی از مسابقه‌های فوتبال لیگ برتر را نشان می‌دهد.

knowledge-graph

برای ذخیره‌سازی هر گراف دانشی به یک پایگاه‌داده گرافی نیاز داریم. در ادامه به توضیح پایگاه داده گرافی می‌پردازیم و چند پایگاه‌داده گرافی را معرفی می‌کنیم.

پایگاه‌داده‌ی گرافی چیست ؟

یک پایگاه‌ داده‌ گرافی ابزاری آنلاین برای مدیریت سیستم اطلاعاتی است که عملیات CRUD را بر روی مدل داده گرافی انجام می‌دهد. برخلاف سایر پایگاه‌های داده‌، روابط (relationship) از اولویت بالایی برخوردارند و برای دسترسی به داده نیازی به تعریف foreign keys یا پردازش های خارج از باند نظیر  MapReduce نیست.

پایگاه‌داده‌های گرافی از گره‌ها برای ذخیره اطلاعات موجودیت‌ها و لبه‌ها برای ذخیره روابط بین موجودیت‌ها استفاده می‌کنند. یک لبه همیشه دارای یک گره شروع، گره انتهایی، نوع و جهت است و یک لبه می‌تواند روابط والدین و فرزند، اقدامات، مالکیت و موارد مشابه را توصیف کند. از نظر تعداد و نوع روابط برای  یک گره محدودیتی وجود ندارد.

انواع پایگاه‌ داده‌‌های گرافی

برخی از معروف‌ترین پایگاه‌داده‌های گرافی که غالبا متن‌باز هستند عبارتند از

  • Grakn
  • FlockDB
  • AllegroGraph
  • GraphDB
  • InfiniteGraph
  • Neo4j

این پایگاه‌داده‌ها هر یک معایب و مزایای خودشان را دارند که بررسی آن‌ها در این مطلب نمی‌گنجد. در ادامه هر یک را به صورت مختصر معرفی می‌کنیم.

InfiniteGraph

infinitegraph-logo

یک پایگاه داده گرافی مبتنی بر جاوا است که توسط کمپانی به همین نام طراحی شده است. هدف این شرکت ساخت یک پایگاه داده با مقیاس پذیری نامحدود می باشد.

GraphDB

graphDB-logo

 پایگاه داده GraphDB یک پایگاه داده‌ی گرافی بر اساس .NET می باشد که توسط کمپانی sones طراحی شده است.

FlockDB

flochDB-twitter-logo

این گراف دیتابیس توسط توئیتر و برای تحلیل ارتباطات طراحی و ساخته شده است.

AllegroGraph

allegroGraph-logo

پایگاه‌داده گرافی AllegroGraph توسط W3C ساخته شده و برای منابع با چارچوب توصیفی می‌باشد. این پایگاه‌داده گرافی طراحی شده است تا با Linked Data ها و Semantic Web کار کند.

Grakn

graknAI-logo

پایگاه‌داده گرافی  GRAKN.AI یک گراف دانش منبع باز و توزیع شده برای سیستم های دانش محور است که کاملا مدل (ER(Entity-Relationship را پیاده‌سازی می‌کند. این پایگاه‌داده زبان جستجوی خود را دارد به اسم Graql.

Neo4j

neo4j-logo

پایگاه داده‌ گرافی Neo4j یک گراف دانش معروف و متن باز مبتنی بر جاوا است. Neo4j برای جستجو در پایگاه‌داده علاوه بر زبان مخصوص به خودش یعنی Cypher امکان استفاده از Graphql را هم فراهم کرده است.

فوتمن

footman-app-knowledge-graph

اپلیکیشن موبایل فوتمن یک دستیار هوشمند فوتبالی است که بر پایه‌ی گراف دانش و یادگیری عمیق توسعه داده شده است. برای توسعه این دستیار هوشمند از پایگاه‌داده Neo4j استفاده شده است و به کمک یادگیری عمیق، فوتمن می‌تواند به پرسش‌های فوتبالی مرتبط با لیگ برتر ایران به شما پاسخ دهد.

در این دستیار هوشمند ابتدا گفتار حاوی سوال به متن تبدیل می‌شود، سپس متن حاوی سوال توسط چندین الگوریتم یادگیری عمیق به یک پرس‌وجو (query) نگاشت می‌شود  و سپس بر اساس نتیجه پرس‌و‌جو، جواب آماده می‌شود.

footman-knowledge-graph

گراف دانش فوتمن شامل چندین موجودیت است که برخی در ادامه آورده شده است.

  • CLUB ← موجودیت یک تیم فوتبال است
  • PLAYER ← موجودیت یک بازیکن است
  • STADIUM ← موجودیت یک استادیوم فوتبال است

این موجودیت‌ها با یک یا چندین رابطه به یکدیگر وصل هستند. برخی از این رابطه‌ها عبارتند از:

  • BELONG ← ارتباط بین یک بازی و یک لیگ را مشخص می‌کند
  • CONTRACT ← قرارداد بین یک بازکن و یک تیم را مشخص می‌کند
  • PLAYED ← ارتباط بین یک بازیکن و بازی که در آن بازی کرده است را مشخص می‌کند

به عنوان مثال اگر سوال‌های زیر را از فوتمن بپرسید بدین شکل پاسخ را آماده می‌کند.

سوال: کدام بازیکن پرسپولیس در لیگ هجدهم به عنوان آقای پاس گلی دست یافت؟

  1. استخراج موجودیت‌های متن
  2. Club →  پرسپولیس
  3. League → لیگ هجدهم
  4. انتخاب پرس‌و‌جو

MATCH (p: PLAYER)-[s: SCORER]->(m: MATCH)–>(l:LEAGUE{{season: “{season}”}})

MATCH (c:CLUB)–>(m)

WHERE s.assists<>”000″ AND c.club_id =”{club}”

WITH p, COUNT(s.assists) as a

ORDER BY a {DESC}

RETURN p, a , {assists} LIMIT {limit}

  • انجام پرس‌و‌جو و ساخت پاسخ
player--picture-for-knowledge-graph

سوال: بازی شهر خودرو و پارس جنوبی چند چند شد؟

  1. استخراج موجودیت‌های متن
  2. Club →  شهر خودرو
  3. Club → پارس جنوبی
  4. انتخاب پرس‌و‌جو

MATCH (c1:CLUB)-[side1:STATS]->(sm:MATCH)-[b:BELONG]->(l:LEAGUE {{season: “{season}”}})

MATCH (c2:CLUB)-[side2:STATS]->(sm)

WHERE c1.club_id =”{c1_id}” and c2.club_id = “{c2_id}” and sm.status = “FT”

RETURN c1,c2,sm, side1, side2

ORDER BY sm.date DESC LIMIT 1

  • انجام پرس‌و‌جو و ساخت پاسخ
knowledge-graph-in-football-match

اگر علاقه‌مند شدید که در برنامه‌ها و اپلیکیشن‌های خود از گراف دانش استفاده کنید، می‌توانید نحوه نصب و راه‌اندازی و همچنین استخراج اطلاعات از گراف دانش، از طریق زبان برنامه نویسی پایتون را در ادامه ملاحظه نمایید.

نصب و راه‌اندازی Neo4j

  1. 1.      ابتدا از سایت Neo4j نسخه‌  Neo4j Community را دریافت و آن را از حالت فشرده خارج کنید :

tar -xf  neo4j-community-3.5.12.tar

  • برای اجرای سرویس به مانند زیر عمل کنید

cd neo4j-community-3.5.12

bin/neo4j start

  • برای توقف سرویس نیز می‌توانید به صورت زیر عمل کنید

bin/neo4j stop

چنانچه بخواهید می‌توانید از طریق داکر هم این سرویس را راه‌اندازی کنید.

sudo docker run –publish=7474:7474 –publish=7687:7687 \

    –volume=$HOME/neo4j/data:/data neo4j

پس از راه‌اندازی سرویس Neo4J می‌توانید از طریق آدرس زیر به داشبورد پایگاه داده متصل شوید و پرس‌و‌جوهای خود را در آن انجام دهید.

http://localhost:7474h

Neo4j-pannel

Neo4j Panel

پروتکل Bolt

پروتکل شبکه bolt یک پروتکل بسیار کارآمد و سبک وزن client-server است که برای برنامه‌های پایگاه داده طراحی شده است و امکان ارسال عباراتی (statement) که شامل یک رشته و مجموعه پارامترهای تایپ شده است را فراهم می‌کند. سرور به هر درخواست به صورت اختیاری نتایج پیشین یا پیام نتیجه را باز می‌گرداند.

نصب درایو‌های Neo4j

اتصال پایگاه‌داده Neo4j به زبان برنامه‌نویسی پایتون از طریق درایو‌ها (drivers) با bolt یا http انجام می‌شود.

نصب پکیج:

pip install neo4j

مثال:

from neo4j import GraphDatabase

driver = GraphDatabase.driver(“bolt://localhost:7687”, auth=(“neo4j”, “password”))

def add_friend(tx, name, friend_name):

    tx.run(“MERGE (a:Person {name: $name}) “

           “MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})”,

           name=name, friend_name=friend_name)

def print_friends(tx, name):

    for record in tx.run(“MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name “

                         “RETURN friend.name ORDER BY friend.name”, name=name):

        print(record[“friend.name”])

with driver.session() as session:

    session.write_transaction(add_friend, “Arthur”, “Guinevere”)

    session.write_transaction(add_friend, “Arthur”, “Lancelot”)

    session.write_transaction(add_friend, “Arthur”, “Merlin”)

    session.read_transaction(print_friends, “Arthur”)

    session.read_transaction(print_friends, “Arthur”)

 

اگر این مطلب برای شما مفید بود آن را با دوستان خود به اشتراک بگذارید.

نظر بدهید

چت بات

چت بات
گفتار به نوشتار
تشخیص چهره
اپراتور هوشمند