תקציר מאמר וויקיפדיה באמצעות פייתון
אחת הדרכים הטובות ביותר ללמוד תחום היא להכיר את המונחים הנפוצים ביותר בתחום. נשתמש בעיקרון זה כדי ללמוד מאמר בוויקיפדיה. הסקריפט הבא ימצא את כל המאמרים בוויקיפדיה בנושא מסוים, ישלוף את המאמר הראשון מתוך המאמרים, יגרד את דף ההטמ"ל של המאמר הראשון, ינקה את התוכן, ויספק טבלה של 15 המונחים הנפוצים ביותר במאמר. בסוף ננסה להעריך כמה אנחנו יכולים להבין מתוכנו של מאמר על סמך המילים הנפוצות בו.
אתם מוזמנים להוריד את גרסת ה-jupyter notebook של המדריך.
הטכנולוגיה המוסברת במדריך תקפה וכדאי ללמוד אותה אם יש לך עניין ספציפי ב-NLP - עיבוד שפה טבעית. לכל צורך מעשי אני ממליץ בחום על המדריך סיכום מאמר ויקיפדיה באמצעות המודל המתקדם בעולם T5 של גוגל.
1. ייבוא הספריות
נייבא את הספריות שישמשו אותנו במדריך.
# Import dependencies
from bs4 import BeautifulSoup
import requests
import nltk
- BeautifulSoup תשמש אותנו כדי לגרד דפים מרשת האינטרנט.
- Requests היא ספרייה המשמשת אותנו לשלוח קריאות ברשת האינטרנט (GET, POST).
- NLTK משמשת לעיבוד שפה אנושית.
2. שליפת כל המאמרים בתחום שמעניין אותנו
וויקיפדיה מספקת api נפלא וחופשי לשימוש שממנו ניתן לשלוף ב-json מידע על מאמרים בתחום שמעניין אותנו. את הקריאות נוציא לקישור הבא:
# Wikipedia links
wikipedia_api_link = "https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch="
המונח שאותו נחפש הוא "רפסודיה בוהמית".
# Create the search URL by adding the search term
search_term = "Bohemian_Rhapsody"
url = wikipedia_api_link + search_term
# Get the url from the first article that the json that the Wikipedia search provides
r = requests.get(url)
json_output = r.json()
3. שליפת המאמר הראשון מרשימת כל המאמרים
נוציא קריאה ל-api, ונשלוף מתוך ה-json שיוחזר את כותרת המאמר הראשון. נשתמש בכותרת המאמר הראשון כדי לשלוף את הקישור למאמר.
article_title = json_output['query']['search'][0]['title']
article_title = article_title.replace(' ', '_')
wikipedia_link_article = "https://en.wikipedia.org/wiki/" + article_title
wikipedia_link_article # 'https://en.wikipedia.org/wiki/Bohemian_Rhapsody'
4. גירוד ה-HTML של המאמר
נגרד את התוכן של המאמר שנמצא בתוך div שהמזהה שלו הוא "content".
# Scrape the HTML content from the page
def request_webpage(url):
res = requests.get(url)
try:
res.raise_for_status()
except Exception as exc:
print('There is a problem with the request')
return res
page = request_webpage(wikipedia_link_article)
bs_page = BeautifulSoup(page.text)
content = bs_page.find("div", {"id": "content"})
5. המרת מפורמט HTML לפורמט טקסט
נסיר את תגיות ה-HTML מכיוון שמעניין אותנו תוכן המאמר.
# HTML to text
text = content.get_text()
6. המרת הטקסט לרשימת מילים
נהפוך את התוכן לרשימה של מילים, ובאותה הזדמנות ננקה מילים שכתובות בשפות לא סטנדרטיות ונמיר את האותיות הגדולות לאותיות קטנות בלבד.
# Use NLTK to tokenize the content
# Use the terminal to install NLTK
!pip install -U nltk
!python -m nltk.downloader all
# Split into words tokens
from nltk.tokenize import word_tokenize
tokens = word_tokenize(text)
# Remove all the tokens that are not alphabetic
words = [word for word in tokens if word.isalpha()]
# Convert to lowercase
words = [x.lower() for x in words]
print(words[:20])
['bohemian', 'rhapsody', 'from', 'wikipedia', 'the', 'free', 'encyclopedia', 'jump', 'to', 'navigation', 'jump', 'to', 'search', 'this', 'article', 'is', 'about', 'the', 'song', 'for']
7. ניקוי רשימת המילים
בתוך הרשימה של המילים שהשגנו בצעד הקודם אפשר לראות מילים רבות שמשמעותם מוגבלת למרות שהם מרבות להופיע במשפטים אנושיים, דוגמת, to ו-for. מילים אילו מכונות stop words, ונסיר אותם באמצעות השוואה לרשימת stopwords שמספק NLTK.
# Stop words
# A majority of the words in a given text are stop words, like "the" and "that"
# that don't convey much meaning.
# NLTK has lists of 'stopwrods' that we can use to eliminate the stop words
# from our list of words.
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = stopwords.words('english')
words = [w for w in words if not w in stop_words]
print(words[:20])
['bohemian', 'rhapsody', 'wikipedia', 'free', 'encyclopedia', 'jump', 'navigation', 'jump', 'search', 'article', 'song', 'film', 'see', 'bohemian', 'rhapsody', 'film', 'uses', 'see', 'bohemian', 'rhapsody']
8. מיצוי רשימת השורשים
דרך מקובלת להבין את המשמעות של הטקסט היא למצות ממילים את השורש שלהם. נפעיל את הקוד הבא שממצה מרשימת המילים את רשימת השורשים.
# Word stemming
# Stemming is a process where words are reduced to roots.
# It can be helpful if we want the intent without the extra baggage.
from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
roots = [porter.stem(word) for word in words]
print(roots[:20])
['bohemian', 'rhapsodi', 'wikipedia', 'free', 'encyclopedia', 'jump', 'navig', 'jump', 'search', 'articl', 'song', 'film', 'see', 'bohemian', 'rhapsodi', 'film', 'use', 'see', 'bohemian', 'rhapsodi']
9. רשימת שכיחות של השורשים במאמר
הקוד הבא מוצא את השכיחות של השורשים.
# List of root frequencies
root_freqs = {}
for i in range(len(roots)):
root = roots[i]
root_freqs[root] = root_freqs.get(root, 0) + 1
10. סידור הרשימה
נסדר את הרשימה בסדר שכיחות יורד:
# Sort list of root frequencies by descending order
import operator
sorted_by_value = sorted(root_freqs.items(), key=operator.itemgetter(1), reverse=True)
נוציא מהרשימה את 15 השורשים השכיחים ביותר ונוסיף לכל אחד מהם את שכיחותו היחסית.
# Get the first 15 most common roots
# and add the relative frequency to each root
highest_sorted = []
for i in range(15):
if sorted_by_value[i] in sorted_by_value:
relative_freq = sorted_by_value[i][1] / len(roots) * 100
highest_sorted.append((sorted_by_value[i][0], sorted_by_value[i][1], relative_freq))
11. הדפסת הטבלה עם 15 השורשים הנפוצים ביותר
נדפיס את הטבלה של 15 השורשים הנפוצים ביותר במאמר:
+----------+------+--------------------+ | Term | Freq | Relative freq | +----------+------+--------------------+ | song | 139 | 1.7919298697950239 | | queen | 131 | 1.688797215418332 | | rhapsodi | 123 | 1.5856645610416398 | | singl | 122 | 1.5727729792445533 | | bohemian | 108 | 1.3922908340853424 | | rock | 95 | 1.2247002707232177 | | retriev | 82 | 1.057109707361093 | | top | 80 | 1.0313265437669201 | | chart | 73 | 0.9410854711873147 | | music | 68 | 0.8766275622018822 | | mercuri | 59 | 0.7606033260281037 | | one | 54 | 0.6961454170426712 | | record | 53 | 0.6832538352455847 | | band | 52 | 0.6703622534484982 | | play | 50 | 0.6445790898543251 | +----------+------+--------------------+
אז מה למדנו? שרפסודיה בוהמית הוא שיר של להקת queen שהוא יצא כסינגל ששייך לסוג רוק ואף הגיע לראש המצעד (top chart).
סיכום
במאמר זה הדגמנו כיצד ניתן לגרד דף תוכן מרשת האינטרנט ולמצות מתוכו את העיקר באמצעות שימוש בספריות נפוצות של גירוד דפים ועיבוד שפה.
ניתן להשתמש בטכניקה זו ואף לשכללה כדי למצות מידע ממספר מאמרים קשורים. יהיה מעניין לראות האם ניתן למצוא את דעתו של אדם או אף את מצבו הנפשי על פי המילים שבהם הוא משתמש כשהוא כותב.
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.