استخراج کلمه کلیدی با پایتون

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

استخراج کلمه کلیدی چیست؟

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

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

 پروژه یادگیری ماشین برای استخراج کلمات کلیدی با پایتون

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

( دیتاست مربوط به این پروژه رو میتونین از طریق این لینک دانلود کنید. )

import numpy as np # linear algebra
import pandas as pd # data processing
df = pd.read_csv('papers.csv')

این دیتاست ۷ تا ستون داره:

id, year, title, even_type, pdf_name, abstract, paper_text

تو این پروژه بیشتر توجه و تمرکزمون روی مقادیر مربوط به ستون  paper_text که هم title و هم abstract رو شامل میشه.

بخش بعدی به پیش‌پردازش داده متنی مربوط میشه. برای پیش‌پردازش داده‌ها از کتابخانه NLTK استفاده میکنیم:

import re
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer

stop_words = set(stopwords.words('english'))
##Creating a list of custom stopwords
new_words = ["fig","figure","image","sample","using", 
             "show", "result", "large", 
             "also", "one", "two", "three", 
             "four", "five", "seven","eight","nine"]
stop_words = list(stop_words.union(new_words))

def pre_process(text):
    
    # lowercase
    text=text.lower()
    
    #remove tags
    text=re.sub("</?.*?>"," <> ",text)
    
    # remove special characters and digits
    text=re.sub("(\\d|\\W)+"," ",text)
    
    ##Convert to list from string
    text = text.split()
    
    # remove stopwords
    text = [word for word in text if word not in stop_words]

    # remove words less than three letters
    text = [word for word in text if len(word) >= 3]

    # lemmatize
    lmtzr = WordNetLemmatizer()
    text = [lmtzr.lemmatize(word) for word in text]
    
    return ' '.join(text)
docs = df['paper_text'].apply(lambda x:pre_process(x))

تو این کد، اول میایم یه مجموعه از stop word ها رو تعریف می‌کنیم که بعداً قراره در تابع pre_process ازشون استفاده کنیم. درواقع، stop word ها کلماتی هستند که اهمیتی در بار معنایی متن ندارن و حذف اونها از متن تأثیری در نتیجه کار نداره.

اگر به کامنت های ابتدای هر خط دقت کنین، پیش‌پردازش داده‌ها با این ترتیب انجام میشه:

۱. تبدیل تمام حروف موجود در متن به حروف کوچک با ()lower

۲. حذف تگ ها

۳. حذف کاراکترهای خاص و اعداد

۴. حذف stop word هایی که قبل مشخص شد

۵. حذف کلماتی با طول کمتر از ۳

۶. گروه‌بندی شکل‌های مختلف یک کلمه به‌عنوان یک کلمه واحد با ()WordNetLemmatizer برای تجزیه و تحلیل راحت‌تر همه آنها

استفاده از TF-IDF

TF-IDF مخفف Text Frequency Inverse Document Frequency هست و به این صورت توصیف میشه که اهمیت و ارزش هر کلمه متناسب با تعداد دفعات نمایش اون در متن یا داکیومنت (Text Frequency – TF) بیشتر میشه ولی با فرکانس کلمه موردنظر در کل داکیومنت جبران میشه (Inverse Document Frequency – IDF).

اگر بتونیم به‌درستی از طرح وزن دهی TF-IDF استفاده کنیم، کلمات کلیدی که بالاترین نمره TF-IDF رو دارن، مشخص میشن. برای این کار، اول از متد CountVectorizer مربوط به Scikit-learn استفاده می‌کنیم تا یه لغت‌نامه ایجاد کنیم و در اون، تعداد مربوط به تکرار هر کلمه رو مشخص کنیم:

from sklearn.feature_extraction.text import CountVectorizer
#docs = docs.tolist()
#create a vocabulary of words, 
cv=CountVectorizer(max_df=0.95,         # ignore words that appear in 95% of documents
                   max_features=10000,  # the size of the vocabulary
                   ngram_range=(1,3)    # vocabulary contains single words, bigrams, trigrams
                  )
word_count_vector=cv.fit_transform(docs)

مطابق با پارامترهایی که برای CountVectorizer لحاظ شده:

کلماتی که در ۹۵ درصد از داکیومنت ظاهر شدن، نادیده گرفته میشن.

سایز لغت‌نامه ۱۰۰۰۰ درنظرگرفته شده.

این لغت‌نامه کلمات واحد، bigram ها  و trigram ها رو شامل میشه.

کلمه واحد –> کتاب

bigram –> کتاب خوب

trigram –> بهترین کتاب دنیا

تو این بخش از TfidfTransformer مربوط به Scikit-learn استفاده میکنیم تا فرکانس معکوس داکیومنت ها رو محاسبه کنیم:

from sklearn.feature_extraction.text import TfidfTransformer

tfidf_transformer=TfidfTransformer(smooth_idf=True,use_idf=True)
tfidf_transformer.fit(word_count_vector)

حالا دیگه برای مرحله آخر آماده‌ایم. تو این بخش، یه تابع برای استخراج کلمه کلیدی تعریف میکنیم و تو این تابع از Tf-IDF vectorization استفاده میکنیم:

def sort_coo(coo_matrix):
    tuples = zip(coo_matrix.col, coo_matrix.data)
    return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True)

def extract_topn_from_vector(feature_names, sorted_items, topn=10):
    """get the feature names and tf-idf score of top n items"""
    
    #use only topn items from vector
    sorted_items = sorted_items[:topn]

    score_vals = []
    feature_vals = []

    for idx, score in sorted_items:
        fname = feature_names[idx]
        
        #keep track of feature name and its corresponding score
        score_vals.append(round(score, 3))
        feature_vals.append(feature_names[idx])

    #create a tuples of feature,score
    #results = zip(feature_vals,score_vals)
    results= {}
    for idx in range(len(feature_vals)):
        results[feature_vals[idx]]=score_vals[idx]
    
    return results

# get feature names
feature_names=cv.get_feature_names()

def get_keywords(idx, docs):

    #generate tf-idf for the given document
    tf_idf_vector=tfidf_transformer.transform(cv.transform([docs[idx]]))

    #sort the tf-idf vectors by descending order of scores
    sorted_items=sort_coo(tf_idf_vector.tocoo())

    #extract only the top n; n here is 10
    keywords=extract_topn_from_vector(feature_names,sorted_items,10)
    
    return keywords

def print_results(idx,keywords, df):
    # now print the results
    print("\n=====Title=====")
    print(df['title'][idx])
    print("\n=====Abstract=====")
    print(df['abstract'][idx])
    print("\n===Keywords===")
    for k in keywords:
        print(k,keywords[k])
idx=941
keywords=get_keywords(idx, docs)
print_results(idx,keywords, df)

کلمات کلیدی که بالاترین نمره Tf-IDF رو دارن در خروجی ظاهر میشن. البته توجه داشته باشید که برای این نمره‌ها ۳ رقم اعشار مشخص‌شده و در داخل کد تعداد کلمات کلیدی با نمره بالا یا همون n، ۱۰ مشخص‌شده به خاطر همینه که فقط ۱۰ تا از کلمات کلیدی برتر در خروجی ظاهر شد و در صورت تمایل میتونین این n رو تغییر بدید تا کلمات بیشتری رو مشاهده کنین.

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

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

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

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

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