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

به نام خدا

سلام

امیدوارم حالتون خوب باشه

به این آموزش خیلی خوش اومدید.

توی این پست یه پروژه ای رو با هم مینویسیم که تقریبا نیاز همه است.

خلاصه سازی متن با استفاده از پردازش زبان طبیعی.



هدف پروژه ؟

هدف ما از این پروژه اینه که یه متن بزرگ(مثلا ۴۰ خطی) رو بهش بدیم و اون برامون متن رو خلاصه کنه.

این برنامه خروجیش کاملا باید معنی دار باشه و کلمه ها رو الکی کنار هم قرار نده.

البته این برنامه برای متن های فارسی خیلی درست کار نمیکنه ، چون توکنایزری که ما ازش استفاده میکنیم برای زبان انگلیسی هستش. اما تا یه جایی میتونه متن های فارسی رو هم خلاصه کنه.



نصب کتابخانه و ماژول های مورد نیاز:

برای اینکه کد ها رو بنویسید نیاز به کتابخانه ی spacy و ماژول خودش رو نیاز دارید

برای این کار باید این کار رو انجام بدید:

اگر مثل من از آناکوندا و ژوپیتر نوت بوک استفاده میکنید این دستور رو داخل آنکوندا پرامپت به ترتیب وارد کنید:

conda install -c conda-forge spacy

و

python -m spacy download en_core_web_sm

و اگر از IDE هایی مثل vscode و خود IDE پایتون استفاده میکنید این دستورات رو به ترتیب داخل CMD وارد کنید:

pip install -U pip setuptools wheel

pip install -U spacy

python -m spacy download en_core_web_sm



بخش کد نویسی:

توی این بخش تکه به تکه کد رو پیش میبریم و در‌ آخر کل کد ها رو به صورت یکجا براتون قرار میدم

ایمپورت کردن ماژول های مورد نیاز:

import spacy
from spacy.lang.en.stop_words import STOP_WORDS
from string import punctuation
from heapq import nlargest

ورودی گرفتن:

text = input(&quotpleas enter your text :  &quot)


جدا کردن متن ورودی و خلاصه شده(البته شما لازم نیست انجام بدید، من همینجوری اضافش کردم):

print(&quot-------------------------------------------------------------------------------------------------&quot)


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

stopwords = list(STOP_WORDS)
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)
tokens = [token.text for token in doc]

حذف کلمات اضافی از متن:

word_frequencies = {}
for word in doc:
    if word.text.lower() not in stopwords:
        if word.text.lower() not in punctuation:
            if word.text not in word_frequencies.keys():   
                 word_frequencies[word.text] = 1
            else:
                word_frequencies[word.text] +=1
max_frequcncy = max(word_frequencies.values())


طبیعی کردن متن(نرمال کردن متن):

for word in word_frequencies.keys():
      word_frequencies[word] = word_frequencies[word]/max_frequcncy
sentence_tokens = [sent for sent in doc.sents]
sentence_scores = {}
                                            
for sent in sentence_tokens:
    for word in sent:
        if word.text.lower() in word_frequencies.keys():        
            if sent not in sentence_scores.keys():             
                sentence_scores[sent] = word_frequencies[word.text.lower()]
            else:
                   sentence_scores[sent] += word_frequencies[word.text.lower()]


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

select_length = int(len(sentence_tokens)*0.1)
summary = nlargest(select_length,sentence_scores , key = sentence_scores.get)
final_summary = [word.text for word in summary]
final_summary



کل کد ها به صورت یکجا:

import spacy
from spacy.lang.en.stop_words import STOP_WORDS
from string import punctuation
from heapq import nlargest

text = input(&quotpleas enter your text :  &quot)
print(&quot-------------------------------------------------------------------------------------------------&quot)

stopwords = list(STOP_WORDS)
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)
tokens = [token.text for token in doc]

word_frequencies = {}

for word in doc:
    if word.text.lower() not in stopwords:
        if word.text.lower() not in punctuation:
            if word.text not in word_frequencies.keys():   
                 word_frequencies[word.text] = 1
            else:
                   word_frequencies[word.text] +=1
max_frequcncy = max(word_frequencies.values())

for word in word_frequencies.keys():
      word_frequencies[word] = word_frequencies[word]/max_frequcncy

sentence_tokens = [sent for sent in doc.sents]

sentence_scores = {}                                            
for sent in sentence_tokens:
    for word in sent:
        if word.text.lower() in word_frequencies.keys():        
            if sent not in sentence_scores.keys():             
                sentence_scores[sent] = word_frequencies[word.text.lower()]
            else:
                sentence_scores[sent] += word_frequencies[word.text.lower()]

select_length = int(len(sentence_tokens)*0.1)
summary = nlargest(select_length,sentence_scores , key = sentence_scores.get)
final_summary = [word.text for word in summary]
final_summary



نتیجه گیری:

توی این مطلب یاد گرفتیم که یه متن رو چگونه با استفاده از پایتون خلاصه کنیم

این کار با الگوریتم TextRank انجام میشه که سعی میکنم الگوریتمش رو داخل این وبلاگم قرار بدم.




امیدوارم از این مطلب خوشتون اومده باشه.

تا آموزش بعدی خدانگهدار