עיבוד שפה טבעית: הכירו את טכנולוגיית ה-NLP והדרכים לפתח בה

טכנולוגיית עיבוד שפה טבעית הולכת ומשתכללת והופכת לרלוונטית לפתרון של בעיות בעולם האמיתי, ולכן כדאי להכיר את אבני היסוד והכלים הנפוצים ביותר שמרכיבים מנוע NLP ואת הספריות והמודולים השימושיים ביותר. הכרות ומדריך בסיסי

צלם/תמונה: Bloomberg / Getty Images Israel

מאת אלון ערב, ארכיטקט תוכנה באינטל

עיבוד שפה טבעית – Natural Language Processing ,NLP – הוא סט של כלים המאפשרים להוציא מידע מובנה משפה טבעית על מנת שנוכל להבין אותה בתוכנה. מדובר באלגוריתמים של Machine Learning המבוססים על מודלים סטטיסטים המסוגלים למצוא תבניות בטקסט משפה טבעית.

שימוש ב-NLP ניתן למצוא בתחומים כגון: Data Mining ,Conversational UI (כגון: עוזרות אישיות או צ'טבוט), מנועי חיפוש, מתרגמי שפות ועוד. יש כיום ספריות NLP טובות, שמציעות תמיכה רבה יותר בשפות פיתוח שונות, והשימוש בהן נעשה נפוץ וקל יותר גם למהנדסי תוכנה ללא ידע רלוונטי בתחום.

ידע והיכרות עם הטכנולוגיות והמודלים ב-NLP יכולים לפתוח עבורכם דלת לפתרונות של בעיות מתחומים רבים בשפה אך חשוב קודם להדגיש מספר נקודות:

1. המודלים המצוינים פה הם סטטיסטיים ולכן אינם מדויקים ב-100%. אמנם במודלים טובים אחוז הדיוק הוא יחסית גבוה, אך תמיד יהיו טעויות וצורך להוסיף חוקים כדי להגיע לתוצאות טובות. זהו אינו פתרון קסם ותוצאות טובות דורשות עבודה רבה.

ב. כדי להוציא מידע ממוקד מטקסט, או אפילו לממש צ'טבוט פשוט, אפשר לפתח פתרון גם ללא מומחי NLP ולהגיע לתוצאות טובות ומגניבות בעזרת כלים שיוזכרו כאן, דבר שהיה עד לא מזמן בלתי אפשרי.

מצד שני, יש להיות ריאליסטים – המידע כאן לא מספיק בשביל שתפתחו עוזרת אישית שניתן לדבר איתה באופן חופשי יחסית, כמו סירי וקורטנה – לשם כך תזדקקו לגדודים של אלגוריתמים, data scientists, בלשנים ומומחי NLP – אבל כן תבינו טוב יותר על גבי איזה מודלים וטכנולוגיות הן בנויות.

אבני היסוד והכלים הנפוצים יותר שמרכיבים מנוע NLP

מודל ה-Tokenizer: מודל בסיסי זה אחראי על שבירת המשפט למילים (Tokens), תוך שימוש במפרידים (delimiters) כגון: פסיק, רווח וכדומה.

מודלים לאנוטציה (Annotators):

1. Part Of Speech) POS) – מודל הנותן לכל מילה במשפט אנוטציה (פירוש) תחבירית לחלקי הדיבור הנכונים במשפט, כגון: פועל, שם עצם, שם תואר ועוד. לדוגמה:

one

מתקבל:
My = PRP$ = Personal pronoun
name = NN = Noun
is = VBZ = Verb
Alon = NNP = Proper noun

מידע זה לגבי כל מילה במשפט יכול לאפשר לנו למצוא מילים שמעניינות אותנו, ולהסתכל על החוקים סביבן. אם למשל אנו מחפשים פקודות שנאמרות לאפליקציה שלנו, אז נחפש פעלים; ואם אנחנו מחפשים שמות (כגון: אנשים, כתובות, ארגונים, מוצרים וכן הלאה) החיפוש יהיה למילים שהן שמות עצם.

