آیا تا به حال پیدا کرده اید که در یک سند برای کلمه یا عبارت خاصی جستجو کنید تا متوجه شوید که عبارتی که به دنبال آن هستید وجود ندارد؟ می تواند ناامید کننده باشد، درست است؟

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

رویکردهای جستجوی سنتی NLP متکی هستند روی استفاده از فرم های دقیق برای جستجوی کلمات یا عبارات در یک سند خاص. اما این در یافتن کلمات مبتنی بر شکست خورده است روی معنای معنایی یا متنی

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

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

الزامات

برای اطمینان از اینکه می توانید آزمایش را در این آموزش تکرار کنید، باید چند چیز داشته باشید.

ابتدا باید پایتون 3.x (ترجیحاً پایتون 3.10) را نصب کرده باشید. روی کامپیوتر شما همچنین به تعدادی کتابخانه نیاز دارید که می توانید با استفاده از مدیریت بسته Pip نصب کنید.

همچنین باید دانش اولیه NLP مانند پیش پردازش متن و تکنیک های نمایش متن را داشته باشید. در اینجا می توانید اطلاعات بیشتری کسب کنید.

همچنین می‌توانید مخزن را که حاوی تمام کدهای این مقاله است، فورک کنید تا بتوانید آن را دنبال کنید.

برای نصب همه چیز با استفاده از Pip، دستور زیر را تایپ کنید:

// to install with pip
pip install pypdf2 keybert sentence-transformers

تعریف مشکل

فرض کنید شما یک دانشمند داده هستید که بخشی از یک تیم توسعه برنامه درسی هستید و می خواهید بدانید که آیا مفهوم خاصی (کلمه یا عبارت) کنترل تولد، در یک برنامه درسی که در یک سند pdf است تدریس می شود.

یکی از راه هایی که می توانید این کار را انجام دهید این است که pdf را با استفاده از ابزار pdf باز کنید و سپس از روش ctrl + f (find) استفاده کنید تا بررسی کنید که عبارت کنترل تولد در pdf وجود دارد یا خیر.

PDF که در اینجا با آن کار می کنیم

شما همچنین می توانید آن را به صورت برنامه نویسی انجام دهید، همانطور که در زیر نشان داده شده است:

# import library
import PyPDF2

# use PDFreader from PyPDF2 to read pdf content.
pdf_reader = PyPDF2.PdfReader("Relationships_Education_RSE_and_Health_Education.pdf")

# join all the content in the pdf pages together and lowercase the letters
pdf_document = " ".join([page.extract_text().lower() for page in pdf_reader.pages])

# check if the string 'birth control' is in the document [Returns False]
"birth control" in pdf_document

در زیر خروجی کد بالا آمده است:

False

همانطور که در بالا نشان داده شد، می بینید که هم روش جستجوی برنامه ای و هم ابزار pdf می گویند که عبارت “کنترل تولد” در سند pdf وجود ندارد.

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

پس چگونه این موضوع را حل کنیم؟ اینجاست که تطابق معنایی وارد عمل می شود.

تطبیق معنایی چیست؟

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

برای انجام تطبیق معنایی در NLP، موارد خاصی وجود دارد که باید بدانید و انجام دهید. بیایید اکنون آنها را مرور کنیم:

تعبیه کلمه چیست؟

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

پیشنهاد می‌کنیم بخوانید:  روش های مونت کارلو چیست؟ چگونه آینده را با شبیه سازی پایتون پیش بینی کنیم

نمایش برداری با ابعاد پایین به چه معناست؟

در NLP، روش‌های سنتی نمایش متن به‌گونه‌ای که ماشین‌ها می‌توانند آن را بفهمند (یعنی نمایش‌های برداری عددی) عبارتند از کیسه کلمات، فرکانس اصطلاح و فرکانس معکوس سند (TF-IDF)، و رمزگذاری یک‌هت. اما این تکنیک‌ها معمولاً ابعاد بالایی (معمولاً اندازه واژگان) برای نمایش یک کلمه خاص ایجاد می‌کنند و پراکنده هستند (به این معنی که صفرهای زیادی وجود خواهد داشت).

بنابراین، برای مثال، اگر قرار باشد یک کلمه به عنوان یک بردار عددی نمایش داده شود و سند یا پیکره ای که کلمه به آن تعلق دارد دارای 10000 واژگان باشد، اندازه بعد آن کلمه 10000 خواهد بود (که آن را بالا می کند).

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

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

همچنین جاسازی جمله وجود دارد که جملات را در یک نمایش برداری با ابعاد پایین نشان می دهد.

