• בלוג
  • איך לזהות פעלים בטקסט עם nltk ו Python

איך לזהות פעלים בטקסט עם nltk ו Python

23/08/2022

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

1. התקנת הכלים

בשביל להתחיל לעבוד עם nltk אנחנו צריכים רק להתקין את הספריה:

pip install nltk

הבעיה עם nltk היא שהמודול לא כולל הרבה קבצי data שהוא צריך בשביל לעבוד, לכן אחרי שנכתוב את התוכנית וננסה להפעיל נקבל כל מיני הודעות כמו:

LookupError:                                                                                                                                                                          [11/35]
**********************************************************************
  Resource averaged_perceptron_tagger not found.
  Please use the NLTK Downloader to obtain the resource:

  >>> import nltk
  >>> nltk.download('averaged_perceptron_tagger')

  For more information see: https://www.nltk.org/data.html

  Attempted to load taggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle

כשזה קורה אנחנו כותבים משורת הפקודה python נכנסים ל repl וכותבים את שתי הפקודות שהוא הציע, בהודעה שהדבקתי זה:

import nltk
nltk.download('averaged_perceptron_tagger')

זה יקרה כמה פעמים עם קבצים שונים אבל בסוף התוכנית תרוץ.

2. ועכשיו לקוד

אוקיי אז אנחנו יודעים מה צריך לעשות בשביל להתחיל לעבוד עכשיו בואו נראה איך nltk עוזרת לנו למצוא פעלים בטקסט. אני משתמש ב 3 רכיבים של nltk:

  1. הרכיב word_tokenize שלוקח טקסט ומפרק אותו למילים.

  2. הרכיב pos_tag שלוקח רשימה של מילים ומסמן לנו מה התפקיד של כל מילה.

  3. הרכיב WordNetLemmatizer שלוקח מילה ומחזיר את צורת הבסיס שלה. אנחנו נשתמש בו כדי לקבל את צורת הבסיס של הפועל (בלי הטיה).

מבחינת סימונים הפונקציה pos_tag לוקחת רשימה של מילים ומחזירה רשימה של Tuples. הפריט הראשון ב tuple הוא המילה, והפריט השני הוא התפקיד שלה במשפט. התפקידים שמתחילים ב V מציינים פעלים.

קוד? קבלו:

from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.stem.wordnet import WordNetLemmatizer
import re

lemmatizer = WordNetLemmatizer()

text =word_tokenize("To Sherlock Holmes she is always the woman. I have seldom heard him mention her under any other name. In his eyes she eclipses and predominates the whole of her sex. It was not that he felt any emotion akin to love for Irene Adler. All emotions, and that one particularly, were abhorrent to his cold, precise but admirably balanced mind. He was, I take it, the most perfect reasoning and observing machine that the world has seen, but as a lover he would have placed himself in a false position. He never spoke of the softer passions, save with a gibe and a sneer. They were admirable things for the observer—excellent for drawing the veil from men’s motives and actions. But for the trained reasoner to admit such intrusions into his own delicate and finely adjusted temperament was to introduce a distracting factor which might throw a doubt upon all his mental results. Grit in a sensitive instrument, or a crack in one of his own high-power lenses, would not be more disturbing than a strong emotion in a nature such as his. And yet there was but one woman to him, and that woman was the late Irene Adler, of dubious and questionable memory.")

tokens_tag = pos_tag(text)
only_verbs = set([lemmatizer.lemmatize(w[0], 'v') for w in tokens_tag if w[1].startswith('V') and re.search(r'^\w+$', w[0])])
print("Verbs:", only_verbs)

והתוצאה:

After Token: {'adjust', 'predominate', 'have', 'take', 'see', 'observe', 'eclipse', 'save', 'place', 'seldom', 'speak', 'mention', 'balance', 'felt', 'love', 'be', 'admit', 'draw', 'introduce', 'throw'}

סך הכל עבודה לא רעה, חוץ מ seldom שלא ברור איך הסתנן לשם.