2. Named Entity Recognition) NER) – מודל הנותן אנוטציה למילים או לצירופי מילים שיש להן משמעות סמנטית זהה או דומה, אם וכאשר יש להן משמעות כזאת. קטגוריות מסוג זה יכולות להיות למשל מקום, ארגון, אדם, כסף, זמן. לדוגמה:

two

מידע זה הוא שימושי ביותר אם אנחנו מעוניינים לדלות מידע מהטקסט מקטגוריה מסוימת, למשל: שמות אנשים או ארגונים, או כדי לבחון את החוקים במשפט סביב מילים אלה. יש ספריות NLP עם מודל NER מובנה שמכיל סט מוכן של אנוטציות לשימוש (out of the box), ויש ספריות שבהן אין מודל כזה כלל. אם מודל זה חשוב מאוד עבורנו, הידיעה אם הוא קיים או לא יכולה להכריע בבחירת הספרייה המתאימה.

3. Parser – הפלט של מודל זה הוא גרף סינטקטי אשר מכיל את כל הקשרים בין כל המילים במשפט. גרף זה נותן לנו יכולת להבין משמעות חשובה או קשר לוגי חשוב בין מילים. נסתכל לדוגמה על שני משפטים:

"I need to go to school"
"School is where I need to be"

three

באיור: ויזואליזציה של איך נראה הגרף הסינטקטי של המשפט הראשון. הקשרים בין מילים מיוצגים על ידי קשתות

על ידי שימוש במידע מהגרף והוצאת הקשרים בין המילים במשפט, ניתן להוציא את אותה המשמעות משני המשפטים הללו למרות השוני התחבירי הרב ביניהם, וזו גולת הכותרת של ה-NLP. עם זאת, צריך לקחת את מה שנאמר פה בספקנות קלה, שכן לא תמיד התוצאה של מודל ה-parser היא נכונה ויש מקרים שצריך להוסיף חוקים על גבי הגרף שהתקבל כדי להגיע באמת לאותה משמעות.

טכניקות פופולריות ליצירת אנוטציות NER חדשות

טכניקה נוספת ושימושית היא יצירת אנוטציית NER המוגדרת לצרכינו. חלק מספריות NLP מספקות את התשתיות ליצירת אנוטציה מסוג זה בעצמנו, ובקלות. ישנן שלוש שיטות נפוצות ליצירת אנוטציות NER:

1. מבוססות מילון (Dictionary Based) – בשיטה זו נגדיר סט של מילים או ביטויים, וכל סט יכיל מילים או ביטויים שיש להם מכנה משותף. לדוגמה: כל הערים במדינה מסוימת, או כל שמות התארים האקדמיים. שימוש נוסף יכול להיות מילים דומות/נרדפות (Synonyms). לדוגמה: רחוב הוא מילה נרדפת לסמטה, כביש, דרך ומסלול. לכל סט כזה נוכל לתת אנוטציית NER חדשה: עבור ערים – CITY; לתארים – DEGREE; לרחוב – ROAD, וכך בכל פעם שהטקסט יעבור ניתוח על ידי מודל ה-NER וייתקל במילה או ביטוי מאחד הסטים, הוא יסמן אותם עם האנוטציה המתאימה.

2. מבוסס חוקים (Rule Based) – יצירת מודל מבוסס חוקים בשפת פיתוח או ביטויים רגולריים, ונשתמש בהם כשיש צורך לזהות תבניות במשפט ולסמן אותן באנוטציית NER מתאימה. לדוגמה, ניתן להשתמש בגישה זו על מנת לזהות ולסמן מספר טלפון בטקסט בעזרת שימוש בביטוי רגולרי, דבר שלא היה ניתן לעשות בעזרת השיטה הקודמת.

3. מבוסס Machine Learning) ML) – טכניקה זו דורשת הבנה עמוקה וידע בשימוש ML, ובדרך כלל זה יתבצע על ידי אלגוריתמאי או Data Scientist שיודע לאמן מודלים מסוג זה.

