خلاصه‌سازی متن با یادگیری ماشین

منظور از خلاصه‌سازی کاهش سایز متن اصلی هست البته طوری که اطلاعات مهم و معنی و مفهوم محتوای اون متن به‌طور کامل حفظ بشه. با توجه به اینکه خلاصه‌سازی دستی متون کار خیلی زمان بر و پرزحمتیه، انجام خودکار خلاصه‌سازی به یکی از تسک های محبوب تبدیل شده و تبدیل به یه انگیزه قوی برای تحقیقات دانشگاهی شده. تو این مقاله، با نحوه خلاصه‌سازی متن با پردازش زبان طبیعی (NLP) آشنا میشید.

در یادگیری ماشین، اپلیکیشن های مهمی برای خلاصه‌سازی متن در تسک های NLP مختلف وجود داره که از مهم‌ترین اونها میتونیم به طبقه‌بندی متن، پاسخ به سؤالات، ترکیب متن، ترکیب اخبار و ایجاد عنوان یا هدلاین اشاره کرد که همه اینها با یادگیری ماشین قابل انجام هستند. هدف از خلاصه‌سازی متن، ایجاد یک خلاصه دقیق و روان هست که فقط اطلاعات و نکات مهم و کلیدی متن اصلی رو شامل بشه.

انواع راهکارها برای خلاصه‌سازی متن

قبل از اینکه وارد مرحله پیاده‌سازی پروژه خلاصه­سازی من با استفاده از یادگیری ماشین بشیم، بهتره که با انواع روش‌های خلاصه‌سازی، نحوه عملکرد هر کدوم آشنا بشیم تا تصمیم بگیریم که متناسب با نیاز و کاربرد خودمون کدوم نوع از خلاصه‌سازی رو انتخاب کنیم.

به‌طورکلی، خلاصه‌سازی متن به دو نوع اصلی تقسیم میشه:

  • خلاصه‌سازی Extractive یا استخراجی
  • خلاصه‌سازی Abstractive یا چکیده‌ای

خب در ادامه ویژگی‌ها و نحوه عملکرد هر کدوم رو موردبررسی قرار میدیم:

خلاصه‌سازی استخراجی

سبک کار این روش به این صورته که جملات رو با توجه به نتایج تابع نمره دهی به‌طور مستقیم از سند اصلی میگیره و بدون اینکه در ساختار و مفهوم جمله تغییری ایجاد کنه در خروجی قرار میده. این روش با شناسایی بخش‌های مهم متن و مونتاژ قسمت‌هایی از محتوا، متن خلاصه شده خروجی رو آماده میکنه.

خلاصه‌سازی چکیده‌ای

هدف روش خلاصه‌سازی چکیده‌ای تفسیر کل متنه که این کار رو با استفاده از تکنیک‌های پیشرفته زبان طبیعی انجام میده. متن خروجی این روش یه متن کوتاه‌تر با جمله‌های جدیده که ممکنه این جمله‌ها اصلاً داخل متن اصلی قرار نداشته باشن. درواقع متن خروجی روش چکیده‌ای شبیه خلاصه‌سازی هایی هست که توسط انسان انجام میشه.

تو این مقاله، برای خلاصه‌سازی متن با یادگیری ماشین از روش استخراجی استفاده میکنیم و پیاده‌سازی پروژه هم با استفاده از زبان برنامه‌نویسی پایتون انجام میشه. الگوریتم TextRank که در این پروژه استفاده شده، یه الگوریتم یادگیری ماشین استخراجی و بدون نظارت برای خلاصه‌سازی متنه.

خلاصه‌سازی متن با یادگیری ماشین

مطمئناً با توضیحاتی که دادیم تا حالا متوجه شدید که خلاصه‌سازی متن چی هست و چطوری کار میکنه. حالا بهتره بدون این‌که وقت رو تلف کنیم، وارد مرحله پیاده‌سازی بشیم. برای دانلود دیتاست مورداستفاده در این پروژه می تونید روی این لینک کلیک کنید. الآن نوبت اینه که پکیج‌های لازم برای شروع کار رو ایمپورت کنیم:

import pandas as pd
import numpy as np
import nltk
nltk.download('punkt')
import re
from nltk.corpus import stopwords

حالا که پکیج‌ها رو ایمپورت کردیم، قدم بعدی اینه که یه نگاهی به داده‌ها بندازیم تا ایده لازم برای ادامه کار دستمون بیاد:

from google.colab import files
uploaded = files.upload()
df = pd.read_csv("tennis.csv")
df.head()

df['article_text'][1]

تو این مرحله، توالی جملات مربوط به مقاله‌ها رو به داده تبدیل میکنیم و این کار رو با استفاده از یک لیست و عمل توکنایز کردن انجام میدیم:

from nltk.tokenize import sent_tokenize
sentences = []
for s in df['article_text']:
    sentences.append(sent_tokenize(s))

sentences = [y for x in sentences for y in x]

با استفاده از sent_tokenize جملات مربوط به متن مقاله‌ها رو داخل یک لیست با عنوان sentences ذخیره میکنیم.

حالا میخوایم از متد Glove برای بازنمایی کلمه استفاده کنیم. این یه الگوریتم یادگیری بدون نظارته که توسط دانشگاه استنفورد توسعه داده شد. الگوریتم Glove با تجمیع ماتریس سراسری یا global وقوع کلمه به کلمه از یک نوشته، یکپارچگی‌های کلمات رو به دست میاره. برای پیاده‌سازی این روش، باید یه فایل رو از اینجا دانلود کنید و در همان دایرکتوری که فایل پایتون این پروژه قرار داره، ذخیره کنید:

word_embeddings = {}
f = open('glove.6B.100d.txt', encoding='utf-8')
for line in f:
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    word_embeddings[word] = coefs
f.close()

clean_sentences = pd.Series(sentences).str.replace("[^a-zA-Z]", " ")
clean_sentences = [s.lower() for s in clean_sentences]
stop_words = stopwords.words('english')
def remove_stopwords(sen):
    sen_new = " ".join([i for i in sen if i not in stop_words])
    return sen_new
clean_sentences = [remove_stopwords(r.split()) for r in clean_sentences]

دیکشنری word_embeddings برای نگهداری کلمه و بردارش تعریف شده بعدازاینکه این دیکشنری رو متناسب با مقادیر فایل دانلود شده، مقداردهی کردیم. نوبت به ایجاد یه سری تغییرات در جمله‌ها میرسه، مثل تبدیل همه حروف به حروف کوچیک و حذف stop word ها از جمله‌ها.

بعد از این کارها نوبت میرسه به ایجاد بردار برای جمله‌ها:

sentence_vectors = []
for i in clean_sentences:
  if len(i) != 0:
    v = sum([word_embeddings.get(w, np.zeros((100,))) for w in i.split()])/(len(i.split())+0.001)
  else:
    v = np.zeros((100,))
  sentence_vectors.append(v)

برای به دست آوردن بردار هر جمله، اول بردارهای کلمات رو از دیکشنری word_embeddings میگیریم و بعد با جمع بردارهای همه کلمات داخل جمله و تقسیم اونها بر طول جمله، میانگین بردارهای کلمات یه جمله رو به دست میاریم تا به نمره بردار جمله برسیم.

در این کد دو نکته جانبی برای موارد استفاده از ()np.zeros وجود داره:

  • اگر بردار کلمه موجود در جمله در داخل دیکشنری وجود نداشته باشه، بردار مربوط به اون با صفر مقداردهی میشه.
  • اگر طول جمله برابر با صفر باشه، بردار مربوط به اون با ۰ مقداردهی میشه.

پیدا کردن شباهت‌ها برای خلاصه‌سازی متن