چگونه دو بردار مشابه را اندازه بگیریم؟

اینجاست که شباهت کسینوس مطرح می شود. تشابه کسینوس یک تکنیک ریاضی است که ما از آن برای دانستن شباهت دو بردار به یکدیگر استفاده می کنیم.

در NLP معمولاً مقداری بین 0 تا 1 خروجی می دهد. مقدار نزدیک به 1 به این معنی است که این دو بردار بسیار شبیه هستند.

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

بر اساس روی به غریزه خودمان می دانیم که مرد باید به زن نزدیکتر باشد تا گربه. بنابراین، بیایید از NLP برای کمک به اعتبارسنجی استفاده کنیم.

به لطف پیشرفت‌های NLP، مدل‌های متعددی وجود دارد که می‌توانیم از آنها برای ایجاد جاسازی کلمات استفاده کنیم، که می‌توانید آنها را پیدا کنید. روی مخزن Hagging Face در این مقاله قصد داریم از ⁣ استفاده کنیمall-mpnet-base-v2 مدل ازSentenceTransformer کتابخانه با توجه بهSentenceTransformer، بهترین عملکرد را از نظر جاسازی جمله ارائه می دهد و همچنین می توانید از آن برای ایجاد جاسازی کلمات استفاده کنید.

کد زیر به ما اجازه می دهد تا با استفاده از NLP ادعای خود را تأیید کنیم. بنابراین، ابتدا، ما را مقداردهی اولیه می کنیم SentenceTransformer با all-mpnet-base-v2 و سپس از روش encode برای دریافت تعبیه هر کلمه استفاده کنید. سپس، در نهایت، ما از آن استفاده خواهیم کرد cos_sim کلاس، همچنین از SentenceTransformerبرای تعیین اینکه کدام بردارها مشابه هستند.

# import library
from sentence_transformers import SentenceTransformer # sentence transformer
from sentence_transformers.util import cos_sim # cosine similarity

# initialize sentence transformer with the 'all-mpnet-base-v2' model
model = SentenceTransformer("all-mpnet-base-v2")
# get the embedding vector of the man, woman, and cat words.
man_vector = model.encode("man")
woman_vector = model.encode("woman")
cat_vector = model.encode("cat")

# get the similarity between man and woman
similarity = cos_sim(man_vector, woman_vector)

# get the similarity between man and cat
cat_similarity = cos_sim(man_vector, cat_vector)

print("The Similarity between Man vector and Woman Vector:", similarity, "\n")

print("The Similarity between Man vector and Cat Vector:", cat_similarity)

// نتیجه

The Similarity between Man vector and Woman Vector: tensor([[0.3501]]) 

The Similarity between Man vector and Cat Vector: tensor([[0.2553]])

همانطور که می بینید، امتیاز شباهت زن و مرد (35/0) بیشتر از مرد و گربه (26/0) است. این زیبایی جاسازی کلمه و شباهت کسینوس را با هم نشان می دهد.

حالا بیایید به کار خودمان برگردیم.

روش انجام تطبیق معنایی روی یک سند PDF

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

روش دریافت کلمات از PDF با استفاده از KeyBERT

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

به خاطر داشته باشید که به طور پیش فرض، KeyBERT تک کلمات کلیدی را استخراج می کند – اما می توانیم به آن بگوییم عبارات را با دو یا چند کلمه استخراج کند. ما در اینجا از آن برای استخراج عبارات تک کلمه ای و 2 کلمه ای استفاده می کنیم. در زیر اجرای با استفاده از KeyBERT برای استخراج کلمات کلیدی از سند ما:

from keybert import KeyBERT
# initialize model
keybert_model =  KeyBERT()

# extract all keywords (single word and 2 word phrase) from the pdf
all_keywords = keybert_model.extract_keywords(docs=pdf_document, top_n=-1, keyphrase_ngram_range=(1, 2))
# print length of keywords extracted                                             
print(len(all_keywords))
# show the first 5 keywords
print(all_keywords[:5])

کد بالا وارد می شود KeyBERT از keybert کتابخانه سپس مقدار دهی اولیه می شود KeyBERTو تمام کلمات کلیدی (یعنی عبارات تک کلمه ای و 2 کلمه ای) را از سند استخراج می کند. سپس خط بعدی تعداد کلمات کلیدی استخراج شده را چاپ می کند. در نهایت، کد پنج کلمه کلیدی اول را از بین تمام کلمات کلیدی استخراج شده از PDF چاپ می کند.

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

در زیر خروجی کد بالا آمده است:

8669
[('education guidance', 0.5954),
 ('schools guidance', 0.5542),
 ('education policies', 0.5405),
 ('sex education', 0.5228),
 ('education safeguarding', 0.5001)]

همانطور که در بالا می بینید، KeyBERT 8669 کلمه کلیدی را از PDF استخراج کرده است. همچنین، KeyBERT مدل معمولاً کلمات کلیدی استخراج شده را به همراه یک امتیاز از هر کلمه برمی گرداند. ما به امتیاز نیازی نداریم، بنابراین هر کلمه کلیدی را فقط از تاپلی که در آن قرار دارد استخراج می کنیم.

# remove score from each keyword

all_keywords = [keyword[0] for keyword in all_keywords]
all_keywords[:5]

در زیر خروجی کد بالا آمده است:

['education guidance',
 'schools guidance',
 'education policies',
 'sex education',
 'education safeguarding']

جاسازی عبارت کنترل تولد و کلمات کلیدی استخراج شده از PDF

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

کد زیر به ما این امکان را می دهد:

# initialize sentence transformer with the 'all-mpnet-base-v2' model
model = SentenceTransformer("all-mpnet-base-v2")

# get the embedding of the 'birth control' phrase
birth_control_embedding = model.encode("birth control")

# get the embedding of all the keywords in the document
keywords_embedding =  model.encode(all_keywords)

شباهت کسینوس عبارت کنترل تولد و کلمات کلیدی در PDF

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

کد زیر به ما امکان می دهد شباهت کسینوس عبارت و بردار جاسازی کلمات کلیدی را بدست آوریم.

# calculate the cosine similarity of the birth control word and each word in the document
cosine_similarity_result = cos_sim(birth_control_embedding, keywords_embedding)
# print the shape (equal to the number of keywords)
print(cosine_similarity_result.shape)
# show the top 5 similarities
print(cosine_similarity_result[:5])

در زیر خروجی کد بالا آمده است:

torch.Size([1, 2034])
tensor([[0.2166, 0.1977, 0.0998,  ..., 0.1634, 0.1082, 0.2194]])

اکنون که امتیاز شباهت عبارت و کلیدواژه ها را داریم، اندازه کل تانسور به دست آمده به تعداد کلمات کلیدی خواهد بود، همانطور که در بالا نشان داده شده است. سپس می توانیم از argmax() روشی برای بدست آوردن شاخص عنصر تانسور با بالاترین امتیاز. این شاخص به ما کمک می کند کلمه کلیدی خاص را فیلتر کنیم all_keywords متغیر لیست کد زیر به این نتیجه می رسد:

# return the index number of the high similarity score
index = cosine_similarity_result.argmax()
print(index)

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

tensor(1490)

حال، بیایید به کلمه کلیدی در شاخص 1490 نگاه کنیم all_keywords متغیر

# print the keyword at index 1490 
print(all_keywords[index])

در زیر خروجی کد بالا آمده است:

contraceptive

پس از بررسی آن متوجه شدیم که «پیشگیری» کلمه ای با بیشترین شباهت است، که منطقی است زیرا «کنترل بارداری» و «جلوگیری از بارداری» به یک معنا هستند. این نشان دهنده ظرافت تطبیق معنایی در یافتن کلمات مشابه است.

بیایید همچنین 5 کلمه کلیدی برتر را در PDF که با عبارت “کنترل تولد” مطابقت دارد بررسی کنیم.

بیایید 5 کلیدواژه برتر با بیشترین امتیاز شباهت به “کنترل تولد” را بررسی کنیم تا ببینیم نتیجه چگونه خواهد بود.

برای این کار می توانیم از topk() روشی برای بدست آوردن 5 شاخص برتر سپس می توانیم از طریق این شاخص ها حلقه بزنیم تا کلمات کلیدی واقعی را بدست آوریم:

# extract the top 5 indices
top_5_indices = cosine_similarity_result.topk(5)[1].tolist()[0]

print(top_5_indices)

در زیر نتیجه کد بالا آمده است:

[1490, 1972, 871, 1199, 1944]
# get top 5 keywords
top_5_keywords = [all_keywords[index] for index in top_5_indices]
print(top_5_keywords)

در زیر خروجی کد بالا آمده است:

['contraceptive', 'contraception', 'contraceptive choices', 'range contraceptive', 'cover contraception']

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

بسته بندی

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

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

مراجع

  1. https://sbert.net/

  2. https://maartengr.github.io/KeyBERT/guides/quickstart.html

  3. https://huggingface.co/spaces/mteb/leaderboard