בלשנות חישובית\NLPהקדמה:
NLP הוא תחום המחקר במדעי המחשב שמטרתו היא לגרום למחשבים "להבין" ולפתור בעיות הקשורות בשפות אנושיות.
הפתרונות בימינו לבעיות אלה מבוססים בעיקר על מודלים מבוססי למידה כמו Support Vector Machines, Hidden Markov Models, Conditional Random Fields שבהסבר שטחי הרעיון בהם הוא לקבל המון מידע מתוייג (אם מדובר בבעיית POS Tagging אז נניח המידע יהיה המון טקסטים שמתוייגים עפ"י חלקי דיבר) ובעזרת וקטור פיצ'רים שיינתנו למודל כקלט ומשקל שנותנים לכל פיצ'ר שיאומן לפי הTraining Data לתייג טקסט חדש לא מתוייג. בהנתן טקסט שאותו נרצה לתייג, המודל ייתן למילים בטקסט את התיוג הכי "מתאים" לפי הTraining Data בהתחשב בפיצ'רים. פיצ'ר לדוגמה יכול להיות אם נניח מילה מתחילה באות גדולה. הרעיון הוא לקחת פיצ'רים אינטואיטיביים ולחלק להם ערכים נומרי כשלבסוף תתבצע סכימה על כל הפיצ'רים הממושקלים ונרמול לטווח הסתברות מסויים.
כמו כן, יש שיטות נוספות לפתרון בעיות מתחום הNLP שמבוססות חוקים לשוניים ותבניות שניתנות מראש למודל.
בד"כ המדד להערכת טיב פתרון (Evaluation) לבעיות מסוג זה מתבסס על Precision וRecall
Precision – כמה תייגנו נכון מתוך כל אלה שתייגנו
Recall – כמה תייגנו מתוך אלה שהיינו אמורים לתייג
והרבה פעמים מוסיפים את מדד הf1 שהוא מדד שמטרתו היא לתת ממוצע הרמוני בין Precision ל Recall
http://en.wikipedia.org/wiki/F1_score
תתי בעיות:
Part Of Speech Tagging – בעיה ידועה ובסיסית בתחום הNLP היא לתייג משפט לפי חלקי הדיבר שבו. עבור המשפט: דני הלך לים - נרצה שהמחשב יבין שדני הוא הנושא, הלך הוא הפועל וים זה המושא. המחקר בתיוג POS לאנגלית בימים אלה מגיע לתוצאות של מעל 95% הצלחה.
Parsing – בעייה שמכלילה את בעיית הpos היא ניסיון לבנות עץ גזירה שלם למשפט. שהעץ יתחיל משורש שהוא המשפט, יירד לNP (Noun Pharse) וVP (Verb Phrase) ומכל אחד מהם גם יתפצל. יש כיום שיטות שמביאות ביצועים טובים בתחום, אך הביצועים לא עוברים בהרבה את ה90% (ככלל בNLP שיטה מוגדרת כמצויינת כשהיא מגיעה לדיוק של מעל 95%).
Segmentation – בעיה שפחות רלוונטית לאנגלית אך יותר לסינית ולעברית. מטרתה היא להפריד מילים ולהבין מתי מתחילה ומסתיימת מילה. בעברית יש מורפולוגיה עשירה וזאת הסיבה שלפעמים מילה מורכבת מ2 מילים. לדוגמה: כשפגשתי = כאשר פגשתי.
Word Sense Disambiguation – בעיה שבאה לטפל במשמעויות כפולות של מילה ובעצם הבנת המשמעות של המילה בקונטקסט שהיא מדוברת. עפ"י מרצה שלימד אותי, למילה "לבנה" יש בעברית 23 משמעויות (!) וברור שנרצה לזהות את המשמעות הנכונה שלה בהנתן משפט.
Named Entity Recognition – בהנתן טקסט, לעיתים נרצה לזהות בו את היישויות שהן חברות\בני אדם\מקומות וכו'. אני אישית מודע לחקר הבעיה בעיקר באנגלית ושם יותר קל להצליח בגלל השימוש באותיות גדולות בתחילת שמות. הרבה יוריסטיקות מסתמכות על כך ששמות של חברות לרוב יסתיימו בInc. והרבה פעמים גם יש שימוש במילונים של תארים (נניח אם הנושא של המשפט מלווה בCEO, סביר להניח שהנושא של המשפט הוא בן אדם) וכן מילונים של שמות של מקומות (שם המורכב מכמה מילים שהאחרונה בהן היא Lake יהיה שם של נהר (מקום)) ועוד שיטות דומות.. רוב המודלים בימים אלה בתחום הם מבוססי CRF כשהפיצ'רים משתנים בהתאם למטרת התיוג.
Sentiment Analysis – אחת התתי בעיות היותר חמות בימים אלה היא ניתוח סנטימנט של כותב הטקסט בהינתן הטקסט. כשבטקסט יהיה כתוב: Google is a bad company נרצה להסיק שהסניטמנט כלפי גוגל בטקסט הוא שלילי. כמובן שטקסטים נוטים להיות יותר מסובכים מזה בגלל שמעורבות מילות שלילה פעמים רבות וכן יש את הבעיה שאי אפשר לקבוע אם מילה היא חיובית או שלילית באופן אבסולוטי משום שהרבה פעמים חיוביות של מילה היא בהתאם לקונטקסט שלה.
שימושים:
יש אתרים בימינו שמנסים לחזות סנטימנט של חברות עפ"י תחזיות האנליסטים המתפרסמות עליהן ובכך לנסות לחזות לאן "נושבת הרוח".
יש חברות שמשתמשות במחקר בתחום כדי לנתח באופן אוטומטי תגובות של לקוחות על המוצרים שלהן ולפעמים גם מנסות לפרק את התגובות לחלקים במוצר עליהם היה הסנטימנט (אם מדובר בפלאפון אז לפעמים תהיה ביקורת שבה ייכתב שהמסך קטן מדי אבל הסאונד מעולה. המטרה תהיה לתפוס את הסנטימנט החיובי כלפי הסאונד ואת הסנטימנט השלילי כלפי המסך).
Machine Translation – תרגום מילים\משפטים\טקסטים משפה אחת לשפה אחרת, דבר שמתפתח כל יום יותר ויותר. המגמה בימים האלה היא יותר ויותר להתחיל לתרגם מרמת הביטויים מאשר מרמת המילים כדי להגיע לתוצאות טובות יותר (שלא יהיה מצב שנתרגם מילה מילה במשפט ואז נגיע בשפה אחרת למשפט לא הגיוני). Google Translate הוא דוגמה לכלי שמתפתח בכיוון המחקר בתחום הנ"ל.
קצת לינקים כדי שיהיה לכם עם מה לשחק:
POS Tagger שמבוסס על Brill Tagger שנחשב לאחד מכלי תיוג חלקי דיבר הכי טובים שיש באנגלית:
http://web.media.mit.edu/~hugo/montylingua/index.html (Python Java)
Brill Tagger Demo:
http://cst.dk/online/pos_tagger/uk/index.html
עוד POS Tagger מעולה של סטנפורד:
http://nlp.stanford.edu/software/tagger.shtml (Java)
עבור כל הPOS Taggers חשוב לדעת שהם מתייגים לפי קבוצת טאגים שנקראת Penn Treebank Tag Set והנה רשימה של הקיצורים בה ומה כל אחד אומר:
http://www.ims.uni-stuttgart.de/projekte/CorpusWorkbench/CQP-HTMLDemo/PennTreebankTS.html
Stanford Parser שהוא הפרסר הכי טוב שנתקלתי בו:
(http://nlp.stanford.edu/software/lex-parser.shtml (Java
Stanford NER שהוא כלי מעולה לNER והכי טוב שיצא לי לראות באינטרנט:
http://nlp.stanford.edu/ner/index.shtml
אם אתם מסתבכים עם הקיצורים של הNamed Entities אז רצוי לבקר בערך ויקיפדיה:
http://en.wikipedia.org/wiki/Named_entity_recognition
אתר שעושה Sentiment Analysis לכתבות כלכליות:
http://jane16.com/
אני יודע שהאתר הזה מתבסס רק על מילון של ביטויים כלכליים חיוביים ושליליים והוא מגיע לתוצאות די יפות.
GATE - חבילת NLP מאוד עשירה לJava שיש בה כלי פחות או יותר לכל משימה שתיארתי פה:
http://gate.ac.uk/
NLTK - ה-חבילת NLP שיש בPython
http://www.nltk.org/
יש לה תיעוד מאוד עשיר בספר הנ"ל:
http://www.nltk.org/book
ואם מישהו יצטרך עזרה בדברים ספציפיים אז תשאלו
Lingpipe – חבילת NLP קלה להבנה ולשימוש בג'אווה:
http://alias-i.com/lingpipe/
למי שמתעניין במחקר העדכני בתחום ורוצה לקרוא, הייתי ממליץ על האתר שמרכז את המאמרים מהכנסים הכי חשובים ועדכניים בתחום:
http://aclweb.org/anthology-new/
יש שם מנוע חיפוש באתר למעלה ובו תוכלו לחפש מאמרים לפי התחום שמעניין אתכם.
אם מישהו ירצה סקירה על תחום קונקרטי מהתחומים פה אז תגידו לי ואני אשתדל להכין.
תהנו!