مرحله بعدی، پیدا کردن شباهت‌های بین جملاته. برای این کار از معیار شباهت کسینوس استفاده میکنیم. حالا بیایید برای این کار یه ماتریس شباهت خالی ایجاد کنیم و اونو با شباهت‌های کسینوس جملات پر کنیم:

sim_mat = np.zeros([len(sentences), len(sentences)])
from sklearn.metrics.pairwise import cosine_similarity
for i in range(len(sentences)):
  for j in range(len(sentences)):
    if i != j:
      sim_mat[i][j] = cosine_similarity(sentence_vectors[i].reshape(1,100), sentence_vectors[j].reshape(1,100))[0,0]

با تعریف یه حلقه تو در تو همه جملات رو با هم مقایسه میکنیم و اگه i نامساوی با j باشه، با استفاده از cosine_similarity میزان شباهت اونها رو محاسبه میکنیم.

حالا نوبت اینه که ماتریس شباهت sim_mat رو به گراف تبدیل کنیم. نودهای این گراف، جمله‌ها و یال‌های گراف هم نمره شباهت بین جمله‌ها رو نشون میده:

import networkx as nx

nx_graph = nx.from_numpy_array(sim_mat)
scores = nx.pagerank(nx_graph)

دیگه نوبت میرسه به خلاصه‌سازی متن:

ranked_sentences = sorted(((scores[i],s) for i,s in enumerate(sentences)), reverse=True)
for i in range(5):
  print("ARTICLE:")
  print(df['article_text'][i])
  print('\n')
  print("SUMMARY:")
  print(ranked_sentences[i][1])
  print('\n')

خروجی:

ARTICLE:
Maria Sharapova has basically no friends as tennis players on the WTA Tour. The Russian player has no problems in openly speaking about it and in a recent interview she said: ‘I don’t really hide any feelings too much. I think everyone knows this is my job here. When I’m on the courts or when I’m on the court playing, I’m a competitor and I want to beat every single person whether they’re in the locker room or across the net.So I’m not the one to strike up a conversation about the weather and know that in the next few minutes I have to go and try to win a tennis match. I’m a pretty competitive girl. I say my hellos, but I’m not sending any players flowers as well. Uhm, I’m not really friendly or close to many players. I have not a lot of friends away from the courts.’ When she said she is not really close to a lot of players, is that something strategic that she is doing? Is it different on the men’s tour than the women’s tour? ‘No, not at all. I think just because you’re in the same sport doesn’t mean that you have to be friends with everyone just because you’re categorized, you’re a tennis player, so you’re going to get along with tennis players. I think every person has different interests. I have friends that have completely different jobs and interests, and I’ve met them in very different parts of my life. I think everyone just thinks because we’re tennis players we should be the greatest of friends. But ultimately tennis is just a very small part of what we do. There are so many other things that we’re interested in, that we do.’

SUMMARY:
When I’m on the courts or when I’m on the court playing, I’m a competitor and I want to beat every single person whether they’re in the locker room or across the net.So I’m not the one to strike up a conversation about the weather and know that in the next few minutes I have to go and try to win a tennis match.

پس با اجرای این مراحل تونستیم با استفاده از یادگیری ماشین یه سیستم خلاصه‌سازی متن ایجاد کنیم. یه سیستم خلاصه‌سازی تلاش و زحمت لازم برای دسترسی به اطلاعات مهم و مرتبط با هر موضوع رو کاهش میده.

امیدواریم که از این مقاله لذت برده باشید و یادگیری نحوه پیاده‌سازی یه پروژه خلاصه‌سازی استخراجی براتون مفید واقع بشه.

برای هرگونه سوال در زمینه آموزش ها فقط کافیه روی لینک واتساپ یا تلگرام (در زیر همین پست) کلیک کنید. یا با شماره تماس بالای صفحه سایت تماس بگیرید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...