כדי להבין ממעוף הציפור כיצד עובדים מודלים אלה, בואו נניח שהיינו רוצים לזהות שמות של ערים בטקסט בעזרת ML. השלב הראשון הוא שלב האימון (offline), שבו נסמן בטקסט ידנית וכמה שיותר מדויק איזו מילה היא עיר ואיזו מילה אינה עיר. בנוסף, נגדיר סט של אלמנטים (Feature Vector) שיחולצו מכל מילה – לדוגמה, ה-Part Of Speech של המילה, אם היא מתחילה באות גדולה או כל דבר שנראה לנו רלוונטי ושלפיו היינו רוצים שהאלגוריתם ילמד מתי המשמעות של מילה היא עיר. לאחר מכן נזין את המידע לאלגוריתם כזה או אחר של ML, ובתמורה נקבל בפלט מודל סטטיסטי [עיר/לא עיר, Feature Vector]. השלב השני הוא בזמן ריצה (runtime): כאשר מתקבל טקסט חדש וללא ערים נוציא את ה-Feature Vector שבחרנו מכל מלה, ואם בחרנו Features טובים בזמן האימון, המודל שלנו יצליח לזהות נכונה האם המשמעות של מילה היא עיר או לא.

מודולים שימושיים נוספים

1. Stemming and Lemmatization Algorithms – אלגוריתמים אלה מסוגלים להוציא את השורש או את מילת הבסיס של מילה מסוימת, לדוגמה למילים "stemmer", "stemming", "stemmed" יש את אותו הבסיס – “stem”. היכולת להוציא את הבסיס היא מאוד שימושית כאשר מחפשים מילים מסוימות ולא רוצים להכיר את כל הדרכים והצורות שניתן לרשום אותן.

2. True Case – אלגוריתם המאפשר להוציא את ה-Upper/Lower case המקורי או הנכון של המילה במצבים שבהם מידע זה אבד, למשל במודלים של Speech To Text שבהם לרוב מוציאים את הטקסט כשכולו Upper Case או כולו Lower Case. אלגוריתם זה שימושי מאוד במצבים כאלה, שכן המודלים של ספריות ה-NLP בדרך כלל מאומנים על מידע חדשותי (כמו: גוגל ניוז), ולכן יתנו תוצאות מדויקות יותר על טקסט שהוא נכון מבחינת תחביר, דקדוק וה-Case של המילה.

ספריית CoreNLP

סטנפורד CoreNLP היא ספריית קוד פתוח מבית סטנפורד, תחת רישיון של GNU General Public License, ובעזרתה ניתן להוציא מטקסט את האלמנטים שדיברנו עליהם עד עכשיו. זו אחת מהספריות הנפוצות ביותר לשימוש זו תקופה ארוכה, יש לה קהילה רחבה של משתמשים ולכן גם תמיכה מצוינת ודוקומנטציה טובה מאוד. כדי להטמיע את CoreNLP בפרויקט דרך Maven יש להוסיף את התלויות הבאות:

<dependencies>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.6.0</version>
<classifier>models</classifier>
</dependency>
</dependencies>

הספרייה מכילה שני מרכיבים עיקריים:

1. קוד הבסיס.

2. מודולים של השפה, חלק זה מרכיב את רוב משקל הספרייה.

באתר הבית של CoreNLP ניתן לראות דוגמאות קוד פשוטות להתממשקות ולקבל תמיכה ואינפורמציה רבה נוספת על הספרייה. ישנן כמובן ספריות רבות נוספות שניתן לבדוק, להלן כמה מהנפוצות שבהן:

(NLP4J(Java), NLTK(Python), OpenNLP(Java), Spacy(Python

מפתחי תוכנה נתקלים בבעיות כאלה או אחרות שנוגעות לטקסט, ולרוב בוחרים בפתרונות אשר מבוססים על ביטויים רגולריים. אולם ביטויים רגולריים אינם מתאימים לפתרון כל בעיה, והיום יש כלים נוספים שיכולים לעזור לנו. NLP היא טכנולוגיה מדהימה, והיא הופכת לרלוונטית יותר ויותר לפתרון של בעיות בעולם האמיתי.

 

כתב אורח

אנחנו מארחים מפעם לפעם כותבים טכנולוגים אורחים, המפרסמים כתבות בתחומי התמחות שלהם. במידה ואתם מעוניינים לפרסם פוסט בשמכם, פנו אלינו באמצעות טופס יצירת קשר באתר.

הגב

13 Comments on "עיבוד שפה טבעית: הכירו את טכנולוגיית ה-NLP והדרכים לפתח בה"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
בוני
Guest

שלום רב,
מי הכותב?

V2.0
Guest

כתוב למעלה: "מאת אלון ערב, ארכיטקט תוכנה באינטל".
ולעניין, כתבה מעולה. בבקשה תמשיכו עם יותר כתבות כאלו ופחות "הושק ה-X של אפל בישראל"…

בוני
Guest

תודה!
הפכתי למעלה ולמטה ופספסתי…

Omessi
Guest

תודה, מאלף.
אבל לא הבנתי את הדוגמה שנתת (need to go to school), כשאתה טוען "ניתן להוציא את אותה המשמעות משני המשפטים הללו למרות השוני התחבירי הרב ביניהם, וזו גולת הכותרת".
לי דווקא נראה שהמשפטים הללו מאוד שונים זה מזה (הראשון – "אני חייב ללכת לבית הספר", כלומר יש לי הכרח שעליי לעמוד בו, בעוד השני הוא "בית ספר זה המקום בו עליי להיות", כלומר טוב יהיה שאהיה בבית ספר ולא במקום או בעיסוק אחר).

ASD
Guest
הדוגמא כנראה לא היתה מאוד טובה, אבל כן העבירה את הרעיון שאפשר לתת משפטים בכל מיני צורות ולהבין את המשמעות הדומה. בהקשר של הדוגמא הספציפית שהוא נתן, אני חושב שפה טמון האתגר הגדול באימון מכונה. המכונה תראה את זה כשני משפטים בעלי זהות דומה כשבפועל אנחנו (בני האדם) מבינים את השוני ואז נשאלת השאלה, איזה מרכיבים אתה מוסיף לשלב האימון כדי שהיא תזהה את האנקדוטות שאנחנו מבינים והמכונה לא. בסופו של דבר, שום אלגוריתם לא ייתן לך פיתרון out of the box. כל אחד ייתן פיתרון משלו לבעיות אחרות והקושי הוא לשלב בניהם ויותר מכך – לשפר אותם כדי שיתאימו… Read more »
Omessi
Guest

תודה!
ובכול זאת – אני חושב שהדוגמה נפלאה…!
היא ממחישה את שלב התובנה בו אנו (והמערכות הללו) נמצאים זהו שלב בראשיתי מאוד, כמובן, ואנחנו עדיין רחוקים מאוד. היא גם ממחישה את הסיכון הגדול בפרשנות מכונה, שעלולה להבין את ההפך ממה שכתוב בטקסט.
למשל: "תהרוג אותי, אני לא מבין כלום", משפט ששולח את צוקרברג להזמין ניידת ולעצור אותך באשמת הריגה אותי ו/או שידול להתאבדות.
האמת – אני מרחם על המכונה. שהרי בני האדם כבר יודעים איך לעקוף את צוקרברג (מכניסים מקף במקום אחת האותיות במילה הגסה), בעוד שהמכונה ייקח לה שנים ללמוד את מי מחליף המקף, ואיזה משפט בדיוק עליה לפרשן…

avimunk@gmail.com
Member
[email protected]

אכן מאמר מצוין..
נראה שהדרך לתמיכה בעברית עוד רחוקה.. כך שהשימוש ״בביצה״ הקטנה שלנו לא יקרה בקרוב

erez
Guest

יש חברה שעושה בדיוק את זה AC VOCA מבית AudioCodes

דובין
Guest

למי שמעונין להתחיל אני ממליץ על SPACY מבוססת על פיתוןת מהירה ומאוד קלה לשימוש:
https://spacy.io/

יאיר
Guest

כתבה כזו עושה חשק לחזור לפיתוח אחרי 25 שנים ללא יד על המקלדת

guy
Guest

NLP זה אשליה. הדרך היחידה להשיג רמה גבוהה בעיבוד שפה זה לעבור לשפות חד משמעיות כמו lojban

נועם
Guest

תוכל לפרט?

Yoyo
Guest

מישהו יודע אם קיימים פתרונות בעברית?

wpDiscuz

תגיות לכתבה: