תקציר מאמר וויקיפדיה באמצעות פייתון

מחבר:
בתאריך:

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

תקציר מאמר וויקיפדיה באמצעות פייתון

אתם מוזמנים להוריד את גרסת ה-jupyter notebook של המדריך.

 

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 כוכבים

 

 

הוסף תגובה חדשה

 

= 7 + 7