چکیده
امروزه هستانشناسیها که پایگاههای دانش مفهومی هستند، در سیستمهای اطلاعاتی کاربرد بسیاری دارند. ساخت انواع هستانشناسی برای انواع قلمروها و کاربردها فرآیندی پرهزینه و زمانبر است. خودکارسازی این فرآیند، گامی در جهت رفع گلوگاه کسب دانش در سیستمهای اطلاعاتی و کاهش هزینه ساخت آنهاست. در این طرح پزوهشی، ابتدا مروری بر وب و وب معنایی داریم و سپس هستیشناسی بطور کامل تشریح میشود. در ادامه یک سیستم تولید و نمایش آنتولوژی که شامل استخراج دانش مفهومی از متون زبان انگلیسی است ارائه میشود. برای استخراج دانش مفهومی از متون زبان انگلیسی از الگوهای هیرست و الگوی None Verb None استفاده میشود. این الگوها عمومی و پرکاربرد میباشند و در سطح جمله عمل میکنند.
فهرست مطالب
عنوان صفحه
فصل 1 : مقدمه 1
1-1- تاریخچه وب 1
1-2- مشخصات وب فعلى 1
1-3- قابلیت هاى وب فعلى 1
1-4- مزایاى وب فعلى 1
1-5- چرا وب فعلى کافى نیست؟ 1
1-6- اجزاء وب 1
1-7- سیر تکاملی وب 1
فصل 2 : وب معنایی 2
2-1- مقدمه 2
2-2- تعریف وب معنایی 2
2-3- تاریخچه وب معنایی 2
2-4- چهره وب معنایی 2
2-4- ایجاد وب معنایی 2
2-6- معماری وب معنایی 2
2-7- مولّفه های وب معنی نگر 2
2-7-1- XML 2
2-7-2- RDF 2
2-7-3- زبان هستی شناسی وب ((OWL)(Web Ontology Language) 2
2-7-4- منطق 2
2-7-5- برهان 2
2-7-6- اعتماد 2
2-8- جستجو در وب معنایی 2
فصل 3 : هستی شناسی 3
3-1- مقدمه 3
3-3- انواع هستی شناسی ها 3
3-4- معماری هستی شناسی ها 3
3-5- زبانهای بیان آنتولوژی 3
3-5-1- زبان OWL 3
3-6- نحوه ایجاد هستیشناسیها 3
3-7- استخراج دانش 3
3-7-1- مراحل و روش تحلیل 3
3-8- ابزار توسعه هستی شناسی ها 3
3-9- روشهای یکدست سازی هستی شناسی ها 3
فصل 4: سیستم تولید و نمایش آنتولوژی 3
4-1- مقدمه 3
4-2- مرحله شکستن وتشخیص نقش کلمات 3
4-2-1- مرحله شکستن 3
4-2-2- مرحله تشخیص نقش جمله 3
4-3- مرحله استخراج دانش مفهومی از متن 4
3-4-1- الگوهای هیرست 4
3-4-2- الگوی None Verb None 4
4-4- ساختن فایل XML 4
5: فصل 6: نتیجهگیری 4
منابع 4
ضمیمه : کدهای برنامه 4
فهرست شکلها
شکل2-1: پیشنهاد آقای Tim Berners-Lee در مورد وب 1
شکل2-2: سطوح مختلف هوشمندی داده 1
شکل2-3: معماری وب معنایی 1
شکل2-4: سهتایی ها در RDF 1
شکل 2-5: نمایش گرافی سند بالا 1
شکل2-6: نمایش گرافی مثال Reification 1
شکل2-13 : گراف مربوط به ma Yu-Yu در وب معنایی 1
شکل2-14: گراف مربوط به Eric Miller در وب معنایی 1
شکل2-15: نتیجه جستجو "Yo-Yo Ma" در سیستم ABS و "Eric Miller" در سیستم W3C Semantic Search 1
شکل3-1: نقش آنتولوژی در وب معنایی 1
شکل3-2: ارتباط نسخه های OWL بایکدیگر 1
شکل3-3 : متدلوژی ایجاد آنتولوژی 2
شکل3-4 : هرم تحلیل استخراج مفاهیم و روابط 2
شکل3-5 : تصویری از Protégé، ابزار مهندسی هستی شناسی 2
شکل3-6 : تفاوت میان عمل ادغام کردن (Merging) و هم ترازی(Alignment) . 2
فصل اول 1: مقدمه
وب جهان شمول٬ وب جهان گستر٬ تار جهان گستر٬ یا به طور ساده وب1 عمده ترین محیط خدماتی اینترنت است که امکانات چند رسانه ای برای دستیابی به داده ها٬ اطلاعات٬ و دانش را در اختیار کاربران قرار می دهد. واژهٔ وب (به معنی تار) در بسیاری از ترکیبات "اینترنتی" می آید. کم کم "وب" به عنوان واژهٔ بین المللی جا افتاده و به منظورهای مختلفی به کار می رود. این واژه معمولاً به صورت اشتباه به جای اینترنت به کار می رود اما وب در حقیقت یکی از خدماتی است که روی اینترنت ارایه می شود (مانند پست الکترونیکی).
وب جهان گستر، روشهای ارتباطی میان افراد با یکدیگر و روشهای تجارت را تحت تاثیر خود قرار داده است. این فناوری بر بطن انقلاب الکترونیکی استوار است که در حال حاضر سعی دارد در تغییر روند توسعه جهان امرروز به سمت اقتصاد بر پایه دانش و به طور گستردهتر یک نظام بر پایه دانش حرکت میکند.
همچنین ظهور چنین پیشرفتی باعث ایجاد تغییر تفکر بر دنیای کامپیوتر شده است. در ابتدا، کامپیوترها برای انجام محاسبات عددی مورد استفاده قرار میگرفتند. اما در حال حاضر، آنها حکمفرمای بی چون و چرای پردازش اطلاعات، برنامههایی که در اصطلاح به آنها پایگاه داده گفته میشود، پردازش متن و بازیها هستند.
در سالهای اخیر ما شاهد سرو صدای زیادی راجه به قابلیتهای جدید وب بودهایم. وب جهان گستر نسبتا یک فناوری جدید است که به طور مستمر و پیاپی در حال تکامل است.
وب معنایی2، یک انقلاب جدید در وب است که اجرای برنامههای بسیار مهیجتر از وب فعلی را وعده داده است. توصیف وب فعلی بحث راجع به محتوای وب معنایی را خواهد داد. وب فعلی بصورت پایهای، مشابه نشر رسانهای از کتابخانههای غولپیکر است و صفحات آن از زبانهایی مانند HTML که بر اساس فناوری mark up پیاده سازی شدهاند، بهره میبرند. دستیابی به این صفحهها با استفاده از URL انجام میشوند (مانند: http://www.w3c.org). ویژگی اصلی وب فعلی قادر ساختن افرادی است که مرورگرهایی همانند Internet Explorer برای دستیابی و نمایش صفحات HTML استفاده میکنند.
1-1- تاریخچه وب
ایده اولیه در مورد وب به سال 1980 برمی گردد. زمانی که در شهر سرن سوئیس، تیم برنرزلی3 شبکه ENQUIRE را ساخت (که به "Enquire Within Upon Everqthing CSS" اشاره داشت و همنام کتابی بود که وی از جوانی خود به یاد داشت. اگرچه آنچه وی ساخت با وب امروزی تفاوت های زیادی دارد اما ایده اصلی در آن گنجانده شده است (و حتی برخی از این ایده ها در پروژه بعدی برنرزلی پس از WWW یعنی وب معنایی به کار گرفته شد). در مارس 1989، برنرزلی یک پیشنهاد را نوشت که به ENQUIRE اشاره داشت و یک سیستم اطلاعاتی پیشرفته را توصیف می کرد. وی با کمک رابرت کایلا، پیشنهاد طراحی تور جهان گستر را در 12 نوامبر 1990 ارائه کرد. اولین مرور وب جهان توسط برنرزلی با عنوانNEXTcube مورد استفاده قرار گرفت و وی اولین مرورگر وب و تور جهان گستر را در سال 1990 طراحی کرد. در کریسمس 1990، برنرز لی همه ابزارهای لازم برای کار با وب را فراهم کرد.
در 6 آگوست 1991 وی خلاصه ای از پروژه تور جهان گستر را در گروه خبری alt.hypertext پست کرد. در همین روز وب به عنوان یک خدمات عمومی روی اینترنت ارائه شد. مفهوم مهم ابر متن در پروژه های قدیمی تر مربوط به دهه 1960 مانند Project Xanadu مربوط به تد نلسون و NLS (سیستم آنلاین) مربوط به داگلاس انگلبارت مطرح شد.
موفقیت برنرزلی در ایجاد ارتباط بین ابر متن و اینترنت بود. در کتاب "بافتن تور" وی اذعان می کند که بارها از امکان برقراری ارتباط میان دو تکنولوژی صحبت کرده بود اما چون کسی به حرف هایش توجه نکرد وی خودش دست به کار شد و پروژه را به سرانجام رساند. وی در سیستم خود شاخص های منحصر به فرد جهانی برای شناسایی منابع موجود روی وب و دیگر مکان ها در نظر گرفت و آنها را شناسه منبع یکپارچه نامید.
تور جهان گستر با بقیه سیستم های ابر متنی موجود تفاوت هایی داشت:
* WWW به لینک های یک طرفه نیاز داشت و نه دوطرفه بنابراین فرد می توانست بدون آن که از جانب مالک منبع واکنشی صورت گیرد به منبع دسترسی پیدا کند. همچنین ابر متن مشکل پیاده سازی سرورهای وب و مرورگرها (در مقایسه با سیستم ها قبلی) را برطرف کرد اما در مقابل مشکل زمان در لینک های قطع شده را ایجاد کرد.
* تور جهان گستر بر خلاف سیستم های قبلی مانند ابر کارت غیر انحصاری بود و این امکان را فراهم می کرد که سرورها و مرورگرهای مستقلی را ایجاد کرده و بدون هیچ محدودیتی آنها را به شبکه وصل کرد.
در 30 آوریل سال 1993، CERN اعلام کرد که تور جهان گستر به صورت رایگان برای همه افراد قابل دسترسی است. این موضوع دو ماه پس از اعلام رایگان نبودن پروتکل گوفر مطرح می شد و در نتیجه تمایل به وب به شدت افزایش یافت. قبل از آن مرورگر وب معروفی به نامViolaWWW وجود داشت که بر اساس ابر کارت کار می کرد. نسخه گرافیکی تور جهان گستر با نام مرورگر وب موزائیک در سال 1993 توسط مرکز ملی برنامه های سوپرکامپیوتر که توسط مارک اندرسن راه اندازی شده بود مورد انتقاد شدید قرار گرفت. قبل از عرضه موزائیک، گرافیک و متن در صفحات وب از یکدیگر جدا بودند و در پروتکل های اینترنتی قبلی مانند پروتکل گوفر و مرور اطلاعات ناحیه وسیع گرافیک کاربرد زیادی نداشت. واسط کاربر گرافیکی موزائیک وب را به مشهورترین پروتکل اینترنتی تبدیل کرد.
سیر تکاملى وب فعلى یکى از مهمترین دستاوردهاى قابل توجه فناوری در تاریخ است. استانداردسازى پروتکل ها مثلاًً TCP/IP و زبان هاى همانند HTML و XML یک انقلاب براساس فناوری را فراهم کرد؛ چراکه قابلیت ارتباط دوطرفه در لایههاى فناوری را فراهم کرد؛ چراکه قابلیت ارتباط دوطرفه4 در لایههاى مختلف معمارى شبکه لایهاى وب فعلى تضمین شده بود.
1-2- مشخصات وب فعلى
وب فعلى از جنبه هاى گوناگونى مورد بررسى قرار گرفته و توصیف شده است. وب فعلى تا حدى در دسترس قرار گرفته و در همه جا حاضر است که ما اغلب فراموش مى کنیم چگونه براى دستیابى به اطلاعات، اجراى تراکنش ها و ارتباطات به آن استناد مى کنیم. از مشخصه هاى وب جارى مى توان به قابلیت ها، مزایا و پشتیبانى از برنامه ها اشاره کرد.
1-3- قابلیت هاى وب فعلى
در تعریف ابتدایى، وب کنونى به صورت یک مجموعه مختلف با تمرکز بر سند محورى مشخص مى شود و صفحات HTML توزیع شده، فراپیوندى است که قالب آن براساس یک مخزن مجازى از اطلاعات تعبیه مى
شود. محتواى نامتمرکز میلیونها صفحه وب به طور یکسان و با افزوده شدن محتواى جدید به آن در حال رشد است. پراکندگى جغرافیایى نویسندگان باعث تولید و نگهدارى این صفحات با کمک ابزارهاى ساده نگارش و بدون حتى یک سیستم مجوز کنترل مرکزى انجام مى شود. نرمافزارها به صورت خودکار محتواى وب فعلى را در لحظه درخواست از پایگاه هاى داده تولید مى کنند. ارتباط صفحات HTML با استانداردهاى باز فراهم شده است، به گونهاى که برخى از آنها با کمک کنسرسیوم شبکه ارتباط جهانى (W3C)) مدیریت شدهاند. صفحات HTML مى توانند با کمک مرورگرها و در انواع مختلف دستگاه هاى الکترونیکى که تقریباً در هر مکان و هر زمان یافت مى شوند، مشاهده شوند. این صفحات به صورت ابتدایى براى دستیابى افراد و قابلیت خواندن آنها در نظر گرفته شدهاند.
1-4- مزایاى وب فعلى
وب کنونى به سرعت مشهور شد، چراکه قادر بود تمام نیازهاى کاربران را فراهم ساخته و مزایاى عمدهاى را در اختیار آنها قرار دهد. خط مشى وب فعلى در به اشتراکگذارى اطلاعات فراتر از استفاده در شبکه هاى خصوصى و واسط هاى نقطه به نقطه5 بود. وب فعلى زمان دستیابى به اطلاعات و زمان هاى اجراى تراکنشها را کاهش داد. وب فعلى بهاى تراکنش ها را ارزان تر کرد، این جمله بیان مى کند که با کمک سرویس هاى درونى که جزئى از ذات وب فعلى هستند، اجراى تراکنش ها آسان تر، دسترسى به آنها سهل تر و بهایى که کاربران باید براى اجراى آنها چه از لحاظ زمانى و چه از لحاظ مالى پرداخت کنند را کاهش داده است .همچنین به صورت مجازى، ارزش ارتباطهاى فرا رسانهاى به جهان را رفع کرده است، تا آنجاکه بسیارى از جوامع از مزایاى آن بهره مند شدها ند. به عنوان مثال، جنبش منابع باز6 با کمک وب فعلى، صاحب اختیار و قدرت بسیار شد و پیامد آن ضعیفتر شدن هزینه توسعه برنامه هاى کاربردى و فلسفه براساس وب ابتدایى و به اشتراک گذارى اطلاعات بود.
1-5- چرا وب فعلى کافى نیست؟
اگرچه وب فعلى به درستى مشابه یک افسانه و غیرقابل باور است، اما با تمام این اوصاف، یک ساختار مناسب و کافى براى پشتیبانى پیشرفته از پردازش کامپیوترى محتواى صفحات وب ارائه نکرده است. ما براى
تجارت و مدیریت زندگى خود به طرز فزایندها ى به وب فعلى وابستهایم، اگرچه اتصال اطلاعات موجود در وب فعلى به سایر اطلاعات براى اجازه اجراى پرس وجوهاى پیچیده7یا به روزرسانى آنها کافى نیست. ما براى ارائه بهتر اطلاعات در وب فعلى، نیازمندیم تا برنامه هاى پیشرفته ترى را براى آن تهیه و تدارک ببینیم. در واقع، سادگى وب جارى باعث رشد روزافزون آن شده است. اسناد HTML با کمترین محدودیتى در نحو سند8 به آسانى نوشته مى شوند. با این حال، نتیجه این سادگى تاثیر به سزایى در پیاده سازى نرمافزارهایى که وظیفه دستیابى کارآمد به این گونه صفات را دارند، خواهد داشت. تا اینجا، افراد و نرمافزارها، تکنیکهاى mark up کردن اسناد HTML را به صورت ابتدایى و با کمک دستورات قالببندى اجرا کردها ند. اما آن چیزى که وجود آن بسیار ضرورى به نظر مىرسد، اطلاعات اضافى است که مفهوم معنى اطلاعات را تعبیه کند. معانى9 براى تشریح، تفسیر و تعبیر به صورت خودکار درآمده و در محتواى وب ساختیافته بسیار موردنیاز هستند. وب فعلى میتواند با اصلاح و بهبود اطلاعات ساخت یافته، توسعه پیدا کند، همچنین از ابرداده ها براى جست وجو و کشف اطلاعات بهره برده و در نهایت به صورت صریح و آشکارا، به آن معنا اعطا کند.
بیشتر محتواى وب کنونى براى مصرف افراد تعبیه شده است. حتى محتواى وب که به صورت خودکار از پایگاه هاى داده تولید مى شود نیز ساختار اصلى اطلاعات واقعى موجود در پایگاه هاى داده را نمایش نمى دهد. امروزه بیشتر کاربرد اصلى فناوری وب به استفاده افراد از امکانات جست وجو و استفاده از اطلاعات جست وجو، برقرارى تماس با سایر افراد، دوباره خوانى فهرست هاى ذخیره شده به صورت online سفارش محصولات با استفاده از پر کردن فرم هاى مخصوص و بازدید اجناس تهیه شده خلاصه مىشود.چنین فعالیت هایی به صورت خاص و با شیوه درست توسط برنامه هاى نرمافزارى پشتیبانى نمىشوند.
1-6- اجزاء وب
* ابر متن10 : فرمتی از اطلاعات که به افراد اجازه می دهد تا در محیط کامپیوتر با استفاده از ارتباط داخلی موجود میان دو متن از بخشی از سند به بخش دیگری از آن یا حتی سند دیگری مراجعه کنند و به اطلاعات جدیدی دسترسی پیدا کند.
* URL: شناسه های منحصر به فردی که برای مشخص کردن محل حضور اطلاعات موجود روی شبکه (فایل کامپیوتری ، سند یا منابع دیگر) به کار می روند.
* مدل یا مشتری-خدمت گزار11: سیستمی که در آن نرم افزار یا کامپیوتر مشتری از نرم افزار یا کامپیوتر خدمت گزار تقاضای دریافت منابع اطلاعاتی مانند داده یا فایل می کند.
* زبان علامتگذاری12 : کاراکترها یا کدهای موجود در متن که ساختار متن وب معنایی را مشخص می کنند.
1-7- سیر تکاملی وب
1. وب ۱٫۰ : وب ۱٫۰ بسیار محدود و ساده بود، و تنها تعدادی نسبتاً اندک از موسّسات گوناگون، دانشگاه ها، مراکز تبلیغاتی و غیره به ایجاد مطلب و محتوا بر روی آن مبادرت می نمودند. این، در حالی بود که کاربران در وب ۱٫۰ تنها امکان دسترسی به اطّلاعات موجود و استفاده از آن ها را داشتند و توان ایجاد و یا تغییرآن را نداشتند.
2. وب ۲٫۰ : طرّاحی و معماری وب ۲٫۰ بر پایه مشارکت ها، همکاری ها، و تعاملات13 انسان ها، ماشین ها، نرم افزار، و عامل های هوشمند با یکدیگر استوار است. در وب ۲٫۰، کاربران قادرند خود به ایجاد و خلق محتوا اقدام نمایند، آن را ساماندهی و تنظیم کنند، دیگران را در اطّلاعات و داشته های خود شریک و سهیم سازند، و یا به انتقاد و تغییر بپردازند.
3. وب ۳٫۰ : وب ۳٫۰ مرحله و نسخه جدید از آینده وب جهان گستر است. از عبارت وب ۳٫۰ برای توضیح و معرفی نسل سوم وب استفاده می شود. وب ۳٫۰ همانند وب ۲٫۰ در پی آن است تا در اینترنت نوآوری ایجاد نماید. منظور از نسخه بندی وب، این نیست که وب را شرکت خاصی در نسخه های متعدد منتشر می سازد؛ بلکه نسخه بندی وب برای بیان نسل های مختلفی که وب پشت سر می گذارد، استفاده می شود. بسیاری بر این باورند که فناوری های پدیدآمده جدید مانند وب معنایی در دستور کار وب ۳٫۰ قرار خواهد گرفت. نظریه های دیگر براین باورند که نرم افزارهای تحت وب ۳٫۰ موجب استفاده از اینترنت پرسرعت در میان مردم خواهد شد.
4. وب معنایی : وب معنایی در فصل دوم بطور کامل تشریح میشود.
فصل دوم : وب معنایی (Semantic Web)
2-1- مقدمه
با توجه به گسترش روز افزون اطلاعات در وب و نیازهای جدید بوجود آمده، محققان به این نتیجه رسیده اند که با استفاده از تکنیک های کنونی مورد استفاده در وب، نیازهای انسانها به طورکامل پاسخ داده نمی شود و در حقیقت وب راه زیادی را تا رسیدن به پتانسیل کامل خود داراست. ساده و قابل فهم بودن وب کنونی این امکان را فراهم کرده تا سازمانها و گروههای مختلف بتوانند اطلاعات خود را در آن قرار دهند و این امر باعث توسعه شگفت انگیز وب گشته است. هدف اول توسعه دهندگان وب نیز این بود که وب را فراگیر کنند. اکنون ذخیره سازی و انتشار اطلاعات با سهولت انجام می شود اما این نوع ذخیره سازی مشکلات زیادی را برای بازیابی و استفاده های بعدی از اطلاعات به وجود آورده است. این مشکلات در مواردی مانند جست و جو، بازیابی، ترکیب و مبادله اطلاعات در وب وجود دارد. راه حل این موضوع تغییر تفکر نسبت به داده ها و پیشرفت آنها در جهت هوشمندی و همچنین بیان آنها در ساختار معماری وب معنایی قبل از انتشارشان است. هدف وب معنایی این است که وب را بیش از آن که به شبکه ای از مدارک تبدیل کند به شبکه ای از داده ها تبدیل نماید.
منابع وبی نباید شامل رشته های یکپارچه متنی باشند بلکه انها باید قادر باشند که معنای موجود در متن خود را نیز آشکار سازند. البته منظور از معنا عبارت است از معنایی که توسط ماشین قابل پردازش باشد. برای نیل به هدف فوق وب معنایی باید بین تصورات و واقعیت های موجود در منابع وبی تعامل برقرار نماید در واقع همانطور که ما در دنیای حقیقی نیاز به زبان مشترک برای انتقال مفاهیم و معانی داریم در دنیای مجازی نیز نیاز به آن احساس می شود. وب معنایی به عنوان یک راه حل برای این مشکلات به وجود آمده است که هدف از آن به اشتراک گذاشتن اطلاعات در وب به صورتی هوشمند تر است به صورتی که نه تنها قابل فهم برای انسان باشند، بلکه ماشین ها نیز توانایی فهم آن را داشته باشند. متاسفانه وب معنایی به آن سرعت که انتظارش می رفت به ملثه ظهور نرسید. فعالیت های استانداردسازی قابل توجهی در کنسرسیوم وب جهان گستر در حال ظهور است اما استفاده واقعی از تکنیک وب معنایی اندک است. بخشی از این مسئله به پیچیدگی مدل زیربنایی و این حقیقت که هنوز ما فاقد برنامه های کاربردی ای هستیم که به اندازه کافی این نوع پیچیدگی را پنهان نمایند بر می گردد.
2-2- تعریف وب معنایی
وب معنایی یا وب معنی نگر14را می شود فضایی جهانی از جنس محاسبات هوشمند ماشینی تصوّر کرد که در آن تمامی کتاب ها، کتاب خانه ها دانشها، دانش نامه ها و پایگاه هایدانش15 به صورتی معنی گرا و با توانایی درک مفهومی همدیگر در کنار هم قرار خواهند گرفت. آقای تیم برنرز لی، که معروف به پدر وب است، آینده وب را
بصورتی بیان کرده که بر خلاف وب کنونی فقط توسط انسانها قابل فهم نباشد بلکه توسط ماشین ها نیز قابل درک و پردازش است. ایده وب معنی نگر نیز از همین نکته منشا می گیرد.
در زیر سه تعریف مختلف از وب معنایی ارائه شده است:
* پروژه ای با هدف ایجاد رسانه ای جهانی برای رد و بدل کردن اطلاعات بصورتی که برای کامپیوتر قابل فهم و پردازش باشد.
* وب معنی نگر، شبکه ای از اطلاعات در مقیاس جهانی است به نحوی که پردازش آنها توسط ماشین ها به سادگی امکان پذیر است.
* وب معنی نگر شامل داده های هوشمند وب است که توسط ماشین ها قابل پردازش است.
هر چند نزدیکی به تحقّقّ ایجاد چنان فضایی محتاج پیشرفت هایی جدید و کلّی نگرانه در بسیاری از زمینه های مهندسی، ریاضی، هوش مصنوعی16، و به ویژه در زبان شناسی، فلسفه، و بسیاری از معارف دیگر انسانی خواهد بود، گام های اوّلیّه در این سمت برداشته شده است.
شکل2-1: پیشنهاد آقای Tim Berners-Lee در مورد وب
2-3- تاریخچه وب معنایی
اصطلاح وب معنایی توسط آقای تیم برنرزلی17 معروف و مشهور شد. دیدگاه ها و چشما ندازهای او به عنوان مخترع وب فعلی و نقش ارزندها ش به عنوان مدیر W3C بسیار پراهمیت و با ارزش تلقی شده و مورد احترام هستند. رویاهای او وبی را تصور میکند که نسبت به وب فعلی اجازه پردازش پیشرفته تری را به کامپیوترها اعطا میکند. به منظور پشتیبانی از دیدگاه های او، در سالیان متمادی، بسیاری از محققان در حال تحقق رویای او به واقعیت بودهاند. بیشتر تحقیقات انجام شده روی زبان های تشریح معانی متمرکز بودها ند. وزارت دفاع امریکا از طریق سازمان آژانس محصولات تحقیقی پیشرفته دفاعی DARPA روی تحقیقات در زمینه وب معنایی سرمایه گذاری فراوانی انجام داده است. DARPA در تحقیقات اولیهای که در ارتباط با مفاهیم اینترنت در بهبود عملکرد وب فعلی بود نقش به سزایی را بازی کرد. اولین مشارکت DARPA در فناوری وب معنایی باعث تولید زبان DARPA Agent Markup یا به اختصار DAML شد. DAML باعث شد تا تعاریف حیاتی مفاهیم وب معنایی تحقق یابند. از طرف دیگر، اتحادیه اروپا18 نیز وعده کار روی فناوری وب معنایی را داد. محققان اتحادیه اروپا نیز همانند محققان امریکایی پتانسیل یکسانی را در جهت گسترش تحقیق روی ontology ها که همان ارائه دهندگان صریح معانی اطلاعات هستند، صرف کردند.
تیم برنرزلی مسیر آینده وب معنایی و دیدگاه هایش برای درک بیشتر داده ها توسط کامپیوترها و ارائه آنها به عنوان منابع تحت وب که او آنها را وب معنایی مینامد، ارائه کرده است. آقای لی دیدگاه هایش در ارتباط با وب معنایی را در سخنرانی کنفرانس XML سال 2000 میلادی ارائه کرده است. دیدگاه های او برپایه ارائه اطلاعات ساخت یافته در وب که توسط کامپیوترها قابل درک هستند، ارائه شده است.
2-4- چهره وب معنایی
وب معنایی چهره جدیدی برای تحول بعدی در وب است. همانند بسیاری از فناوری های تازه، وب معنایی نیز به عنوان راه حلی در صنعت IT دنیا عرضه شده است. وب معنایی را با نام نسل بعدی وب می شناسیم. کم و بیش وب معنایی با عنوان پایگاه داده توزیع شده شیگرای بسیار بزرگ با قابلیت درک توسط کامپیوتر شناخته و معرفی می شود.
وب معنایی یک شبکه ارتباطی جهانی از اطلاعات به هم پیوسته و قابل درک برای کامپیوترها ارائه می دهد. این قابلیت رویای او تنها به متصل کردن اسناد تحت وب، همان گونه که در فراپیوندهای وب فعلی مشاهده می
شوند، خلاصه نمی شود بلکه او به نرمافزارهایی میاندیشد که قادرند معانی موجود در اطلاعات داخل این اسناد را نیز درک کنند. وب معنایی با جایگزین کردن یک زبان جدید به جای HTML و XML نسل جدید وب را به ارمغان خواهد آورد. وب فعلی به صورت نمایی رشد پیدا کرده است و این رشد با انتشار اسناد HTML در وب، صورت گرفته است. ارزش پدیدار شده برای نویسندگان صفحات وب با گسترش روز افزون اسناد مرتبط با هم به صورت یک طرفه و جست وجوی آنها به کمک موتورهای جست وجو معرفی شده است.
به طور مشابهی، بسیاری از افراد اطلاعات خود را با کمک زبان وب معنایی Markup می کنند و بسیاری دیگر اطلاعات خود را برای وب معنایی تهیه میکنند. وب معنایی درگیر تولید شکل جدیدی از محتویات وب به گونها ی که برای کامپیوترها معنیدار باشد، است. وب معنایی انقلاب جدیدی در صنعت نرما فزار به وجود خواهد آورد، به گونهای که بار دستکاری اطلاعات را بر دوش نرمافزار خواهد انداخت.
چنین قابلیت هایی باعث ارائه بهتر، سریع تر و ارزان تر اطلاعات خواهند شد. وب معنایی برنامه های کاربردی با قابلیت بسیار بالاتری ارائه می دهد که پیش تر امکان آن وجود نداشت. افراد قادر خواهند بود تا برنامههای خود را با کمک فناوری وب معنایی سریع تر اجرا کنند. به عنوان مثال، نرمافزارهای جست وجوگر قادر هستند تا جواب دقیق و نه تنها صفحهای که ممکن است شامل داده مورد درخواست باشند را ارائه دهند. کاربران به صورت ماهرانه نیازمند هدایت برنامه های کاربردی در جهت نیل به اهداف خود نخواهند بود (به عنوان مثال، جست وجوی پایین ترین قیمت در منوی یک رستوران). هدف اصلی وب معنایی، کاهش ارزش اجرای کارهای هر کاربر است.
2-4- ایجاد وب معنایی
قدم اول در ایجاد وب معنایی تغییر تفکر نسبت به داده هاست. داده ها در وب معنایی می بایست هوشمندتر باشند تا توسط ماشین ها قابل درک باشند. به این معنی که می بایست مفاهیم بیشتری همراه با داده ها ذخیره کرد که ماشین ها توانایی درک آنها را داشته باشند.
پیاده سازی دیدگاه های وب معنایی نیازمند تولید اطلاعات ساختیافتهی است که با استانداردهای ارائه موافق هستند چندین مرحله در توسعه ارائه اطلاعات وجود دارند. این مراحل باید شامل تولید قلمرو و حوزه، اجرای تحلیل نیازمندی ها، تعریف عبارت ها و ارتباط میان آنها، به کد در آوردن لغات و ارتباط میان آنها با کمک زبان وب معنایی و انتشار اطلاعات در سرورها باشند.
در شکل 2-2 سطوح مختلف داده هوشمند نشان داده شده است. این روند به داده هایی که مفاهیم کافی برای درک توسط ماشین ها در خود دارند ختم می شود.
* متن و پا یگاه داده (قبل از XML): این داده ها بصورتی ذخیره شده اند که قابل فهم توسط برنامه خاصی هستند بنابراین در این سطح هوشمندی در برنامه ها قرار دارد نه در داده ها.
* اسناد XML جهت دامنهای خاص: در این سطح دادهها مستقل از برنامهها در دامنه خاصی هستند. بنابراین داده ها به سطحی از هوشمندی رسیدهاند که میتوان آنها را بین برنامههای مختلف که در دامنه خاصی کار می کنند، استفاده کرد.
* طبقهبندی و اسناد با واژگان آمیخته: دراین سطح میتوان دادهها را در دامنههای مختلف استفاده کرد و آنها را بصورت ساختار سلسله مراتبی منظمی طبقهبندی کرد. در این سطح میتوان با استفاده از روابط ساده ا ی که بین طبقههای مختلف در ساختار مورد نظر تعریف شده، ترکیب کرد. در این سطح دادهها آنقدر هوشمند هستند که میتوان آنها را با دادههای دیگر ترکیب کرد.
* آنتولوژی19 و قواعد: در این سطح دادههای جدیدی را میتوان از دادههای موجود و با کمک قواعد منطقی تعریف شده بدست آورد. بنابراین در این سطح می توان داده ها را با روابطی دقیق تعریف کرد و بر روی آنها محاسبات منطقی انجام داد.
شکل2-2: سطوح مختلف هوشمندی داده
2-6- معماری وب معنایی
به منظور ایجاد یک محیط معنایی برای وب و همچنین رسیدن به اهداف در نظر گرفته شده و رفع مشکلات مانند جست و جو، بازیابی، ترکیب و مبادله اطلاعات در محیط کنونی وب، "معماری هفت لایه وب معنایی" توسط کنسرسیوم جهانی وب20 مطرح شده است.
توجیه عملی چنین روشی این است که یک اجماع کلی و دسترسی آسان در ساخت آن نقش داشته است و این در حالی است که اگر غیر از این بود، دستیابی به آن با مشکلات فراوانی روبه رو می شد. به صورت عادی، چندین گروه پژوهشی در مسیرهای مختلف آن در حال فعالیت هستند. چنین رقابتی از ایده ها در سطح کلان، باعث پیشرفت علمی خواهد شد. اما به هرحال، از دیدگاه مهندسی نیاز به استانداردسازی است. بنابراین، اگر
اکثر پژوهشگران در پذیرش یک واقعیت هم فکر و در رد سایر مواردمخالف بودند، چنین توافقاتی باعث پذیرش یا رد اصطلاحات جدید می شود. از این طریق، اگر حتی تلاش یک گروه پژوهشی با شکست مواجه شود، حداقل دستاورد مثبتی برای سایر گروه ها خواهد داشت.
در ساخت یک لایه در بالای لایه دیگر در وب معنایی، دو اصل مهم زیر باید رعایت شوند:
* سازگاری متمایل به پایین21
لایه های بالاتر باید با حفظ سازگاری با لایه های پایین تر ایجاد شوند و Agent ها باید به طور کامل از لایه ها آگاهی داشته و از اطلاعات ارائه شده در لایه های پایین تر استفاده کنند. به عنوان مثال Agent های براساس زبان OWL در وب معنایی، می توانند از مزایای اطلاعات نوشته شده به زبان های RDF و RDFS بهره مند شوند.
* درک جزئی رو به بالا
از طرف دیگر عاملهای22 کاملاً مطلع از لایه ها باید حداقل جزئی از مزایای اطلاعات ارائه شده در لایه های بالاتر را درک کنند. به عنوان مثال، یک عامل که فقط از معانی RDF و RDFS مطلع است، می تواند دانش موجود در لایه OWL را به صورت جزئی تفسیر کند. این کار میسر نمیشود مگر با نادیده گرفتن اصولی که در آن سوی RDF و RDFS قرار دارند.
لایههای مختلف معماری وب معنایی در شکل 2-3 نشان داده شده است. این شکل با استفاده از دیدگاه تیم برنرزلی تشکیل شده است که لایه های اصلی وب معنایی و دیدگاه آن را به نمایش درآورده است.
شکل2-3: معماری وب معنایی
در پایین ترین لایه این شکل XML Unicode و URI و XML Namespace و XML Schema دیده می شوند.
23URI یک اصل پایهای وب معنایی می باشد که قابلیت نام گذاری و تشریح هر چیز به هر کس را به وجود می آورد. URI ها به همراه معنای نام XML (XML Namespace) از جمله ویژگی های مورد استفاده در ساخت ارائه اطلاعات هستند. مثلاًًًً به آدرس http://www.w3c.org یک URI گفته می شود. اما از طرف دیگر Unicode می تواند به عنوان یک واحد استاندارد برای ذخیره، پردازش و نمایش اطلاعات به کار رود. نرمافزارهای متفاوت، با فرمت های مختلف، اطلاعات قابل توجهی را پردازش میکنند. حال آنکه اگر این فرمت ها شکل استاندارد و یکسانی به خود نگیرند، در تعامل با سایر نرمافزارها که در حوزه های دیگر در حال اجرا هستند با مشکلات فراوانی از جمله مبادله اطلاعات مواجه خواهند شد این مشکل زمانی بیشتر نمود پیدا می کند که بحث شبکه جهانی اینترنت نیز به میان آید و اگر در ذخیره، بازیابی، پردازش نمایش و به طور کلی مبادله اطلاعات از یک استاندارد خاص استفاده نشود، مشکلات فراوانی به دنبال آن ایجاد خواهد شد. استاندارد
Unicode استاندارد کدگذاری کاراکترها است که برای پردازش کامپیوتری متون به کار می رود. به طور خلاصه Unicode امکان کدگذاری همه کاراکترهای موردنیاز در زبان های دنیا را تدارک دیده است.
2-7- مولّفه های وب معنی نگر
2-7-1- XML
زبانی است که اجازه ساخت اسناد وب ساخت یافته باکمک واژگان تعریف شده توسط خود کاربر را به افراد اعطا می کند. XML یک استاندارد صنعتی قدرتمند و انعطاف پذیر برای انتقال اطلاعات ساخت یافته است. به این معنی که مثلا در شرح یک کتاب می توان عنوان را به عنوان یک بخش اطلاعاتی عنوان کرد، روشن است این نام در خارج از متن کتاب فاقد معنا و مفهوم است. این نام می تواند عنوان کتاب، شخصیت اول، بخشی از بیوگرافی و یا نام نویسنده باشد، که فقط با بررسی ساختار نوشتار کتاب می توان معنی دقیق آنرا تعیین کرد. این زبان توسط کنسرسیوم شبکه جهانی به عنوان ابزاری برای به اشتراک گذاردن اطلاعات از طریق اینترنت ارائه شده است. XML به طراحان و تولیدکنندگان وب امکان می دهد تا برچسب هایی ایجاد نماییند که انعطاف پذیری آنها در سازماندهی و نمایش اطلاعات بیشتر از سیستم هایی است که با HTML تهیه می شوند. این زبان همانند HTML یک زبان نشانه گذاری عمومی استاندارد است که به صورت ویژه برای ایجاد صفحات وب طراحی شده، با این تفاوت که XML بر خلاف HTML که تنها به قالب بندی سند یعنی تعیین ساختار و ظاهر آن می پردازد، امکان توصیف محتوای صفحات وب را با استفاده از ابرداده ها فراهم می کند و نیز به کاربر اجازه می دهد تا بنابر نیاز، علائم نشانه گذاری جدیدی تعریف کند. تکامل زبانهای نشانه گذاری و ترویج استفاده از XML در خلق صفحات وب به تدریج زمینه ارتقای کیفی خدمات وب معنایی را فراهم می کند.
در حقیقت تیم برنرزلی با تکیه بر XML و برخی فناوری های دیگر که تحت هدایت کنسرسیوم وب در حال توسعه هستند، ایده وب معنایی را به عنوان نسل آینده وب مطرح کرده است. عناصر XML گسترش پذیر و مرتبط هستند که قواعد نام گزاری ساده ای دارند. همچنین اسناد XML برای انتقال اطلاعات بیشتر می توانند گسترش داده شوند. عناصر XML بصورت والدین و فرزند با هم مرتبط هستند. برای درک XML باید بدانیم چگونه ارتباط ما بین عناصر XML نامگذاری و چگونه مندرجات عناصر توصیف می شوند. همچنین عناصر می بایست برچسب پایانی داشته باشند و به طور مناسبی جاگذاری شوند.
2-7-2- RDF
RDF که زبان پایه استفاده شده در وب معنایی است بر پایه XML بنا نهاده شده اند. XML نیز خود بر اساس Unicode و URI بنا نهاده شده است بنابراین از زبانهای مختلف پشتیبانی می کند. از URL نیز برای مشخص کردن مفاهیم در وب معنایی استفاده می شود. برای مثال URL نوعی URI است که برای مشخص کردن منابع در وب استفاده می شود.
اسناد RDF در واقع حاوی توضیحاتی در مورد اطلاعات در وب معنایی هستند به نحوی که آنها را قابل درک برای ماشین ها می کند. اما آنچه که آنرا با XML متفاوت می کند آن است که بجای برچسب گزاری بخش داخلی یک سند اطلاعات خارجی درباره آن سند نیز می تواند برچسب گذاری شود. مثلا در مورد کتاب: نویسنده، تاریخ نشر، دسته بندی موضوعی و…قابل انجام است. و همچنین یکی از موارد استفاده از RDF توضیح منابع غیر شفاهی24 مانند عکس و صداست.
هر عبارت RDF به صورت سه قسمت فاعل، گزاره و مفعول و یا بسته به فعل مورد استفاده، گزرا به مسند بیان می شود. گزاره و فاعل خود از نوع منبع هستند و مغعول و یا مسند نیز می تواند از نوع منبع یا رشته ای ثابت باشد. گاها به عبارات Rdf سه گانه (Triple) نیز گفته می شود.علت این است که هر عبارت rdf شامل سه قسمت است.
شکل2-4: سهتایی ها در RDF
برای مثال به جمله زیر توجه کنید:
Buddy Belden owns a business
The business has a web site
Buddy is the father of Lynne
این جملات ممکن است در اسناد یا نامه های یک شرکت موجود باشد و در صورت بیان آنها به صورتی استاندارد می توان از آنها به عنوان دانش در شرکت استفاده کرد. این روش مدیریت دانش به صورت پایین به بالا است. جملات بالا را می توان به صورت سه تایی های زیر مطرح کرد:
/<#buddy><#owns><#business> /<#business><#has-website> /<#buddy><#father-of><#Lynne>
سه تایی های بالا به زبان N3 مطرح شده اند و علامت # نشان می دهد که URI مفهوم مربوطه، سند جاری می باشد. ابزارهایی برای تبدیل N# به RDF نیز وجود دارد. برای مثال می توان ابزار Jena که توسط شرکت Hewlett-Packard ارئه شده است را نام برد. همچنین ابزار هایی جهت نمایش اسناد RDF به صورت گرافی وجود دارد. از این قبیل ابزارها می توان به IsaViz ارائه شده توسط w3c اشاره کرد.
2-7-2-1- قابلیت های RDF
RDF قابلیت های زیادی را جهت ارائه دانش به ما می دهد که در ادامه برخی از آنها شرح داده می شود. Container یکی از این قابلیت ها است که جهت مدل کردن گروهی از منابع به کار می رود.
برای مثال جمله "The people at the meeting were Joe, Bob, Susan and Ralph" را در نظر بگیرید . نمایش RDF آن به صورت زیر است:
همانطور که مشاهده می شود، برچسب rdf:Description نشان دهنده فاعل، گزاره attendeesمیباشد و مفعول خود مجموعه ای از منابع است. نمایش گرافی سند RDF بالا بصورت زیر است:
شکل 2-5: نمایش گرافی سند بالا
Container در RDF سه نوع مختلف هستند:
* Bag (rdf:bag): جهت نشان دادن مجموعه ای بدون ترتیب که میتواند شامل عناصر تکراری هم باشد.
* Sequence (rdf:seq): جهت نشان دادن مجموعهای که ترتیب در آن مهم است و میتواند عناصر تکراری هم داشته باشد.
* Alternate (rdf:alt): جهت نشان دادن انتخابی از چند مقدار یا منبع بکار میرود. در مواقعی کاربرد دارد که می خواهیم مقادیری که یک متغیر به خود میگیرد را به چند مقدار مشخص محدود کنیم.
قابلیتهای دیگر RDF امکان بیان جملهای است که خود مفعول جمله دیگر است، که به این قابلیت Reification میگویند. برای مثال جمله زیر را در نظر بگیرید:
Jane has tested Mary's web page and asserts that it passes the accessibility tests"
مثال بالا شامل دوجمله است که یکی مفعول دیگری است. نمایش گرافی جمله بالا به صورت زیر است:
شکل2-6: نمایش گرافی مثال Reification
همانطور که در شکل 2-6 ملاحضه میکنید، جمله دوم بصورت فاعل، گزاره و مفعول مدل شده است سپس خود مفعول جمله اول معرفی شده است.
2-7-3- زبان هستی شناسی وب ((OWL)(Web Ontology Language)
زبان هستی شناسی وب زبانی است نشانه ای25 جهت نشر و تبادل دانش در فضای اینترنت. این زبان وسیله ای به نام هستی شناسی26 را مورد استفاده قرار می دهد. هستی شناسی هم نام شاخه ایست از فلسفه، و هم بخشی است از علوم رایانه که با رشدی سریع در حال پیدایش و گسترش است. این زبان بطور کامل در فصل سوم شرح داده خواهد شد.
2-7-4- منطق27
یک قانون امکان یکسری از نتایج را از فرضیات قبلی فراهم می کند. شکل کلی آن به صورت زیر می باشد:
If p is True Then q I True
در کل یک قانون یک عملی را از یکسری از شرایط برقرار تعیین می کند. منطق نیز رشته ای است که اصول استدلال را مطالعه می کند. با استفاده از منطق می توان دانش غیر صریح در آنتولوژی ها را به دانش صریح تبدیل کرد. البته می بایست توجه شود که منطق هیچ پیش فرضی را در ارتباط با صحت گذاره ها نمی سازد. بدین معنا که اگر ورودی های غلطی را وارد منطق کنیم خروجی ما نیز غلط خواهد بود.
2-7-5- برهان28
در بحث proof سیستم های proof می بایست عمیق و کامل باشند. عمیق بودن بدین معناست که تمامی عبارات استخراج شده از فرضیات منطقی دنبال شده باشند و کامل بودن یعنی تمامی نتایج منطقی از فرضیات را بتوان در سیستم های proof استخراج کرد. منطق گذاره ای از لحاظ عمیق و کامل بودن سیستم proof یگانه است. منطق هایی با قدرت بیان بیشتر چنین سیستم proof ای ندارند. زبانهای "rdf" و "owl lite" و "owl dl" را می توان مختص منطق گذاره ای دانست. زیرا آنها یک زیر مجموعه ای از منطق گذاره ای را شامل می شوند که هم قدرت بیان و هم قدرت استدلال مناسبی دارند، در واقع owl lite و owl dl تقریبا متناسب با منطق توصیفی که یک زیر مجموعه ای از منطق گذاره ای است می باشند و سیستم های proof کارآمدی دارند.
2-7-6- اعتماد29
لایه آخر اعتماد است که با استفاده از امضای الکترونیکی پدیدار می شود. وب تنها زمانی به پتانسیل کامل خود خواهد رسید که کاربران به ایمنی عملیات و کیفیت اطلاعات آن اعتماد داشته باشند. و در واقع با وجود اجازه برای هر شخص که عبارات منطقی را درباره منابع بیان می کند، برنامه ها می خواهند که تنها استنتاج را براساس عباراتی که به آن اطمینان دارند انجام دهد در نتیجه بررسی کردن منبع عبارت جز کلیدی از وب معنایی است. در اینجا سوالاتی مانند سوالات زیر مطرح است.
* نویسنده چه کسی است؟
* آیا نویسنده واقعا آن کسی که ادعا می کند هست؟
* در مورد موتور استنتاج چه؟ آیا می توان به آن اعتماد کرد؟
2-8- جستجو در وب معنایی
به دلیل عوامل زیر جستجو در وب معنایی با جستجو در وب کنونی متفاوت است:
* اسناد در وب معنایی ساختاری گرافی دارند که با ساختار اسناد وب کنونی کاملا متفاوت است .به عبارت دیگر وب معنایی وبی از اسناد نیست بلکه وبی از منابع و روابط بین آنهاست که نشان دهنده اشیاء در دنیای واقعی هستند. برای مثال شکلهای 2-13 و 2-14 دو نفر بنامهای ma Yu-Yu و Eric Miller را نشان میدهد که اولی یک خواننده و دومی یکی از اعضای ط W3C30 است.
شکل2-13 : گراف مربوط به ma Yu-Yu در وب معنایی
شکل2-14: گراف مربوط به Eric Miller در وب معنایی
* در وب معنایی هر شیء با اطلاعاتی که توسط ماشینها نیز قابل فهم است، تعریف میشود. برای مثال صفحه شخصی Eric Miller ممکن است اطلاعات زیادی را در مورد این فرد ارائه کند اما قسمت قابل فهم توسط ماشین در این صفحه مربوط به چگونگی نمایش در مرورگرهای وب است. در حالی که اطلاعات نمایش داده شده در شکل13 قابل فهم برای ماشین است. و نشان میدهدر Eric Miller فردی است که برای W3C کار میکند و در Dublin, Ohio زندگی میکند و غیره.
* در وب معنایی ارتباطات زیادی بین گرهها31 و اسناد مختلف در وب کنونی وجود دارد. برای مثال مفاهیم وب معنایی را به صفحات HTML مربوط به آنها متصل می کنند.
* در وب معنایی داده های مربوط به مفاهیم از پراکندگی زیادی برخوردار هستند و ممکن است اطلاعات مربوط به یک شیء در سایت های مختلفی موجود باشد. برای مثال در شکل 13 منابع مختلفی از اطلاعات مربوط به Yu-Yu- ma را ارائه میکند.
نتیجه پرس و جو "Eric Miller" در W3C Semantic Search در سمت چپ و نتیجه پرسو جو "Yo-Yo Ma" در سیستم ABC در سمت راست شکل2-15 نمایش داده شده است.
شکل2-15: نتیجه جستجو "Yo-Yo Ma" در سیستم ABS و "Eric Miller" در سیستم W3C Semantic Search
فصل سوم : هستیشناسیها (Ontology)
3-1- مقدمه
آنتولوژی ریشه در فلسفه دارد و مبدا آن را ارسطو می دانند. در فلسفه آنتولوژی شاخه ای از علم است که به بررسی موجودات و روابط میان آنها می پردازد. مفهوم آنتولوژی در وب معنایی کمی متفاوت از فلسفه است. یک آنتولوژی لغات و مفاهیم(معانی)که در تعریف و نمایش یک محدوده ای از دانش به کار می روند را تعیین می کند و بنابراین معانی را استاندارد می کند. آنتولوژی توسط مردم، پایگاهای داده و برنامه های کاربردی که نیاز به اشتراک گذاری اطلاعات یک دامنه خاص را دارند استفاده می شود.
3-2- تعریف آنتولوژی
آنتولوژِی از دو واژه onto به معنای هستی و logia به معنای مطالعه به وجود آمده است و در کل معنی هستی شناسی دارد. آنتولوژِی در وب معنایی واژه ها و ارتباط بین آنها در دامنه ای که استفاده می شوند را نشان می دهند. عناصر اصلی تشکیل دهنده آنتولوژی عبارتند از: مفاهیم، ارتباطات بین آنها و خصوصیات آنها.
شکل3-1: نقش آنتولوژی در وب معنایی
به عبارت دیگر آنتولوژی ارتباط بین مفاهیم در اسناد وب و در دنیای واقعی را مشخص می کند که با این کار اسناد مربوطه توسط ماشینها قابل پردازش و فهم می شود و به اشتراک گذاری اطلاعات بین عامل ها را تسهیل می کند. در واقع می توان گفت:
Vocabulary + Structure = Taxonomy
Taxonomy + Relationships, Constraints and rules = Ontology
Ontology + Instances = Knowledgebase
در زمینه وب آنتولوژی ها یک مفهوم مشترکی از یک دامنه را تامین می کنند. چنین فهم مشترکی برای حل مشکل چند معنایی لازم است زیرا دوبرنامه کاربردی ممکن است از دو لغت متفاوت برای یک معنی واحد استفاده کنند و یا بالعکس از یک لغت واحد برای دو مفهوم متفاوت استفاده کنند. در واقع آنتولوژی ها interoperability معنایی را فراهم می کنند.
3-3- انواع هستی شناسی ها
انواع مختلفی از هستی شناسی ها موجود هستند. انواع متفاوت هستی شناسی در مکتوبات هوش مصنوعی عبارتند از:
* domain ontology ها
* meta data ontology ها
* method ontology ها
هستی شناسی مشخصات و جنبه های متفاوتی دارند؛ به عنوان مثال، تشریفات، نظم و قاعده در تشریح طیفهای متفاوت آنها کاربرد دارند. در تعریف آنتولوژیها و جنبه های مختلف آنها، می توان کم عمق بودن را در مقابل عمیق بودن، بالا در مقابل پایین، رسمی در مقابل غیررسمی و قانونی در مقابل غیرقانونی را ملاک قرار داد. همچنین از آنتولوژیها می توان در تعریف های ظاهری، نمایش حوزه های متفاوت و قوت رساندن معنی نیز استفاده کرد. علاوه بر موارد ذکر شده، از ویژگی های بارز آنتولوژیها می توان به هدف نهایی آنها در ارائه اطلاعات مثلاًًً به انسان ها یا کامپیوترها اشاره کرد و این نشانه بارزی در آینده آنهاست.
شکل عمومی آنتولوژیها یک taxonomy یا طبقه بندی، نام دارد. یک آنتولوژیها طبقه بندی شده معمولاً یک سلسله مراتب از مفاهیم مرتبط با یک تخصص یا ارتباط is-a را در برمی گیرد. یک taxonomy به صورت نهال، درختی است که یک ریشه مستقل آغازین دارد. درخت های taxonomy برای درک و پیمایش بسیار بسیار آسانتر از شیما32 ارائه اطلاعات به صورت پیچیده هستند. با این حال، کمبود رساندن معنی در تشریح ارتباطات پیچیده در آنها مشاهده می شود.
3-4- معماری هستی شناسی ها
معماریهای متنوعی در طراحی و اجرای هستی شناسی ها وجود دارد. این معماریها در سه دسته قابل بررسی اند:
1. هستی شناسی واحد: در این صورت، تمام افراد سازمان به تفاهم وتوافق بر هستی شناسی واحدی می رسند. این معماری تنها در موارد بسیار ایده آل و هوشمند موثر خواهد بود. نقطه قوّت این نوع معماری آن است که در صورت تمایل به اشتراک، به هیچ گونه ترسیمی نیاز نیست.
2. هستی شناسی های محلی: در کنار هستی شناسی واحد: در این نوع معماری، گروه هایی از افراد سازمان فعال در حوزه ای خاص از هستی شناسی محلی استفاده می کنند. در این صورت چنانچه اشتراک دانش میان گروه ها نیاز باشد، استفاده از ترسیم هستی شناسانه ضروری است.
3. هستی شناسی های فردی: هنگامی که هر یک از افراد در سازمان از هستی شناسی منحصر به فرد و مستقلی استفاده کند، این معماری تحقق می یابد. در این صورت، استفاده از ترسیمها با وسعت بیشتری انجام می پذیرد.
3-5- زبانهای بیان آنتولوژی
دو نوع زبان برای ایجاد آنتولوژی وجود دارد:
* زبانهایی که بر اساس گراف عمل میکنند مانند:
Topic maps, UML, RDF Semantic networks
* و زبانهایی که بر اساس منطق گزارهها عمل میکند مانند:
Description Logics (OIL, DAML+OIL, OWL), Rules (RuleML, LP/Prolog)
برخی از زبانهای بیان آنتولوژی عبارتند از:
* RDF(S) (Resource Description Framework (Schema))
* OIL (Ontology Interchange Language)
* DAML+OIL (DARPA Agent Markup Language + OIL)
* OWL (Ontology Web Language)
* XOL (XML-based Ontology Exchange Language)
* SHOE (Simple HTML Ontology Extension)
* OML (Ontology Markup Language)
3-5-1- زبان OWL:
پروژه های وب معنایی زیادی در اتحادیه اروپا انجام شد که در آن از تکنیکهای مختلفی جهت بیان آنتولوژی استفاده میشد. بر اساس همین پروژهها، زبانی استاندارد بنام OIL بوجود آمد که از برای بیان آنتولوژی در اتحاد یه اروپا استفاده میشد. کمی زودتر از اتحادیه اروپا، در آمریکا با پشتیبانی DARPA زبان بیان آنتولوژی 33DAML جهت استفاده در وب معنایی بوجو آمد. در نهایت نقاط قوت و ضعف این دو زبان توسط W3C بررسی شد و براساس DARPA و OIL زبان استانداردی بنام OWL34 بوجود آمد که براساس مدل شیءگرا عمل میکند. اهداف ایجاد این زبان شامل اشتراک آنتولوژی، تکامل آنتولوژی، تعامل و ارتباط با آنتولوژیها، تشخیص ناسازگاری، قدرت بیان و انعطافپذیری، سهولت در استفاده سازگاری با دیگر زبانها و استفاده بین المللی است.
همان طور که گفته شد، برا ی ایجاد آنتولوژی زبانهای مختلفی وجود دارد اما OWL قابلیتهای بیشتری دارد. این زبان خود دارای 3 نسخه مختلف OWL Lite, OWL DL, OWL Full که به ترتیب دارای سادگی بیشتر ولی قدرت کمتر هستند.
* OWL Lite : که هدف اصلی از آن پشتیبانی از کاربرانی بود که نیاز به ساختار کلاسبندی سلسله مراتبی و قیود ساده داشتند. برای مثال، با آنکه این نسخه قید تعدد را پشتیبانی می کند ولی فقط اجازه تعدد 0 و۱ را می دهد. در ابتداد امیدوار بودند که سادگی OWL Lite به این کمک کند که
* ابزار ساده تر برای پشتیبانی آن ساخته شوند، و بزودی بتوان سیستم هایی که از فرهنگ لغات مترادف ١٢ و علم طبقه بندی ١٣ استفاده می کنند را ساخت ولی در عمل ثابت شده که توسعه ابزار این نسخه از زبان به سختی توسعه ابزار برای OWL DL بوده، و بنابراین OWL Lite زیاد استفاده نشد.
* OWL DL: به این منظور طراحی شده بود که حداکثر بیانگری را در حالی که کامل بودن محاسباتی (تضمین اینکه همه نتایج قابل محاسبه اند) تصمیم پذیری (همه محاسبات در زمان محدود پایان می پذیرند). و موجود بودن الگوریتمهای استنتاج عملی را پشتیبانی می کند، داشته باشد.این نسخه از زبان تمام ساختارهای OWL را دارد جز اینکه بعضی از آنها فقط در شرایط خاص می توانند استفاده شوند.
* OWL FULL: براساس معنای مختلفی از دو نسخه پیشین بنا شده است، و به این منظور طراحی شده است که مقداری سازگاری با RDF Schema را حفظ کند. برای مثال، در OWL Full یک کلاس در حالی که می تواند بیانگر یک مجموعه از نمونه ها باشد می تواند خودش نیز یک نمونه از کلاسی دیگر باشد، که این در OWL DL ممکن نیست. این نسخه این امکان را می دهد که یک آنتولوژی معنای فرهنگ لغات از قبل تعریف شده OWL و RDF را بهبود ببخشد. احتمال این ضعیف است که نرم افزاری بتواند استنتاج را در این نسخه از OWL پشتیبانی کند.
موارد زیر در مورد OWL برقرار است:
* هر آنتولوژی که معتبر برای OWL Lite در OWL DL نیز معتبر است.
* هر آنتولوژی معتبر در OWL DL در OWL Full نیز معتبر است.
* هر نتیجه معتبر در OWL Lite در OWL DL نیز معتبر است.
* هر نتیجه معتبر OWL DL در OWL Full نیز معتبر است.
شکل3-2: ارتباط نسخه های OWL بایکدیگر
3-6- نحوه ایجاد هستیشناسیها35
ساخت و توسعه هستی شناسی ها به سه شیوه کلی انجام میشود:
* ساخت دستی :
در این روش، حجم عظیمی از دانش مفهومی به وسیله افراد در ماشین کد میشود و پایگاههای دانش بزرگ عمومی یا تخصصی ایجاد میگردند. ساخت دستی هستی شناسی ها، برای قلمروها و کاربردهای مختلف، پرهزینه، وقت گیر و مستعد خطاست و هستی شناسی هایی که به صورت دستی ساخته می شوند، معمولاً گران، متمایل به نظرهای شخصی طراح، انعطاف ناپذیر در مقابل تغییرات و دقیقاً خاص منظوری هستند که برای آن تهیه شده اند.
* نیمه خودکار
برای کاهش مشکلات ساخت هستانشناسیها و تولید نیمه خودکار آنها دو راهکار پیشنهاد شده است:
الف) یکپارچهسازی و استفاده مجدد از هستانشناسیهای موجود.
ب) یادگیری و ساخت خودکار هستانشناسیها از روی منابع موجود، مانند سیستمهای Text-to-onto (میده و استاب، 2001)، Syndikate (هان و روماکر، 2001)
* روشهای خودکار
اما در روشهای خودکار ـ سومین شیوه مهندسی و توسعه هستی شناسی ها ـ دخالت عامل انسانی کاهش و سرعت ساخت و توسعه هستی شناسی ها افزایش می یابد. در این صورت، باید به اکتساب یا استخراج دانش پرداخت. از آنجا که هستی شناسی را مجموعه مفاهیم و روابط آن می دانیم، این استخراج در دو بُعد انجام می پذیرد:
الف) استخراج مفاهیم
ب) استخراج روابط معنایی میان این مفاهیم.
ساخت خودکار هستی شناسی ها با استفاده از نظامهای یادگیر هستی شناسی انجام می پذیرد. این در حالی است که استفاده از ابزارهایی چون Protégé تنها به منزله پشتیبان ساخت به کار می روند.
اما مستقل از روش ایجاد آنتولوژی میتوان از متدلوژی خاصی برای ایجاد آنتولوژی استفاده کرد. متدلوژی استانداردی برای ایجاد آنتولوژی وجود ندارد و بسته به کاربرد آنتولوژی از متدلوژی های متفاوتی استفاده میشود. در این قسمت یکی از این متدلوژیها به تصویر کشیده شده است.
شکل3-3 : متدلوژی ایجاد آنتولوژی
در روند ایجاد آنتولوژی بصورت بازگشتی عمل می شود، یعنی در هر مرحله ممکن است نیاز به ایجاد اصلاحات و بازگشت به مرحله قبلی باشد. در زیر مراحل متدلوژی شکل بالا شرح داده شده است:
1. تشخیص محدوده : در ا ین مرحله بررسی اولیه ا ی جهت ایجاد آنتولوژی انجام میشود و محدوده ای را که می بایست پوشش داده شود و نوع و چگونگی استفاده از آنتولوژی مشخص می شود.
2. استفاده مجدد : در ا ین مرحله مطالعه جامعی بر روی آنتولوژی های موجود انجام و مشخص میشود از کدامیک از آنتولوژیهای موجود میتوان برای ایجاد آنتولوژی مورد نظر کمک گرفت. استفاده مجدد این مزیت را دارد که صحت آنتولوژی قبلی در عمل بررسی شده و از ابزارهایی که بر اساس آنها کار می کنند نیز می توان استفاده کرد.
3. تشخیص واژها : در این مرحله واژههایی که در دامنه مورد نظر ما استفاده میشوند و مشخصه آنها مشخص میشود.
4. تشخیص کلاس ها و ساختار آنها : با استفاده از واژه های بدست آمده، کلاس ها و زیرکلاسهای آنها را مشخص می کنیم. برای این کار می توان از روش پایین به بالا، بالا به پایین یا ترکیبی از این دو روش را استفاده کرد.
5. تعریف مشخصه ها : در این مرحله ساختار داخلی کلاسها را شرح میدهیم. معمولا بیشتر واژه ها ی بدست آمده در مرحله ٣ که در مرحله ۴ استفاده نشده اند، مشخصههای مورد نظر را تشکیل میدهند.
6. تعریف محدودهها: در این مرحله محدودهای را که هر مشخصه میتواند به خود بگیرد مشخص می شود.
3-7- استخراج دانش
استخراج دانش، به دو بخش تقسیم میشود:
* استخراج مفاهیم
* روابط
استخراج مفاهیم و روابط در ساخت هستی شناسی ها پیچیدگی های فراوانی دارد و مسیرهای متفاوتی نیز در ساخت و توسعه آنها طی شده است. در این میان، تحلیلها بیشتر بر روی زبان انگلیسی صورت گرفته و مطالعات اندکی بر روی زبان فارسی انجام پذیرفته است.
دانش قابل استخراج از متون به دو دسته "ضمنی" و "عینی" تقسیم بندی می شود. دانش عینی، دانشی است که در متن و با استفاده از واژگان به بیان آمده است، اما دانش ضمنی وابسته به پیش داشته های فرد انتزاع کننده آن است و به طور صریح در متن و در قالب واژگان نیامده است؛ بدین معنا که اگر چه رابطه معنایی به طور صریح در متن نیامده است، خواننده مطلب که در این جا فرد انتزاع کننده روابط معنایی (پژوهشگر) می باشد، با توجه به دانش زمینه ای، قادر به انتزاع و استخراج رابطه هاست. در این پژوهش، سعی شده هر دو نوع دانش استخراج شود. علت استخراج هر دو نوع دانش آن است که میزان پیدایی روابط معنایی را می توان از مقایسه و تحلیل این دو یافته تعیین نمود. در عین حال، واضح است که استخراج خودکار روابط معنایی بر پایه دانش عینی و الگوهایی است که به طور عینی در متن آمده است و استخراج آنها را ممکن می سازد.
3-7-1- مراحل و روش تحلیل
مفاهیم در قالب زنجیره ای از واژگان به هم مرتبط، به بیان و بنان در می آیند. در این صورت است که جمله متولد می شود. جمله در ارتباط با سایر جمله های یک پاراگراف، در خدمت انتقال معنایی کلی تر است که از عهده یک جمله به تنهایی بر نمی آمد. در این مورد، چکیده مقاله علمی، تک پاراگراف منحصر به فردی است که قصد دارد بازنمونی مختصر و تا حدّ ممکن جامع از رویکرد، روشها و البته معنای مورد نظر نویسنده باشد. مجموعه پاراگرافها در خدمت نویسنده اند تا مقصود و معنای مورد نظر به تمامی منتقل شود. هر مقاله نیز با سایر مقاله های هم موضوع در ارتباط است و در کنار آنها زیست می کند. ویژه نامه های تخصصی، مجالی هستند برای بروز این زیستن.
شکل3-4 : هرم تحلیل استخراج مفاهیم و روابط
در نخستین سطح، سطح جمله، بخشی از مفاهیم و روابط شناسایی می شود. در این سطح از تحلیل، دانش عینی آن جمله مورد نظر است و فراتر از همان جمله نمی توان حرکت کرد؛ اما چنانچه سطح تحلیل به پاراگراف گسترش یابد، می توان مفاهیم را در سطحی انتزاعی تر و به بیانی ضمنی تر دید. به طور مثال، اگر در جمله اول یکی از روشهای درمان بیماری خاصی بیان شود، تنها همین یک روش درمانی استخراج می گردد؛ اما اگر پاراگراف در نظر گرفته شود و جمله ای دیگر از این پاراگراف به همان روش با عبارتی دیگر بپردازد، رابطه ضمنی هم ارزی این دو مفهوم قابل شناسایی است، در حالی که در متن نیامده است. بدین ترتیب، روابط ضمنی تری قابل شناسایی و استخراج خواهد بود؛ روابطی که شاید در سطح جمله امکان استخراج آنها وجود
نداشت. بتدریج، با حرکت در سطوح تحلیل، مجموعه ای از روابط جدید میان مفاهیم و حتی میان رابطه ها آشکار و در نهایت هستی آن کل، به شکل مجموعه ای از مفاهیم و روابط متجلی می شود.
به منظور تعیین میزان پیدایی روابط معنایی سه سطح ـ انطباق کامل، انطباق نسبی، و عدم انطباق ـ تعیین شد. انطباق کامل زمانی رخ می دهد که رابطه معنایی استخراج شده به طور کامل در جمله مورد تحلیل آمده باشد؛ مثلاً در جمله "تکنیک فرامتن راهکار افزایش ربط است" رابطه "راهکار" میان دو مفهوم "تکنیک فرامتن" و "افزایش ربط" نمونه یک رابطه با انطباق کامل است. در جمله ای مانند "ساختار نظامهای فرامتن و تاثیر آنها بر مسئله ربط در بازیابی و نیز راهبردهای جستجو …" رابطه "تاثیر دارد بر"، دارای انطباق نسبی است. اما هنگامی که از جمله ای مانند "پیوندهای فرامتنی راه دیگری را برای مسیریابی در میان انبوه اطلاعات فراهم می کند"، رابطه "کاربرد دارد در" استخراج می شود، این رابطه مصداق نبود انطباق میان واژه های متن و رابطه، استخراج شده است. بدین ترتیب، مجموعه ای از روابط معنایی همراه با میزان انطباق آنها با متن استخراج شد.
تحلیل متن تحت تاثیر عوامل ذهنی و غیر ذهنی صورت می گیرد. اگر عوامل غیر ذهنی را عوامل زبانی بدانیم، در استخراج خودکار متن تنها باید بر این عوامل تکیه کرد. حال آن که در این صورت بخشی از تحلیل دچار کاهش شده است. "اسپارک جونز" (1991) معتقد است ذهن انسان در موقعیتها و زمانهای مختلف به صورت بسیار پیچیده و غیرقابل پیش بینی و با توجه به عوامل محسوس و نامحسوس قادر است به پردازش، تحلیل و تفسیر بپردازد و قضاوت کند. هنوز تا خودکارسازی استخراج متن فاصله ای ناپیموده وجود دارد؛ فاصله ای که شاید پیمودن آن تنها از عهده ذهن پیچیده انسانی برآید.
3-8- ابزار توسعه هستی شناسی ها
یکی از تصمیمات مهم در فرآیند ساخت هستی شناسی ها ، انتخاب ابزار ویرایش و زبان نمایش هستی شناسی است. این دو پارامتر روی چرخه حیات هستی شناسی ها ، کیفیت و استاندارد سازی آن تاثیر مستقیم دارند. از نرم افزار Protégé 3.1.1 میتوان بعنوان محیط ویرایش و توسعه هستی شناسی ها استفاده نمود. محیط Protégé با تعیین کلاسها، سلسله مراتب آنها و نمونه های عضو هر یک، هستی شناسی را بهتر توصیف میکند. این محیط امکان توسعه هستی شناسی یک حوزه را از طریق ابزارهای متعدد مدلسازی بسهولت فراهم میکند و میتوان به شیوه کاملا بصری و بدون نیاز به درگیری با جزئیات قالبهای فوق الذکر، به ساخت، دستکاری اجزاء و پشتیبانی هستی شناسی پرداخت.
این ابزار در سال 1998 توسط متخصصان انفورماتیک پزشکی دانشگاه استنفورد36 طراحی شد و توسعه یافت. موسساتی چون آژانس طرحهای پژوهشی پیشرفته دفاعی، موسسه ملی سرطان، موسسه ملی استاندارد و فناوری، کتابخانه ملی پزشکی بنیاد ملی علوم از جمله پیشتیبانان این طرح نرم افزار بوده اند. در حال حاضر ویرایش (2010) 4.1 betaاین نرم افزار در سایت37 رسمی آن موجود است. در این سایت، امکان دانلود نرم افزار فراهم آمده است.
شکل3-5 : تصویری از Protégé، ابزار مهندسی هستی شناسی
در دیگر سوی، ابزارهای مهندسی هستی شناسی مانند Protégé واسط کاربری فراهم می آورند که در آن امکان تعریف مفاهیم، نمونه ها، ویژگیها و محدودیتهای مفاهیم و همچنین روابط، وجود دارد. در این صورت، باز هم هزینه زیادی در ساخت هستی شناسی ها صرف می شود و افراد متخصصی برای ساخت هستی شناسی در فعالیت شرکت دارند. مزیت استفاده از ابزارها آن است که در صورت وجود، می توان از مفاهیم و روابط موجود در سایر هستی شناسی ها به منظور ساخت و توسعه هستی شناسی جدیدی استفاده کرد؛ لذا بخشی از کار به صورت خودکار انجام پذیر است.
3-9- روشهای یکدست سازی هستی شناسی ها
امروزه منابع هستان شناسی بسیاری برای کاربردها و قلمروهای مختلف ایجاد و بکار گرفته شده اند. یکی از راههای کاهش هزینه ساخت هستان شناسی های جدید، شناسایی ، جمع آوری و استفاده از منابع موجود به شکل فعلی و با تغییرات اندک می باشد.در این رهیافت ، روشها ، متدولوژی ها ،ابزارها و الگوریتم هایی برای یکپارچه سازی هستان شناسی های موجود ایجاد می شوند. در فرآیند یکپارچه سازی ، وجوه مشترک میان منابع (هستان شناسی های ) موجود را یافته و منبع جدیدی ایجاد می شود که امکان همیاری میان سیستم های کامپیوتری که بر مبنای منابع اولیه کار می کنند را فرآهم می کند. این منبع جدید ممکن است جایگزین منابع اولیه شده یا فقط به عنوان واسطه ای میان سیستم های مبتنی بر منابع اولیه عمل کند. میزان تغییرات لازم برای حصول هستان شناسی های اولیه ، سطوح مختلف یکپارچه سازی را از هم متمایز می کند این سطوح عبارتند از :
* هم ترازی38 : در هم ترازی که ضعیف ترین شکل یک پارچه سازی است ، حداقل تغییرات، مورد نیاز است و حاصل ، تنها برای اشکال محدودی از درون عملگری مناسب می باشد در این روش نگاشتی میان مفاهیم و روابط دو هستان شناسی ایجاد می شود به گونه ای که ترتیب جزئی طبقات در هستان شناسی های اولیه حفظ شود. در این نگاشت وقتی مفهوم با رابطه "آ" از هستان شناسی اول به مفهوم با رابطه "ب" در هستان شناسی دوم نگاشت می شود. گوییم "آ" و "ب" معادلند. این نگاشت ممکن است جزئی باشد چراکه ممکن است مفاهیمی از یک هستان شناسی معادلی در هستان شناسی دیگر نداشته باشند. لذا گاهی لازم است قبل از عمل هم ترازی زیر طبقات یا زیر طبقات جدیدی در یکی از هستان شناسی های اولیه به عنوان مقصد عمل نگاشت مفاهیم از
* هستان شناسی دیگر ایجاد شوند. در عمل هم ترازی هیچ تغییری بر روی اصول ، تعاریف ، اثباتها یا محاسبات در هستان شناسی های اولیه رخ نمی دهد و نحوه نام گذاری مفاهیم در دو هستان شناسی اولیه تاثیری در عمل نگاشت ندارد. این روش در دسته بندی و بازیابی اطلاعات کاربرد دارد ولی برای استنتاجات و محاسبات عمیق مناسب نیست.
* سازگاری جزئی یا پاره ای: یکسان سازی ، یک هم ترازی یک به یک از همه مفاهیم و روابط دو هستان شناسی است که هر عمل استنتاجی و محاسباتی قابل بیان در یکی را به عمل معادلی در دیگری نگاشت می کند. این عمل ممکن است به تغییرات اساسی یا سازماندهی مجدد هستان شناسی های اولیه منجر شود ولی نتیجه حاصله کامل ترین شکل درون عملگری را فرآهم می کند که در آن هر کاری که با یکی از هستان شناسی ها ممکن باشد دقیقا به صورت معادل در هستان شناسی دیگر امکان پذیر است. راه معمول انجام یکسان سازی پالایش هر یک از هستان شناسی ها به جزئیات بیشتر است به گونه ای که طبقات حاصله معادلی در هستان شناسی دیگر داشته باشند.
در روش ها و ابزار یکپارچه سازی که تاکنون ایجاد شده ، یکپارچه سازی معمولا با یکی از دو عمل زیر محقق می شود :
الف ) ادغام39 هستان شناسی ها برای ایجاد یک هستان شناسی منسجم و یکدست
ب ) هم ترازی هستان شناسی ها با ایجاد اتصالات میان آنها و ایجاد امکان استفاده مجدد و اشتراکی از دانش یکدیگر
شکل3-6 : تفاوت میان عمل ادغام کردن (Merging) و هم ترازی(Alignment) .
فصل چهارم : سیستم تولید ونمایش آنتولوژی
4-1- مقدمه
در این فصل سعی کردیم مراحل تولید و نمایش یک آنتولوژی را تشریح کنیم. بطور کلی میتوان مراحل کار را به دو مرحله کلی تقسیم کرد:
1. در ابتدا باید متون داده شده (دامنه کار روی متن انگلیسی است) را به جملههایی شکسته40 شود و سپس جملههای شکسته شده را به کلمات بشکنیم. بعد از مرحله شکستن نوبت به مشخص کردن نقش (اسم، فعل، صفت) هر کلمه میرسد.
2. بعداز مشخص شدن نقش هر کلمه، نیاز به استخراج دانش مفهومی از متن است یعنی اینکه باید روابط بین کلمات در هر جمله تشخیص داده شود (براساس الگوهای هیرست و الگوی None Verb None )
4-2- مرحله شکستن وتشخیص نقش کلمات
برای شکستن و تشخیص نقش کلمات نرمافزاری به زبان C# طراحی شده است.
4-2-1- مرحله شکستن
* شکستن متن
برای شکستن متن به جمله یک را ه ساده تشخیص نقطه(.) در پایان هر جمله است ('.') input.Split و نوع پیشرفته آن استفاده از ('.', '!', '?') input.Split میباشد. ولی این تکنیک نمیتواند تشخیص دهد که نقطه در وسط جمله قرار گرفته است و هر جا نقطه را ببیند آن را پایان جمله در نظر میگیرد. مانند:
Mr. Jones went shopping. His grocery bill came to $23.45.
برای حل مشکل فوق از یک کتابخانه بنام OpenNLP استفاده میکنیم. OpenNLP تعدادی ابزارهای پردازش زبان طبیعی(NLP) مبتنی بر مدلهای انتروپی41 را فراهم میکند. در واقع OpenNLP شامل گروهی از پروژه های متن باز مربوط به پردازش زبان طبیعی و هم یک کتابخانه از ابزار NLP در جاوا میباشد که توسط (Gann Bierner, Jason Baldridge, Tom Morton) نوشته شده است.
بعد از دریافت متن از ورودی باید آن را اسکن کرد. هر زمانی که به یکی از کارکترهای '.', '!', '?' رسیدیم باید مشخص کنیم که آیا آین کارکترها پایان جمله هستند یا خیر. در اینجاست که از مدلهای انتروپی استفاده میشود. یک مجموعه predicates از موقعیتهایی که انتهای جمله را مشخص میکند تولید میشود و این مجموعه در مدل انتروپی ارزیابی میشود. اگر این ارزیابی موفقیت آمیز باشد مشخص میشود کاراکتر پایان جمله است و سپس جمله شکسته میشود. همه این کارها در کلاس EnglishMaximumEntropySentenceDetector انجام میشود.
شکل 1-4 : شکستن متن به جملات
* شکستن جمله
برای شکستن جملات به کلمه از کلاس EnglishMaximumEntropyTokenizer استفاده میکنیم. این Tokenizer میتواند کلماتی که شامل علائم اختصاری هستند را بشکند. بطور مثال don't شکسته میشود به do و n't زیرا از ابزارهای NLP استفاده میکند که do را به عنوان فعل و n't را به عنوان علامت اختصاری مشخص میکند.
شکل 2-4 : شکستن جملات به کلمه
4-2-2- مرحله تشخیص نقش جمله
Pos tagger برای تعیین نقش هر کلمه از کلاس EnglishMaximumEntropyPosTagger استفاده میکند.نقش هر کلمه بوسیله علائم زیر مشخص میشود:
* تگهای اسم
NN Noun, singular or mass
NNP Proper noun, singular
NNPS Proper noun, plural
NNS Noun, plural
* تگهای فعل
VB Verb, base form
VBD Verb, past tense
VBG Verb, gerund/present participle
VBN Verb, past participle
VBP Verb, non-3rd ps. sing. Present
VBZ Verb, 3rd ps. sing. Present
* تگهای صفت
JJ Adjective
JJR Adjective, comparative
JJS Adjective, superlative
Pos Tagger علاوه بر کلاس ذکر شده از کلاس دیگری بنام PosLookupList استفاده میکند. این کلاس از فایلی بنام tagdict در پوشه پارسر (که باید در درایویی که برنامه ازآنجا اجرا میشود قرار گیرد. tagdict پیکره زبانی میباشد که توسط دانشگاه پنسیلوانیا توسعه یافته است و شامل لیست تگهای استاندارد میباشد. کلاس PosLookupList که مسیر این فایل را دارد، کلمات مورد نظر را که در آرایه Tokeniz قرار دارد را با این فایل مورد ارزیابی قرار میدهد اگر کلمه در تگهای این فایل یافت شود نقش کلمه در آرایه دیگری به نام Tags برگردانده میشود (در اندیش مشابه آن در آرایه Tokeniz )
شکل 3-4 : تعیین نقش کلمات در جمله
4-3- مرحله استخراج دانش مفهومی از متن
منظور از استخراج دانش مفهومی همان استخراج روابط در جمله میباشد که ما در اینجا از دو الگو استفاده میکنیم
3-4-1- الگوهای هیرست42
شامل موارد زیر است:
NPX and other NPY
NPX or other NPY
NPY such as NPX
Such NPY as NPX
NPY including NPX
NPY , especially NPX
در اینجا برای پیدا کردن روابط در کلمات ( کلماتی که از مراحل قبل نقش آنها را مشخص کردیم) شروع به جستجو میکنیم هر جا که یکی از الگوهای هیرست را پیدا کردیم بطور مثال اگر Such as در کلمات دیده شود کلمه قبلی و بعدی آن را بررسی میکنیم اگر اسم (NN,NNP,NNS) بودند آنگاه به عنوان یک رابطه در فایل XML ذخیره میشود.
بطور مثال جمله:
City such as kerman, mahan and Tehran.
نمایش فایل xml ورابطه جمله بالا در شکل 6-4 آمده است.
شکل6-4 : فایل XML همراه رابطه آن
3-4-2- الگوی None Verb None
در اینجا برای پیدا کردن روابط در کلمات ( کلماتی که از مراحل قبل نقش آنها را مشخص کردیم) شروع به جستجو میکنیم هر جا که فعل (,VBD VBZ, VBP, VBN, VBG, VB) پیدا شد قبل و بعد از آن را بررسی میکنیم اگر هر دو اسم بودند آنگاه به عنوان یک رابطه شناخته شده و در فایل XML ذخیره میشود.
بطور مثال جمله :
Dr.kermani goes office. I am a student. What is your name? my name is hamzeh. my name is alireza
نمایش فایل XML و رابطه جمله بالا در شکل 4-4 و 5-4 آمده است.
شکل 4-4 : نمایش رابطه استخراج شده از مثال قبل
شکل5-4 : فایل XML مثال قبل
4-4- ساختن فایل XML
بعد از استخراج روابط برای اینکه روابط استخراج شده از بین نروند نیاز است که درجایی ذخیره شوند. در ایجاد آنتولوژی برای این کار از فایل XML استفاده میشود. برای ایجاد این فایل از تگ < Sentences > استفاده میشود و بقیه تگها در این تگ قرار میگیرد. اگر جملهای دارای رابطه باشد نام جمله در تگ < Sentences1 > قرار میگیرد تا مشخص شود جمله چندم است بطور مثال اگر دو جمله داشته باشیم که دارای رابطه باشند آنگاه دو تگ بنامهای < Sentences1 > و < 2 Sentences > داریم. به همین شکل رابطه نیز در تگ <relation1> قرار میگیرد. در داخل رابطه اسمها را در تگ <None> و فعلها را در تگ <verb> قرار میدهیم.
فصل 5 : نتیجهگیری
در این تحقیق سعی شد در ابتدا تعریف کلی وب و همچنین جنبههای مختلف آن مورد بررسی قرار گیرد تا اینکه برای تشریح وب معنایی یک دید کلی ایجاد شود. در ادامه به تشریح کامل وب معنایی و جنبههای مختلف آن پرداخته شد. با توجه به مهم بودن هستیشناسیها در وب معنایی سعی شد تا بطور کامل تشریح شود.
به این ترتیب یک سیستم تولید ونمایش خودکار آنتولوژی که قادر به استخراج مفاهیم از متون انگلیسی است طراحی شد. الگوهای معرفی شده برای استخراج روابط بر مبنای الگوهای هیرست و الگوی None Verb None میباشد الگوهای معرفی شده نه فقط برای ساخت هستانشناسی، بلکه در کلیه کاربردهای استخراج اطلاعات و اکتساب دانش مفهومی و یا استخراج ساختارهای اطلاعاتی خاص از متون زبان انگلیسی کاربرد دارند
منابع
شریف، عاطفه (1385). "شناختی از روابط معنایی در هستی شناسی وب". اطلاع شناسی، 4(1و2): 65-84
شمس فرد، مهرنوش و احمد عبداله زاده بارفروش (1381). "استخراج دانش مفهومی از متن با استفاده از الگوهای زبانی و معنایی". تازه های علوم شناختی، 4(1): 48-66.
Hearst, M. (1992) Automatic Acquisition of Hyponyms from Large Text Corpora. Proc. of the Fourteenth International Conference on Computational Linguistics, Nantes,
Hearst, M. & Sch¨utze, H. (1993) Customizing a lexicon to better suit a computational task. In Proc. of the ACL SIGLEX Workshop on Acquisition of Lexical Knowledge from Text.
ضمیمه : کدهای برنامه
کلاسهای Split : برای شکستن متون به جمله که شامل کلاسهای زیر میباشد.
* کلاس AbstractDataIndexer.cs
using System;
using System.Collections.Generic;
namespace split.split
{
public abstract class AbstractDataIndexer : ITrainingDataIndexer
{
private int[][] mContexts;
private int[] mOutcomeList;
private int[] mNumTimesEventsSeen;
private string[] mPredicateLabels;
private string[] mOutcomeLabels;
public virtual int[][] GetContexts()
{
return mContexts;
}
protected internal void SetContexts(int[][] newContexts)
mContexts = newContexts;
}
public virtual int[] GetNumTimesEventsSeen()
{
return mNumTimesEventsSeen;
}
protected internal void SetNumTimesEventsSeen(int[] newNumTimesEventsSeen)
{
mNumTimesEventsSeen = newNumTimesEventsSeen;
}
public virtual int[] GetOutcomeList()
{
return mOutcomeList;
}
protected internal void SetOutcomeList(int[] newOutcomeList)
{
mOutcomeList = newOutcomeList;
}
public virtual string[] GetPredicateLabels()
{
return mPredicateLabels;
}
protected internal void SetPredicateLabels(string[] newPredicateLabels)
{
mPredicateLabels = newPredicateLabels;
}
public virtual string[] GetOutcomeLabels()
{
return mOutcomeLabels;
}
protected internal void SetOutcomeLabels(string[] newOutcomeLabels)
{
mOutcomeLabels = newOutcomeLabels;
}
>
protected internal virtual void SortAndMerge(List<ComparableEvent> eventsToCompare)
{
eventsToCompare.Sort();
int eventCount = eventsToCompare.Count;
int uniqueEventCount = 1; // assertion: eventsToCompare.length >= 1
if (eventCount <= 1)
{
return; // nothing to do; edge case (see assertion)
}
ComparableEvent comparableEvent = eventsToCompare[0];
for (int currentEvent = 1; currentEvent < eventCount; currentEvent++)
{
ComparableEvent eventToCompare = eventsToCompare[currentEvent];
if (comparableEvent.Equals(eventToCompare))
{
comparableEvent.SeenCount++; // increment the seen count
eventsToCompare[currentEvent] = null; // kill the duplicate
}
else
{
comparableEvent = eventToCompare; // a new champion emerges…
uniqueEventCount++; // increment the # of unique events
}
}
mContexts = new int[uniqueEventCount][];
mOutcomeList = new int[uniqueEventCount];
mNumTimesEventsSeen = new int[uniqueEventCount];
for (int currentEvent = 0, currentStoredEvent = 0; currentEvent < eventCount; currentEvent++)
{
ComparableEvent eventToStore = eventsToCompare[currentEvent];
if (null == eventToStore)
{
continue; // this was a dupe, skip over it.
}
mNumTimesEventsSeen[currentStoredEvent] = eventToStore.SeenCount;
mOutcomeList[currentStoredEvent] = eventToStore.Outcome;
mContexts[currentStoredEvent] = eventToStore.GetPredicateIndexes();
++currentStoredEvent;
}
}
protected internal static string[] ToIndexedStringArray(Dictionary<string, int> labelToIndexMap)
{
string[] indexedArray = new string[labelToIndexMap.Count];
int[] indices = new int[labelToIndexMap.Count];
labelToIndexMap.Keys.CopyTo(indexedArray, 0);
labelToIndexMap.Values.CopyTo(indices, 0);
Array.Sort(indices, indexedArray);
return indexedArray;
}
}
}
* کلاس BinaryGisModelReader.cs
namespace split.split
{
public class BinaryGisModelReader : GisModelReader
{
private Stream mInput;
private byte[] mBuffer;
private int mStringLength = 0;
private System.Text.Encoding mEncoding = System.Text.Encoding.UTF8;
public BinaryGisModelReader(Stream dataInputStream)
{
using (mInput = dataInputStream)
{
mBuffer = new byte[256];
base.ReadModel();
}
}
public BinaryGisModelReader(string fileName)
{
using (mInput = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
mBuffer = new byte[256];
base.ReadModel();
}
}
protected override int ReadInt32()
{
mInput.Read(mBuffer, 0, 4);
return BitConverter.ToInt32(mBuffer, 0);
}
protected override double ReadDouble()
{
mInput.Read(mBuffer, 0, 8);
return BitConverter.ToDouble(mBuffer, 0);
}
protected override string ReadString()
{
mStringLength = mInput.ReadByte();
mInput.Read(mBuffer, 0, mStringLength);
return mEncoding.GetString(mBuffer, 0, mStringLength);
}
protected override void ReadPredicates(out int[][] outcomePatterns, out Dictionary<string, PatternedPredicate> predicates)
{
int outcomePatternCount = ReadInt32();
outcomePatterns = new int[outcomePatternCount][];
int currentOutcomePatternLength = 0;
predicates = new Dictionary<string, PatternedPredicate>(ReadInt32());
for (int currentOutcomePattern = 0; currentOutcomePattern < outcomePatternCount; currentOutcomePattern++)
{
currentOutcomePatternLength = ReadInt32();
outcomePatterns[currentOutcomePattern] = new int[currentOutcomePatternLength];
for (int currentOutcome = 0; currentOutcome < currentOutcomePatternLength; currentOutcome++)
{
outcomePatterns[currentOutcomePattern][currentOutcome] = ReadInt32();
}
for (int currentPredicate = 0; currentPredicate < outcomePatterns[currentOutcomePattern][0]; currentPredicate++)
{
string predicateName = ReadString();
double[] parameters = new double[currentOutcomePatternLength – 1];
for (int currentParameter = 0; currentParameter < currentOutcomePatternLength – 1; currentParameter++)
{
parameters[currentParameter] = ReadDouble();
}
predicates.Add(predicateName, new PatternedPredicate(currentOutcomePattern, parameters));
}
}
}
}
}
* کلاس ComparableEvent.cs
namespace split.split
{
public class ComparableEvent : IComparable<ComparableEvent>
{
private int mOutcome;
private int[] mPredicateIndexes;
private int mSeenCount = 1;
public int Outcome
{
get
{
return mOutcome;
}
set
{
mOutcome = value;
}
}
public int[] GetPredicateIndexes()
{
return mPredicateIndexes;
}
>
public void SetPredicateIndexes(int[] predicateIndexes)
{
mPredicateIndexes = predicateIndexes;
}
public int SeenCount
{
get
{
return mSeenCount;
}
set
{
mSeenCount = value;
}
}
public ComparableEvent(int outcome, int[] predicateIndexes)
{
mOutcome = outcome;
System.Array.Sort(predicateIndexes);
mPredicateIndexes = predicateIndexes;
}
public virtual int CompareTo(ComparableEvent eventToCompare)
{
if (mOutcome < eventToCompare.Outcome)
{
return -1;
}
else if (mOutcome > eventToCompare.Outcome)
{
return 1;
}
int smallerLength = (mPredicateIndexes.Length > eventToCompare.GetPredicateIndexes().Length ? eventToCompare.GetPredicateIndexes().Length : GetPredicateIndexes().Length);
for (int currentIndex = 0; currentIndex < smallerLength; currentIndex++)
{
if (mPredicateIndexes[currentIndex] < eventToCompare.GetPredicateIndexes()[currentIndex])
{
return -1;
}
else if (mPredicateIndexes[currentIndex] > eventToCompare.GetPredicateIndexes()[currentIndex])
{
return 1;
}
}
if (mPredicateIndexes.Length < eventToCompare.GetPredicateIndexes().Length)
{
return -1;
}
else if (mPredicateIndexes.Length > eventToCompare.GetPredicateIndexes().Length)
{
return 1;
}
return 0;
}
public override bool Equals(object o)
{
if (!(o is ComparableEvent))
{
return false;
}
return (this.CompareTo(o as ComparableEvent) == 0);
}
public override int GetHashCode()
{
return this.ToString().GetHashCode();
}
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
for (int currentIndex = 0; currentIndex < mPredicateIndexes.Length; currentIndex++)
{
stringBuilder.Append(" ").Append(mPredicateIndexes[currentIndex]);
}
return stringBuilder.ToString();
}
}
}
* کلاس SentenceDetectionEventReader.cs
namespace split.split
{
public class SentenceDetectionEventReader : ITrainingEventReader
{
private ITrainingDataReader<string> mDataReader;
private string mNext;
private SentenceDetectionEvent mHead, mTail;
private IContextGenerator<Pair<System.Text.StringBuilder, int>> mContextGenerator;
private System.Text.StringBuilder mBuffer = new System.Text.StringBuilder();
private IEndOfSentenceScanner mScanner;
public SentenceDetectionEventReader(ITrainingDataReader<string> dataReader)
: this(dataReader, new DefaultEndOfSentenceScanner(), new SentenceDetectionContextGenerator(DefaultEndOfSentenceScanner.GetEndOfSentenceCharacters()))
{
}
public SentenceDetectionEventReader(ITrainingDataReader<string> dataReader, IEndOfSentenceScanner scanner)
: this(dataReader, scanner, new SentenceDetectionContextGenerator(DefaultEndOfSentenceScanner.GetEndOfSentenceCharacters()))
{
}
public SentenceDetectionEventReader(ITrainingDataReader<string> dataReader, IEndOfSentenceScanner scanner, IContextGenerator<Pair<System.Text.StringBuilder, int>> contextGenerator)
{
mDataReader = dataReader;
mScanner = scanner;
mContextGenerator = contextGenerator;
if (mDataReader.HasNext())
{
string current = mDataReader.NextToken();
if (mDataReader.HasNext())
{
mNext = mDataReader.NextToken();
}
AddNewEvents(current);
}
}
public virtual TrainingEvent ReadNextEvent()
{
SentenceDetectionEvent topEvent = mHead;
mHead = mHead.NextEvent;
if (null == mHead)
{
mTail = null;
}
return topEvent;
}
private void AddNewEvents(string token)
{
System.Text.StringBuilder buffer = mBuffer;
buffer.Append(token.Trim());
int sentenceEndPosition = buffer.Length – 1;
if (mNext != null && token.Length > 0)
{
int positionAfterFirstWordInNext = mNext.IndexOf(" ");
if (positionAfterFirstWordInNext != -1)
{
buffer.Append(" ");
buffer.Append(mNext.Substring(0, (positionAfterFirstWordInNext) – (0)));
}
}
for (System.Collections.IEnumerator iterator = mScanner.GetPositions(buffer).GetEnumerator(); iterator.MoveNext(); )
{
int candidate = (int)iterator.Current;
Pair<System.Text.StringBuilder, int> pair = new Pair<System.Text.StringBuilder, int>(buffer, candidate);
string type = (candidate == sentenceEndPosition) ? "T" : "F";
SentenceDetectionEvent sentenceEvent = new SentenceDetectionEvent(type, mContextGenerator.GetContext(pair));
if (null != mTail)
{
mTail.NextEvent = sentenceEvent;
mTail = sentenceEvent;
}
else if (null == mHead)
{
mHead = sentenceEvent;
}
else if (null == mHead.NextEvent)
{
mHead.NextEvent = mTail = sentenceEvent;
}
}
buffer.Length = 0;
}
public virtual bool HasNext()
{
if (null != mHead)
{
return true;
}
while (null == mHead && (object)mNext != null)
{
string current = mNext;
if (mDataReader.HasNext())
{
mNext = (mDataReader.NextToken());
}
else
{
mNext = null;
}
AddNewEvents(current);
}
return (null != mHead);
}
}
}
* کلاس SentenceDetectionEvent.cs
namespace split.split
{
public class SentenceDetectionEvent : TrainingEvent
{
private SentenceDetectionEvent mNextEvent;
internal SentenceDetectionEvent NextEvent
{
get
{
return mNextEvent;
}
set
{
mNextEvent = value;
}
}
internal SentenceDetectionEvent(string outcome, string[] context)
: base(outcome, context)
{
}
}
}
* کلاس Program.cs
namespace split
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new mainForm());
}
}
}
* کلاس Pair.cs
using System;
namespace split.split
{
public sealed class Pair<A, B>
{
private A mFirst;
private B mSecond;
public A FirstValue
{
get
{
return mFirst;
}
}
public B SecondValue
{
get
{
return mSecond;
}
}
public Pair(A first, B second)
{
mFirst = first;
mSecond = second;
}
public override string ToString()
{
return "[" + mFirst.ToString() + "/" + mSecond.ToString() + "]";
}
}
}
کلاسهای token : که برای شکستن جمله به کلمه استفاده میشود و شامل کلاسهای زیر میباشد
* کلاس BinaryGisModelWriter.cs
namespace split.token
{
public class BinaryGisModelWriter : GisModelWriter
{
private Stream mOutput;
private byte[] mBuffer = new byte[7];
private System.Text.Encoding mEncoding = System.Text.Encoding.UTF8;
public BinaryGisModelWriter()
{
}
public void Persist(split.GisModel model, string fileName)
{
using (mOutput = new FileStream(fileName, FileMode.Create))
{
base.Persist(model);
}
}
public void Persist(split.GisModel model, Stream dataOutputStream)
{
using (mOutput = dataOutputStream)
{
base.Persist(model);
}
}
protected override void WriteString(string data)
{
mOutput.WriteByte((byte)mEncoding.GetByteCount(data));
mOutput.Write(mEncoding.GetBytes(data), 0, mEncoding.GetByteCount(data));
}
protected override void WriteInt32(int data)
{
mBuffer = BitConverter.GetBytes(data);
mOutput.Write(mBuffer, 0, 4);
}
protected override void WriteDouble(double data)
{
mBuffer = BitConverter.GetBytes(data);
mOutput.Write(mBuffer, 0, 8);
}
protected override void WritePredicates(split.GisModel model)
{
int[][] outcomePatterns = model.GetOutcomePatterns();
split.PatternedPredicate[] predicates = GetPredicates();
WriteInt32(outcomePatterns.Length);
WriteInt32(predicates.Length);
int currentPredicate = 0;
for (int currentOutcomePattern = 0; currentOutcomePattern < outcomePatterns.Length; currentOutcomePattern++)
{
WriteInt32(outcomePatterns[currentOutcomePattern].Length);
for (int currentOutcome = 0; currentOutcome < outcomePatterns[currentOutcomePattern].Length; currentOutcome++)
{
WriteInt32(outcomePatterns[currentOutcomePattern][currentOutcome]);
}
while (currentPredicate < predicates.Length && predicates[currentPredicate].OutcomePattern == currentOutcomePattern)
{
WriteString(predicates[currentPredicate].Name);
for (int currentParameter = 0; currentParameter < predicates[currentPredicate].ParameterCount; currentParameter++)
{
WriteDouble(predicates[currentPredicate].GetParameter(currentParameter));
}
currentPredicate++;
}
}
}
}
}
* کلاس EnglishMaximumEntropyTokenizer.cs
using System;
namespace split.token
{
public class EnglishMaximumEntropyTokenizer : MaximumEntropyTokenizer
{
public EnglishMaximumEntropyTokenizer(string name)
: base(new split.GisModel(new split.BinaryGisModelReader(name)))
{
AlphaNumericOptimization = true;
}
}
}
* کلاس GisModelWriter.cs
using System;
using System.Collections.Generic;
namespace split.token
{
public abstract class GisModelWriter
{
private split.PatternedPredicate[] mPredicates;
protected abstract void WriteString(string data);
protected abstract void WriteInt32(int data);
protected abstract void WriteDouble(double data);
protected split.PatternedPredicate[] GetPredicates()
{
return mPredicates;
}
protected void SetPredicates(split.PatternedPredicate[] predicates)
{
mPredicates = predicates;
}
protected void Persist(split.GisModel model)
{
Initialize(model);
WriteModelType("GIS");
WriteCorrectionConstant(model.CorrectionConstant);
WriteCorrectionParameter(model.CorrectionParameter);
WriteOutcomes(model.GetOutcomeNames());
WritePredicates(model);
}
protected virtual void Initialize(split.GisModel model)
{
Dictionary<string, split.PatternedPredicate> predicates = model.GetPredicates();
mPredicates = new split.PatternedPredicate[predicates.Count];
string[] predicateNames = new String[predicates.Count];
predicates.Values.CopyTo(mPredicates, 0);
predicates.Keys.CopyTo(predicateNames, 0);
for (int currentPredicate = 0; currentPredicate < predicates.Count; currentPredicate++)
{
mPredicates[currentPredicate].Name = predicateNames[currentPredicate];
}
Array.Sort(mPredicates, new OutcomePatternIndexComparer());
}
protected virtual void WriteModelType(string modelType)
{
WriteString(modelType);
}
protected virtual void WriteCorrectionConstant(int correctionConstant)
{
WriteInt32(correctionConstant);
}
protected virtual void WriteCorrectionParameter(double correctionParameter)
{
WriteDouble(correctionParameter);
}
protected virtual void WriteOutcomes(string[] outcomeLabels)
{
WriteInt32(outcomeLabels.Length);
//write each label
for (int currentOutcomeLabel = 0; currentOutcomeLabel < outcomeLabels.Length; currentOutcomeLabel++)
{
WriteString(outcomeLabels[currentOutcomeLabel]);
}
}
protected virtual void WritePredicates(split.GisModel model)
{
WriteOutcomePatterns(model.GetOutcomePatterns());
WritePredicateNames();
WriteParameters();
}
protected void WriteOutcomePatterns(int[][] outcomePatterns)
{
WriteInt32(outcomePatterns.Length);
for (int currentOutcomePattern = 0; currentOutcomePattern < outcomePatterns.Length; currentOutcomePattern++)
{
System.Text.StringBuilder outcomePatternBuilder = new System.Text.StringBuilder();
for (int currentOutcome = 0; currentOutcome < outcomePatterns[currentOutcomePattern].Length; currentOutcome++)
{
if (currentOutcome > 0)
{
outcomePatternBuilder.Append(" ");
}
outcomePatternBuilder.Append(outcomePatterns[currentOutcomePattern][currentOutcome]);
}
WriteString(outcomePatternBuilder.ToString());
}
}
protected void WritePredicateNames()
{
WriteInt32(mPredicates.Length);
for (int currentPredicate = 0; currentPredicate < mPredicates.Length; currentPredicate++)
{
WriteString(mPredicates[currentPredicate].Name);
}
}
protected void WriteParameters()
{
for (int currentPredicate = 0; currentPredicate < mPredicates.Length; currentPredicate++)
{
for (int currentParameter = 0; currentParameter < mPredicates[currentPredicate].ParameterCount; currentParameter++)
{
WriteDouble(mPredicates[currentPredicate].GetParameter(currentParameter));
}
}
}
private class OutcomePatternIndexComparer : IComparer<split.PatternedPredicate>
{
internal OutcomePatternIndexComparer()
{
}
public virtual int Compare(split.PatternedPredicate firstPredicate, split.PatternedPredicate secondPredicate)
{
if (firstPredicate.OutcomePattern < secondPredicate.OutcomePattern)
{
return -1;
}
else if (firstPredicate.OutcomePattern > secondPredicate.OutcomePattern)
{
return 1;
}
return 0;
}
}
}
}
* کلاس ITokenizer.cs
using System;
namespace split.token
{
public interface ITokenizer
{
string[] Tokenize(string input);
Span[] TokenizePositions(string input);
}
}
* کلاس TokenEventReader.cs
namespace split.token
{
public class TokenEventReader : split.ITrainingEventReader
{
private static readonly split.IContextGenerator<split.Pair<string, int>> mContextGenerator = new TokenContextGenerator();
private StreamReader mStreamReader;
private List<split.TrainingEvent> mEventList = new List<split.TrainingEvent>();
private int mCurrentEvent = 0;
public TokenEventReader(StreamReader dataReader)
{
mStreamReader = dataReader;
string nextLine = mStreamReader.ReadLine();
if (nextLine != null)
{
AddEvents(nextLine);
}
}
private void AddEvents(string line)
{
string[] spacedTokens = line.Split(' ');
for (int currentToken = 0; currentToken < spacedTokens.Length; currentToken++)
{
string buffer = spacedTokens[currentToken];
if (MaximumEntropyTokenizer.AlphaNumeric.IsMatch(buffer))
{
int lastIndex = buffer.Length – 1;
for (int index = 0; index < buffer.Length; index++)
{
string[] context = mContextGenerator.GetContext(new split.Pair<string, int>(buffer, index));
if (index == lastIndex)
{
mEventList.Add(new split.TrainingEvent("T", context));
}
else
{
mEventList.Add(new split.TrainingEvent("F", context));
}
}
}
}
}
public virtual bool HasNext()
{
return (mCurrentEvent < mEventList.Count);
}
public virtual split.TrainingEvent ReadNextEvent()
{
split.TrainingEvent trainingEvent = mEventList[mCurrentEvent];
mCurrentEvent++;
if (mEventList.Count == mCurrentEvent)
{
mCurrentEvent = 0;
mEventList.Clear();
string nextLine = mStreamReader.ReadLine();
if (nextLine != null)
{
AddEvents(nextLine);
}
}
return trainingEvent;
}
}
}
کلاسهای Pos : برای تعیین نقش کلمات استفاده میشود که شامل کلاسهای زیر میباشد.
* کلاس BeamSearch.cs
namespace split.pos
{
public class BeamSearch
{
internal split.IMaximumEntropyModel Model;
internal IBeamSearchContextGenerator ContextGenerator;
internal int Size;
private static object[] mEmptyAdditionalContext = new object[0];
private double[] mProbabilities;
private Cache mContextsCache;
private const int mZeroLog = -100000;
public BeamSearch(int size, IBeamSearchContextGenerator contextGenerator, split.IMaximumEntropyModel model)
: this(size, contextGenerator, model, 0)
{
}
public BeamSearch(int size, IBeamSearchContextGenerator contextGenerator, split.IMaximumEntropyModel model, int cacheSize)
{
Size = size;
ContextGenerator = contextGenerator;
Model = model;
mProbabilities = new double[model.OutcomeCount];
if (cacheSize > 0)
{
mContextsCache = new Cache(cacheSize);
}
}
public Sequence[] BestSequences(int numSequences, object[] sequence, object[] additionalContext)
{
return BestSequences(numSequences, sequence, additionalContext, mZeroLog);
}
public virtual Sequence[] BestSequences(int numSequences, object[] sequence, object[] additionalContext, double minSequenceScore)
{
int sequenceCount = sequence.Length;
ListHeap<Sequence> previousHeap = new ListHeap<Sequence>(Size);
ListHeap<Sequence> nextHeap = new ListHeap<Sequence>(Size);
ListHeap<Sequence> tempHeap;
previousHeap.Add(new Sequence());
if (additionalContext == null)
{
additionalContext = mEmptyAdditionalContext;
}
for (int currentSequence = 0; currentSequence < sequenceCount; currentSequence++)
{
int sz = System.Math.Min(Size, previousHeap.Size);
int sc = 0;
for (; previousHeap.Size > 0 && sc < sz; sc++)
{
Sequence topSequence = previousHeap.Extract();
String[] outcomes = topSequence.Outcomes.ToArray();
String[] contexts = ContextGenerator.GetContext(currentSequence, sequence, outcomes, additionalContext);
double[] scores;
if (mContextsCache != null)
{
scores = (double[])mContextsCache[contexts];
if (scores == null)
{
scores = Model.Evaluate(contexts, mProbabilities);
mContextsCache[contexts] = scores;
}
}
else
{
scores = Model.Evaluate(contexts, mProbabilities);
}
double[] tempScores = new double[scores.Length];
Array.Copy(scores, tempScores, scores.Length);
Array.Sort(tempScores);
double minimum = tempScores[System.Math.Max(0, scores.Length – Size)];
for (int currentScore = 0; currentScore < scores.Length; currentScore++)
{
if (scores[currentScore] < minimum)
{
continue; //only advance first "size" outcomes
}
string outcomeName = Model.GetOutcomeName(currentScore);
if (ValidSequence(currentSequence, sequence, outcomes, outcomeName))
{
Sequence newSequence = new Sequence(topSequence, outcomeName, scores[currentScore]);
if (newSequence.Score > minSequenceScore)
{
nextHeap.Add(newSequence);
}
}
}
if (nextHeap.Size == 0)
{
for (int currentScore = 0; currentScore < scores.Length; currentScore++)
{
string outcomeName = Model.GetOutcomeName(currentScore);
if (ValidSequence(currentSequence, sequence, outcomes, outcomeName))
{
Sequence newSequence = new Sequence(topSequence, outcomeName, scores[currentScore]);
if (newSequence.Score > minSequenceScore)
{
nextHeap.Add(newSequence);
}
}
}
}
}
)
previousHeap.Clear();
tempHeap = previousHeap;
previousHeap = nextHeap;
nextHeap = tempHeap;
}
int topSequenceCount = System.Math.Min(numSequences, previousHeap.Size);
Sequence[] topSequences = new Sequence[topSequenceCount];
int sequenceIndex = 0;
for (; sequenceIndex < topSequenceCount; sequenceIndex++)
{
topSequences[sequenceIndex] = (Sequence)previousHeap.Extract();
}
return topSequences;
}
public virtual Sequence BestSequence(ArrayList sequence, object[] additionalContext)
{
return BestSequences(1, sequence.ToArray(), additionalContext)[0];
}
public Sequence BestSequence(object[] sequence, object[] additionalContext)
{
return BestSequences(1, sequence, additionalContext, mZeroLog)[0];
}
protected internal virtual bool ValidSequence(int index, ArrayList inputSequence, Sequence outcomesSequence, string outcome)
{
return true;
}
protected internal virtual bool ValidSequence(int index, object[] inputSequence, string[] outcomesSequence, string outcome)
{
return true;
}
}
}
* کلاس EnglishMaximumEntrop
using System;
namespace split.pos
{
public class EnglishMaximumEntropyPosTagger : MaximumEntropyPosTagger
{
public EnglishMaximumEntropyPosTagger(string modelFile, PosLookupList dictionary)
: base(GetModel(modelFile), new DefaultPosContextGenerator(), dictionary)
{
}
public EnglishMaximumEntropyPosTagger(string modelFile, string dictionary)
: base(GetModel(modelFile), new DefaultPosContextGenerator(), new PosLookupList(dictionary))
{
}
public EnglishMaximumEntropyPosTagger(string modelFile)
: base(GetModel(modelFile), new DefaultPosContextGenerator())
{
}
private static split.IMaximumEntropyModel GetModel(string name)
{
return new split.GisModel(new split.BinaryGisModelReader(name));
}
}
}
* کلاس IBeamSearchContextGenerator.cs
using System;
using System.Collections;
namespace split.pos
{
public interface IBeamSearchContextGenerator : split.IContextGenerator
{
string[] GetContext(int index, object[] sequence, string[] priorDecisions, object[] additionalContext);
}
}
* کلاس IPosContextGenerator.cs
using System;
using System.Collections;
namespace split.pos
{
public interface IPosContextGenerator : IBeamSearchContextGenerator
{
new string[] GetContext(int position, object[] tokens, string[] previousTags, object[] additionalContext);
}
}
* کلاس IPosTagger.cs
using System;
using System.Collections;
namespace split.pos
{
public interface IPosTagger
{
ArrayList Tag(ArrayList tokens);
string[] Tag(string[] tokens);
string TagSentence(string sentence);
}
}
* کلاس StringTokenizer.cs
using System;
namespace split.pos
{
public class StringTokenizer
{
private const string mDelimiters = " tnr";
int mPosition;
public StringTokenizer(string input)
: this(input, mDelimiters.ToCharArray())
{
}
public StringTokenizer(string input, string separators)
: this(input, separators.ToCharArray())
{
}
public StringTokenizer(string input, params char[] separators)
{
mTokens = input.Split(separators);
mPosition = 0;
}
public string NextToken()
{
while (mPosition < mTokens.Length)
{
if ((mTokens[mPosition].Length > 0))
{
return mTokens[mPosition++];
}
mPosition++;
}
return null;
}
}
فرم اصلی به شکل زیر میباشد که شامل قسمتهای
> Enter Your Text : برای وارد کردن متن
> Split : شکستن متن وارد شده در TextBox به جملات و نمایش آنها .
> Tokenize : شکستن جملات به کلمه.
> Pos Tagger : تعیین نقش هر کلمه.
> Save To XML : ذخیره روابط بدست آمده از جمله در فایل XML .
> Relation Presentation : رفتن به فرم Graph برای نمایش رابطههای ذخیره شده در فایل XML.
private void button1_Click(object sender, EventArgs e)
{
string[] sentences = SplitSentences(txtIn.Text);
txtOut.Text = string.Join("rnrn", sentences);
}
private string[] SplitSentences(string paragraph)
{
if (mSentenceDetector == null)
{
mSentenceDetector = new split.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin");
}
return mSentenceDetector.SentenceDetect(paragraph);
}
private void button2_Click(object sender, EventArgs e)
{
StringBuilder output = new StringBuilder();
string[] sentences = SplitSentences(txtIn.Text);
foreach (string sentence in sentences)
{
string[] tokens = TokenizeSentence(sentence);
output.Append(string.Join(" | ", tokens)).Append("rnrn");
}
txtOut.Text = output.ToString();
}
private string[] TokenizeSentence(string sentence)
{
if (mTokenizer == null)
{
mTokenizer = new token.EnglishMaximumEntropyTokenizer(mModelPath + "EnglishTok.nbin");
}
return mTokenizer.Tokenize(sentence);
private void button3_Click(object sender, EventArgs e)
{ StringBuilder output = new StringBuilder();
string[] sentences = SplitSentences(txtIn.Text);
foreach (string sentence in sentences)
{
string[] tokens = TokenizeSentence(sentence);
string[] tags = PosTagTokens(tokens);
for (int currentTag = 0; currentTag < tags.Length; currentTag++)
{
output.Append(tokens[currentTag]).Append("/").Append(tags[currentTag]).Append(" ");
}
output.Append("rnrn");
}
txtOut.Text = output.ToString();
}
private string[] PosTagTokens(string[] tokens)
{
if (mPosTagger == null)
{
mPosTagger = new pos.EnglishMaximumEntropyPosTagger(mModelPath + "EnglishPOS.nbin", mModelPath + @"Parsertagdict");
}
return mPosTagger.Tag(tokens);
}
private void button4_Click(object sender, EventArgs e)
{
if (txtIn.Text != "")
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
bool flag = false;
int sent = 0;
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);
doc.AppendChild(dec);
XmlElement root = doc.CreateElement("Sentences");
doc.AppendChild(root);
StringBuilder output = new StringBuilder();
string[] sentences = SplitSentences(txtIn.Text);
foreach (string sentence in sentences)
{
int rel = 1;
sent++;
string[] tokens = TokenizeSentence(sentence);
string[] tags = PosTagTokens(tokens);
for (int currentTag = 0; currentTag < tags.Length; currentTag++)
{
if ((currentTag + 1) < tags.Length)
{
if (tokens[currentTag] + " " + tokens[currentTag + 1] == "such as" || tokens[currentTag] + " " + tokens[currentTag + 1] == "and other" || tokens[currentTag] + " " + tokens[currentTag + 1] == "or other")
{
if (tags[currentTag – 1] == "NN" || tags[currentTag – 1] == "NNS" || tags[currentTag – 1] == "NNP" || tags[currentTag – 1] == "NNPS")
if (tags[currentTag + 2] == "NN" || tags[currentTag + 2] == "NNS" || tags[currentTag + 2] == "NNP" || tags[currentTag + 2] == "NNPS")
{
XmlNode sentencei = doc.CreateElement("sentence" + sent);
root.AppendChild(sentencei);
XmlNode relate = doc.CreateElement("relation" + rel);
sentencei.AppendChild(relate);
XmlNode tag1 = doc.CreateElement("None");
tag1.InnerText = tokens[currentTag – 1];
XmlNode tag2 = doc.CreateElement("verb");
tag2.InnerText = tokens[currentTag] + " " + tokens[currentTag + 1];
XmlNode tag3 = doc.CreateElement("None");
tag3.InnerText = tokens[currentTag + 2];
relate.AppendChild(tag1);
relate.AppendChild(tag2);
relate.AppendChild(tag3);
if (tokens[currentTag] + " " + tokens[currentTag + 1] == "such as")
{
int i = currentTag + 3;
int j = currentTag + 4;
while ((tokens[i] == "," || tokens[i] == "and" || tokens[i] == "or") && (tags[j] == "NN" || tags[j] == "NNS" || tags[j] == "NNP" || tags[j] == "NNPS"))
{
XmlNode tag4 = doc.CreateElement("None");
tag4.InnerText = tokens[j];
relate.AppendChild(tag4);
i = i + 2;
j = j + 2;
if (!(i < tags.Length && j < tags.Length))
break;
}
}
flag = true;
rel++;
}
}
if (tokens[currentTag] == "such" || tokens[currentTag] == "Such")
{
if (tags[currentTag + 1] == "NN" || tags[currentTag + 1] == "NNS" || tags[currentTag + 1] == "NNP" || tags[currentTag + 1] == "NNPS")
if (tags[currentTag + 3] == "NN" || tags[currentTag + 3] == "NNS" || tags[currentTag + 3] == "NNP" || tags[currentTag + 3] == "NNPS")
if (tokens[currentTag + 2] == "as")
{
XmlNode sentencei = doc.CreateElement("sentence" + sent);
root.AppendChild(sentencei);
XmlNode relate = doc.CreateElement("relation" + rel);
sentencei.AppendChild(relate);
XmlNode tag1 = doc.CreateElement("None");
tag1.InnerText = tokens[currentTag + 1];
XmlNode tag2 = doc.CreateElement("verb");
tag2.InnerText = "such — as";
XmlNode tag3 = doc.CreateElement("None");
tag3.InnerText = tokens[currentTag + 3];
relate.AppendChild(tag1);
relate.AppendChild(tag2);
relate.AppendChild(tag3);
int i = currentTag + 4;
int j = currentTag + 5;
while ((tokens[i] == "," || tokens[i] == "and" || tokens[i] == "or") && (tags[j] == "NN" || tags[j] == "NNS" || tags[j] == "NNP" || tags[j] == "NNPS"))
{
XmlNode tag4 = doc.CreateElement("None");
tag4.InnerText = tokens[j];
relate.AppendChild(tag4);
i = i + 2;
j = j + 2;
if (!(i < tags.Length && j < tags.Length))
break;
}
flag = true;
rel++;
}
}
if (tokens[currentTag] == "including" || tokens[currentTag] == "especially")
{
if (!(tokens[currentTag – 1] == ","))
{
if (tags[currentTag – 1] == "NN" || tags[currentTag – 1] == "NNS" || tags[currentTag – 1] == "NNP" || tags[currentTag – 1] == "NNPS")
if (tags[currentTag + 1] == "NN" || tags[currentTag + 1] == "NNS" || tags[currentTag + 1] == "NNP" || tags[currentTag + 1] == "NNPS")
{
XmlNode sentencei = doc.CreateElement("sentence" + sent);
root.AppendChild(sentencei);
XmlNode relate = doc.CreateElement("relation" + rel);
sentencei.AppendChild(relate);
XmlNode tag1 = doc.CreateElement("None");
tag1.InnerText = tokens[currentTag – 1];
XmlNode tag2 = doc.CreateElement("verb");
tag2.InnerText = tokens[currentTag];
XmlNode tag3 = doc.CreateElement("None");
tag3.InnerText = tokens[currentTag + 1];
relate.AppendChild(tag1);
relate.AppendChild(tag2);
relate.AppendChild(tag3);
int i = currentTag + 2;
int j = currentTag + 3;
while ((tokens[i] == "," || tokens[i] == "and" || tokens[i] == "or") && (tags[j] == "NN" || tags[j] == "NNS" || tags[j] == "NNP" || tags[j] == "NNPS"))
{
XmlNode tag4 = doc.CreateElement("None");
tag4.InnerText = tokens[j];
relate.AppendChild(tag4);
i = i + 2;
j = j + 2;
if (!(i < tags.Length && j < tags.Length))
break;
}
flag = true;
rel++;
}
}
else
{
if (tags[currentTag – 2] == "NN" || tags[currentTag – 2] == "NNS" || tags[currentTag – 2] == "NNP" || tags[currentTag – 2] == "NNPS")
if (tags[currentTag + 1] == "NN" || tags[currentTag + 1] == "NNS" || tags[currentTag + 1] == "NNP" || tags[currentTag + 1] == "NNPS")
{
XmlNode sentencei = doc.CreateElement("sentence" + sent);
root.AppendChild(sentencei);
XmlNode relate = doc.CreateElement("relation" + rel);
sentencei.AppendChild(relate);
XmlNode tag1 = doc.CreateElement("None");
tag1.InnerText = tokens[currentTag – 2];
XmlNode tag2 = doc.CreateElement("verb");
tag2.InnerText = tokens[currentTag];
XmlNode tag3 = doc.CreateElement("None");
tag3.InnerText = tokens[currentTag + 1];
relate.AppendChild(tag1);
relate.AppendChild(tag2);
relate.AppendChild(tag3);
int i = currentTag + 2;
int j = currentTag + 3;
while ((tokens[i] == "," || tokens[i] == "and" || tokens[i] == "or") && (tags[j] == "NN" || tags[j] == "NNS" || tags[j] == "NNP" || tags[j] == "NNPS"))
{
XmlNode tag4 = doc.CreateElement("None");
tag4.InnerText = tokens[j];
relate.AppendChild(tag4);
i = i + 2;
j = j + 2;
if (!(i < tags.Length && j < tags.Length))
break;
}
flag = true;
rel++;
}
}
}
if(tokens[currentTag]!="including")
if (tags[currentTag] == "VB" || tags[currentTag] == "VBD" || tags[currentTag] == "VBZ" || tags[currentTag] == "VBN" || tags[currentTag] == "VBP" || tags[currentTag] == "VBG")
{
if (tags[currentTag – 1] == "NN" || tags[currentTag – 1] == "NNS" || tags[currentTag – 1] == "NNP" || tags[currentTag – 1] == "NNPS")
if (tags[currentTag + 1] == "NN" || tags[currentTag + 1] == "NNS" || tags[currentTag + 1] == "NNP" || tags[currentTag + 1] == "NNPS")
{
XmlNode sentencei = doc.CreateElement("sentence" + sent);
root.AppendChild(sentencei);
XmlNode relate = doc.CreateElement("relation" + rel);
sentencei.AppendChild(relate);
XmlNode tag1 = doc.CreateElement("None");
tag1.InnerText = tokens[currentTag – 1];
XmlNode tag2 = doc.CreateElement("verb");
tag2.InnerText = tokens[currentTag];
XmlNode tag3 = doc.CreateElement("None");
tag3.InnerText = tokens[currentTag + 1];
relate.AppendChild(tag1);
relate.AppendChild(tag2);
relate.AppendChild(tag3);
flag = true;
rel++;
}
}
//root.AppendChild(sentencei);
}
output.Append(tokens[currentTag]).Append("/").Append(tags[currentTag]).Append(" ");
}
output.Append("rnrn");
}
txtOut.Text = output.ToString();
if (flag ==true)
doc.Save(saveFileDialog1.FileName);
else
MessageBox.Show("در این متن رابطه ای وجود ندارد.");
}
}
}
presentform frm = new presentform();
frm.Show();
فرم زیر برای نمایش رابطههای ذخیره شده در فایل XML استفاده میشود که شامل قسمتهای زیر است:
> Relation Present : برای باز کردن فایل XML و نمایش رابطههای ذخیره شده در آن.
> Exit : برای بستن پنجره.
private void line(int x1, int y1, int x2, int y2)
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.CadetBlue);
g.DrawLine(p, x1, y1, x2, y2);
}
private void graph(int x, int y, string txt)
{
Label l = new Label();
l.Text = txt;
l.BorderStyle = BorderStyle.FixedSingle;
l.TextAlign = ContentAlignment.MiddleCenter;
l.Size = new Size(80, 20);
if (s3 == "None")
l.BackColor = Color.Cyan;
else
l.BackColor = Color.Chocolate;
l.Location = new Point(x, y);
Controls.Add(l);
l.Show();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
int X = 5;
int Y = 5;
int X1 = 85;
int Y1 = 15;
XmlDocument doc = new XmlDocument();
doc.Load(openFileDialog1.FileName);
XmlNode root = doc.DocumentElement;
bool flag1 = true;
for (int i = 0; flag1 ; i++)
{
bool fl = true;
for (int j = 0; fl ; j++)
{
bool flag = true;
int b = 0;
for (int k = 0; flag ; k++)
{
string n = root.ChildNodes[i].ChildNodes[j].ChildNodes[k].InnerText;
graph(X, Y, n);
if(k==0)
X = X + 130;
if (k >= 1 && k<=2)
{
line(X1, Y1, X1 + 50, Y1);
X1 = X1 + 130;
if (k == 1)
X = X + 130;
else
Y = Y + 25;
b = Y1;
}
if(k>=3)
{
Y1 = Y1 + 25;
line(215, b , X1-80, Y1);
Y = Y + 25;
}
//control error for loop k
try
{
string s = root.ChildNodes[i].ChildNodes[j].ChildNodes[k + 1].InnerText;
}
catch
{
flag = false;
X = 5;
Y = Y + 50;
X1 = 85;
Y1 = Y1 + 75;
}
}
try
{
string n1 = root.ChildNodes[i].ChildNodes[j+1].InnerText;
}
catch
{
fl = false;
}
}
try
{
string n1 = root.ChildNodes[i+1].InnerText;
}
catch
{
flag1 = false;
}
}
}
1 World Wide Web- WWW
2 Semantic Web
3 Tim Berners-Lee
4 half duplex
5 Point to Point
6 Open Sources
7 Complete Queries
8 Document Syntax
9 Semantics
10 hypertext
11 Client-Server
12 Markup language
13 Interactions
14 Semantic web
15 Knowledge bases
16 Artificial intelligence
17 Sir Tim Berners-Lee
18 European Union
19 Ontology
20 W3C
21 Downward Compatibility
22 Agent
23 Uniform Resource Identifiers
24 Opaque
25 markup
26 ontology
27 Logic
28 proof
29 Trust
30 World Wide Web World Wide Web
31 Node
32 Schema
33 DARPA Agent Markup Language
34 Ontology Web Language
35 Ontology
36 Stanford University
37 http://protege.stanford.edu
38 Alignment
39 Merging
40 Split
41 entropy models
42 Hearst
—————
————————————————————
—————
————————————————————
[1]
iv
iiv
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[34]
[35]
[36]
[37]
[38]
[39]
[40]
[41]
[42]
[43]
[44]
[45]
[46]
[47]
[48]
[49]
[50]
[51]
[52]
[53]
[54]
[55]
[56]
[57]
[58]
[59]
[60]
[61]
[62]
[63]
[64]
[65]
[66]
[67]
[68]
[69]
[70]
[71]
[72]
[73]
[74]
[75]
[76]
[77]
[78]
[79]
[80]
[81]
[86]
[87]
[88]
[89]
[90]