בעוד אנו ממשיכים לפתח את NomNom, צ’אטבוט המתכונים האינטליגנטי שלנו, אנו נרגשים לשתף חלק מהפרטים הטכניים מאחורי היישום שלו. בליבו, NomNom משלב טכניקות מתקדמות של עיבוד שפה טבעית (NLP) עם גרף ידע מבוסס RDF חזק כדי לספק חוויית חיפוש מתכונים שיחתית חלקה.
צינור ה-NLP: מקלט המשתמש לשאילתה מובנית#
צינור ה-NLP שלנו מתוכנן להפוך שאילתות משתמש בשפה טבעית לייצוגים מובנים שניתן להשתמש בהם לשאילתת גרף הידע RDF שלנו. הנה פירוט של הרכיבים העיקריים:
טוקניזציה: אנו משתמשים ב-Natural Language Toolkit (NLTK) עבור Python כדי לפרק את קלט המשתמש לטוקנים בודדים. שלב זה הוא קריטי לעיבוד נוסף.
תיוג חלקי דיבור: אנו מיישמים את מתייג חלקי הדיבור של NLTK כדי לזהות את התפקיד הדקדוקי של כל מילה בשאילתה. זה עוזר בהבנת המבנה של בקשת המשתמש.
זיהוי ישויות מוכרות (NER): פיתחנו מודל NER מותאם אישית באמצעות Stanford NER ונתוני אימון נוספים ספציפיים לתחום הקולינרי. זה מאפשר לנו לזהות מרכיבים, שיטות בישול, מטבחים וישויות רלוונטיות אחרות בשאילתת המשתמש.
ניתוח תלות: אנו משתמשים ב-Stanford Parser כדי להבין את היחסים בין חלקים שונים של השאילתה, שהוא שימושי במיוחד עבור בקשות מורכבות.
סיווג כוונה: יישמנו מודל סיווג רב-כיתתי באמצעות scikit-learn כדי לסווג שאילתות משתמש לכוונות כגון חיפוש מתכון, שאילתת תזונה, או הסבר טכניקת בישול.
יצירת שאילתה: בהתבסס על הישויות שחולצו, הכוונה שזוהתה והמבנה שנותח, אנו מייצרים שאילתת SPARQL שניתן לבצע מול גרף הידע RDF שלנו.
גרף ידע RDF: המוח של NomNom#
גרף הידע RDF שלנו נבנה ומנוהל באמצעות מסגרת Apache Jena. הנה כיצד בנינו ויישמנו רכיב קריטי זה:
תכנון אונטולוגיה: פיתחנו אונטולוגיית OWL מותאמת אישית המגדירה מחלקות ותכונות עבור מתכונים, מרכיבים, שיטות בישול, מידע תזונתי ועוד. אונטולוגיה זו משמשת כסכמה לגרף הידע שלנו.
קליטת נתונים: יצרנו סקריפטים ב-Python שמתרגמים נתוני מתכונים ממקורות שונים (אתרי אינטרנט, ספרי בישול, הגשות משתמשים) לשלשות RDF התואמות לאונטולוגיה שלנו.
מאגר שלשות: אנו משתמשים ב-Apache Jena TDB כמאגר השלשות שלנו, המספק אחסון ושאילתה יעילים של נתוני RDF.
נקודת קצה SPARQL: הקמנו שרת Fuseki כדי לספק נקודת קצה SPARQL, המאפשרת למערכת ה-NLP שלנו לשאול את גרף הידע.
מנוע הסקה: אנו מנצלים את יכולות ההסקה המובנות של Jena כדי לגזור עובדות ויחסים נוספים, ומעשירים את גרף הידע שלנו.
גישור בין NLP ו-RDF: ביצוע שאילתות ויצירת תגובות#
ברגע שיש לנו שאילתת SPARQL שנוצרה מקלט המשתמש, התהליך ממשיך כך:
ביצוע שאילתה: שאילתת ה-SPARQL נשלחת לשרת Fuseki שלנו ומבוצעת מול גרף הידע RDF.
עיבוד תוצאות: תוצאות השאילתה, שמוחזרות כ-RDF, מעובדות ומומרות לפורמט שימושי יותר עבור מערכת יצירת התגובות שלנו.
יצירת תגובה: אנו משתמשים במערכת מבוססת תבניות, המיושמת ב-Python, כדי ליצור תגובות בשפה טבעית בהתבסס על תוצאות השאילתה והכוונה המקורית של המשתמש.
ניהול דיאלוג: מכונת מצבים פשוטה עוקבת אחר הקשר השיחה, מאפשרת שאלות המשך והבהרות.
אתגרים ופתרונות#
פיתוח NomNom לא היה ללא אתגרים. הנה כמה שנתקלנו בהם וכיצד התמודדנו איתם:
מורכבות שאילתה: חלק מבקשות המשתמשים יכולות להיות מורכבות למדי. יישמנו מערכת פירוק שאילתות שמפרקת שאילתות מורכבות לתת-שאילתות פשוטות יותר.
פתרון עמימות: מונחים קולינריים יכולים להיות עמומים לעתים קרובות. אנו משתמשים בשילוב של ניתוח הקשר ובקשות הבהרה מהמשתמש כדי לפתור עמימויות.
אופטימיזציה של ביצועים: ככל שגרף הידע שלנו גדל, ביצועי השאילתות יכולים להיפגע. יישמנו מנגנוני מטמון וטכניקות אופטימיזציה של שאילתות כדי לשמור על תגובתיות.
תמיכה רב-לשונית: כדי לשרת קהל גלובלי, אנו עובדים על הרחבת צינור ה-NLP שלנו לתמיכה בשפות מרובות, החל מספרדית וצרפתית.
שיפורים טכניים עתידיים#
כשאנו מביטים לעתיד, אנו נרגשים ממספר שיפורים טכניים במפת הדרכים שלנו:
למידה עמוקה ל-NLP: אנו חוקרים את השימוש במודלים של למידה עמוקה, במיוחד רשתות LSTM, כדי לשפר את יכולות ה-NLP שלנו.
גרף ידע מבוזר: כדי לטפל בנפחי נתונים גדלים, אנו בוחנים פתרונות אחסון RDF מבוזרים כמו Apache Rya.
אינטגרציית נתונים בזמן אמת: אנו מפתחים מערכת לעדכון דינמי של גרף הידע שלנו עם מתכונים חדשים ותוכן שנוצר על ידי משתמשים.
הסקה סמנטית: אנו מתכננים לנצל יכולות הסקה סמנטיות מתקדמות יותר כדי לספק המלצות מתכונים ותחליפים אינטליגנטיים עוד יותר.
NomNom מייצג צומת מרגש של NLP, טכנולוגיות ווב סמנטי ובינה מלאכותית. על ידי שילוב טכנולוגיות חדישות אלה, אנו יוצרים צ’אטבוט שלא רק מבין מתכונים אלא יכול לנהל שיחות קולינריות משמעותיות עם משתמשים.
הישארו מעודכנים לעוד צלילות טכניות עמוקות בעוד אנו ממשיכים לשפר ולהרחיב את היכולות של NomNom!