1. مقدمة
تاريخ آخر تعديل: 08-04-2024
تضمين النص
يشير إدراج النصوص إلى عملية تحويل البيانات النصية إلى تمثيلات رقمية. وتُعبّر هذه التمثيلات الرقمية، التي غالبًا ما تكون متجهات، عن المعنى الدلالي والعلاقات بين الكلمات في النص. تخيل الأمر على النحو التالي:
النص يشبه لغة معقّدة مليئة بالتفاصيل الدقيقة والغموض.
تُحوّل ميزة "تضمين النصوص" هذه اللغة إلى تنسيق رياضي أبسط يمكن للأجهزة فهمه ومعالجته.
مزايا تضمين النصوص
- إتاحة المعالجة الفعّالة: يمكن للأجهزة معالجة الأرقام بشكل أسرع بكثير مقارنةً بالنصّ الأوّلي. وهذا أمر مهم للمهام، مثل محرّكات البحث وأنظمة الاقتراحات والترجمة الآلية.
- تسجيل المعنى الدلالي: تتجاوز عمليات التضمين المعنى الحرفي للكلمات. وتلتقط هذه النماذج السياق والعلاقات بين الكلمات، ما يتيح إجراء تحليل أكثر دقة.
- تحسين أداء تعلُّم الآلة: يمكن استخدام عمليات إدراج النصوص كسمات في نماذج تعلُّم الآلة، ما يؤدي إلى تحقيق أداء أفضل في مهام مثل تحليل المشاعر وتصنيف النصوص ووضع النماذج للمواضيع.
حالات استخدام ميزة "إدراج النص"
من خلال تحويل النص إلى تمثيلات رقمية، توفّر عمليات تضمين النصوص مجموعة متنوعة من التطبيقات في معالجة اللغات الطبيعية (NLP). في ما يلي بعض حالات الاستخدام الرئيسية:
1. محرّكات البحث واسترداد المعلومات:
تسمح عمليات تضمين النصوص لمحرّكات البحث بفهم المعنى الدلالي لعبارات البحث ومطابقتها مع المستندات ذات الصلة، حتى إذا لم تكن الكلمات الرئيسية نفسها متوفّرة.
من خلال مقارنة عمليات إدراج طلب البحث بعمليات إدراج المستندات، يمكن لمحرّكات البحث تحديد المستندات التي تتناول مواضيع أو مفاهيم مشابهة.
2- أنظمة الاقتراح:
تستخدِم أنظمة الاقتراحات عمليات إدراج النصوص لتحليل سلوك المستخدِمين وإعداداتهم المفضّلة التي يتم التعبير عنها من خلال المراجعات أو التقييمات أو سجلّ التصفّح.
ويمكن للنظام بعد ذلك اقتراح عناصر مشابهة من خلال مقارنة عمليات تضمين المنتجات أو المقالات أو المحتوى الآخر الذي تفاعل معه المستخدم.
3. رصد السرقة الأدبية:
يمكن أن تساعد مقارنة عمليات إدراج قطعتَي نص في تحديد حالات السرقة الأدبية المحتملة من خلال العثور على تشابهات كبيرة في البنية الدلالية لكلتا القطعتين.
هذه ليست سوى أمثلة قليلة، وتتزايد الخيارات مع تطور تقنيات تضمين النصوص. ومع تقدّم أجهزة الكمبيوتر في فهم اللغة بشكل أفضل من خلال عمليات التضمين، يمكننا توقّع ظهور تطبيقات أكثر ابتكارًا في المستقبل.
textembedding-gecko@003
Textembedding-gecko@003 هو إصدار محدّد من نموذج إدراج نص مدرَّب مسبقًا تقدّمه Google Cloud Platform (GCP) من خلال Vertex AI وحزمة أدوات وخدمات الذكاء الاصطناعي.
التطبيق الذي ستصممه
في هذا الدرس التطبيقي حول الترميز، ستُنشئ نصًا برمجيًا بلغة Python. سيؤدي هذا النص البرمجي إلى:
- استخدِم Vertex API للاتّصال بخدمة textembedding-gecko@003 وتحويل النص إلى عناصر نصية (متجهات).
- إنشاء قاعدة بيانات محاكاة تتألف من النصوص وناقلات البيانات
- يمكنك إجراء طلب بحث في قاعدة بيانات المتجهات المحاكية من خلال مقارنة المتجهات والحصول على الردّ الأكثر احتمالًا.
ما ستتعرّف عليه
- كيفية استخدام ميزة "تضمين النصوص" في Google Cloud Platform
- كيفية الاتصال بـ textembedding-gecko@003
- كيفية تنفيذ ذلك في Workbench
- كيفية استخدام Vertex AI - Workbench لتنفيذ النصوص البرمجية
المتطلبات
- إصدار حديث من Chrome
- معرفة لغة بايثون
- مشروع على Google Cloud
- الوصول إلى Vertex AI - Workbench
2. الإعداد
إنشاء مثيل Vertex AI Workbench
- في وحدة تحكّم Google Cloud، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- الانتقال إلى أداة اختيار المشاريع
- تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud.
- فعِّل واجهة برمجة التطبيقات Notebooks API.
يمكنك إنشاء مثيل Vertex AI Workbench باستخدام Google Cloud Console أو gcloud CLI أو Terraform. وسننشئ هذا الحساب في هذه المقالة التعليمية باستخدام "وحدة تحكّم Google Cloud". يمكنك الاطّلاع على مزيد من المعلومات حول الطرق الأخرى هنا.
- في Google Cloud Console، انتقِل إلى صفحة "النُسخ" التي يمكن الوصول إليها في قائمة Vertex AI، في قسم "دفاتر البيانات"، وانقر على Workbench.
- انتقِل إلى "المثيلات".
- انقر على "إنشاء جديد".
- في مربّع الحوار "إنشاء مثيل"، في قسم "التفاصيل"، قدِّم المعلومات التالية لمثيلك الجديد:
الاسم: أدخِل اسمًا للنسخة الجديدة. يجب أن يبدأ الاسم بحرف متبوعًا بما يصل إلى 62 حرفًا صغيرًا أو رقمًا أو واصلة (-)، ولا يمكن أن ينتهي بواصلة.
المنطقة والمنطقة: اختَر منطقة ومنطقة للنسخة الجديدة. للحصول على أفضل أداء للشبكة، اختَر المنطقة الأقرب إليك جغرافيًا.
لا حاجة إلى تثبيت وحدة معالجة الرسومات
في قسم "الربط الشبكي"، قدِّم ما يلي:
الشبكات: عدِّل خيارات الشبكة لاستخدام شبكة في مشروعك الحالي أو شبكة VPC مشتركة من مشروع مضيف، في حال تم ضبط أحدهما. إذا كنت تستخدم شبكة VPC مشتركة في المشروع المضيف، يجب أيضًا منح دور "مستخدم شبكة Compute" (roles/compute.networkUser) إلى "وكيل خدمة أجهزة الكمبيوتر الدفترية" من مشروع الخدمة.
في حقل "الشبكة": اختَر الشبكة التي تريدها. يمكنك اختيار شبكة VPC، شرط أن تكون الشبكة قد فعّلت ميزة "الوصول الخاص إلى Google" أو يمكنها الوصول إلى الإنترنت.
في حقل "الشبكة الفرعية": اختَر الشبكة الفرعية التي تريدها. يمكنك اختيار الإعداد التلقائي.
في سمات "الوحدة"، يمكنك ترك القيمة التلقائية، وهي e2-standard-4.
- انقر على "إنشاء".
تنشئ أداة Vertex AI Workbench مثيلًا وتبدأه تلقائيًا. عندما يصبح المثيل جاهزًا للاستخدام، تفعّل أداة Vertex AI Workbench رابط Open JupyterLab. انقر عليه.
إنشاء دفتر ملاحظات Python 3
- داخل Jupyterlab، من مشغّل التطبيقات، في قسم "دفتر ملاحظات"، انقر على الرمز الذي يحمل شعار Python ويشير إلى Python3.
- يتم إنشاء دفتر ملاحظات Jupyter باسم "بلا عنوان" والإضافة ipynb.
- يمكنك إعادة تسميته باستخدام قسم "متصفّح الملفات" على الجانب الأيمن أو يمكنك تركه كما هو.
الآن، يمكننا البدء في وضع الرمز في دفتر البيانات.
3- استيراد المكتبات المطلوبة
بعد إنشاء المثيل وفتح Jupyterlab، علينا تثبيت جميع المكتبات المطلوبة لمشروعنا التعليمي حول رموز البرامج.
سنحتاج إلى ما يلي:
- مكتبة نامبي
- باندا
- TextEmbeddingInput وTextEmbeddingModel من vertexai.language_models
انسخ الرمز أدناه والصقه في خلية:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
وسيبدو مشابهًا لهذا:
4. إنشاء قاعدة بيانات متجهات محاكية
لاختبار الرمز البرمجي، سننشئ قاعدة بيانات تتألف من النصوص والمتجهات ذات الصلة بها والتي تم ترجمتها باستخدام نموذج تضمين النصوص gecko@003.
والهدف هو أن يبحث المستخدمون عن نص، ويترجمونه إلى مصفوفة، ويبحثون عنه في قاعدة بياناتنا، ويعرضون النتيجة الأقرب.
ستتضمّن قاعدة بيانات المتجهات 3 سجلّات، وإليك كيفية إنشائها:
انسخ الرمز أدناه والصقه في خلية جديدة.
DOCUMENT1 = {
"title": "Operating the Climate Control System",
"content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console. Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}
DOCUMENT2 = {
"title": "Touchscreen",
"content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon. For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}
DOCUMENT3 = {
"title": "Shifting Gears",
"content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position. Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
سيظهر الإجراء على النحو التالي:
لنحلّل الرمز البرمجي
في المتغيّرات DOCUMENT1 وDOCUMENT2 وDOCUMENT3، نخزّن قاموسًا يحاكي المستندات بعناوينها ومحتوياتها. تشير هذه "المستندات" إلى دليل محاكاة لسيارة من صنع Google.
في السطر التالي، ننشئ قائمة من هذه المستندات الثلاثة (القواميس).
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
أخيرًا، باستخدام Pandas، ننشئ إطار بيانات من هذه القائمة الذي سيُسمّى df_initial_db.
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
5- إنشاء عمليات تضمين النصوص
سنحصل الآن على نص مضمّن باستخدام نموذج gecko@003 لكل سجل في قاعدة البيانات المحاكية للمستندات.
انسخ الرمز التالي والصقه في خلية جديدة:
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
سيظهر الإجراء على النحو التالي:
لنحلّل الرمز البرمجي
حدّدنا دالة باسم embed_fn ستتلقّى كإدخال إطار بيانات pandas يحتوي على النص لتنفيذ عملية التضمين. بعد ذلك، تعرض الدالة النص المشفَّر كعمود.
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
في القائمة المسماة list_embedded_values، سنخزّن النص المشفَّر لكل صف ونُلحقه.
باستخدام طريقة iterrows من الباندا، يمكننا تكرار كل صف في إطار البيانات، والحصول على القيم من عمود Text (الذي يحتوي على المعلومات اليدوية من قاعدة البيانات المحاكية).
لإرسال نص عادي وعرض متجره باستخدام نموذج gecko@003، نُنشئ المتغيّر model الذي نضبط النموذج لاستخدامه من خلال استدعاء الدالة TextEmbeddingModel.from_pretrained.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
بعد ذلك، في عمليات إدراج المتغيّرات، نلتقط متجه النص الذي نرسله من خلال الدالة model.get_embeddings.
في نهاية الدالة، ننشئ عمودًا جديدًا في إطار البيانات يُسمى "النص المضمّن" وسيحتوي هذا العمود على قائمة بالناقلات التي تم إنشاؤها استنادًا إلى نموذج gecko@003.
df_input['Embedded text'] = list_embedded_values
return df_input
أخيرًا، في المتغيّر df_embedded_values_db، نلتقط إطار البيانات الذي يحتوي على بياناتنا الأصلية من قاعدة البيانات المحاكية بالإضافة إلى عمود جديد يحتوي على قائمة بالمتجهات لكل صف.
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
6- طرح سؤال على قاعدة بيانات المتجهات
والآن بعد أن أصبحت قاعدة بياناتنا تحتوي على النصوص وناقلات البيانات الخاصة بها، يمكننا المتابعة لطرح سؤال وإجراء طلب بحث في قاعدة بياناتنا للعثور على إجابة.
لإجراء ذلك، انسخ الرمز البرمجي أدناه والصقه في خلية جديدة:
question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])
text_to_search=embeddings[0].values
len(text_to_search)
ستظهر النتيجة على النحو التالي:
لنحلّل الرمز البرمجي
على غرار الدالة من الخطوة السابقة، نبدأ أولاً في ضبط متغيّر السؤال على ما ننوي طرحه على قاعدة البيانات.
question='How do you shift gears in the Google car?'
بعد ذلك، في متغيّر النموذج، نضبط النموذج الذي نريد استخدامه من خلال الدالة TextEmbeddingModel.from_pretrained، وهو في هذه الحالة نموذج gecko@003.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
في متغيّر "الترميزات"، نستدعي الدالة model.get_embeddings ونُمرّر النص المطلوب تحويله إلى متجه، وفي هذه الحالة، نُمرّر السؤال المطلوب طرحه.
embeddings = model.get_embeddings([(question)])
أخيرًا، يحتوي المتغيّر text_to_search على قائمة بالمتجهات التي تم ترجمتها من السؤال.
نطبع طول الخطّ المتجه كمرجع فقط.
text_to_search=embeddings[0].values
len(text_to_search)
7- مقارنة المتجهات
لدينا الآن قائمة بالمتجهات في قاعدة البيانات المحاكية وسؤال تم تحويله إلى متجه. وهذا يعني أنّه يمكننا الآن مقارنة متجه السؤال بجميع المتجهات في قاعدة بياناتنا لمعرفة أقرب متجه للإجابة عن سؤالنا بدقة أكبر.
لتحقيق ذلك، سنقيس المسافة بين متجه السؤال وكل متجه من قاعدة البيانات. هناك تقنيات متعدّدة لقياس المسافات بين المتجهات، وسنستخدم في هذا الدليل التعليمي تحديدًا المسافة الإقليدية أو معيار L2.
في Python، يمكننا الاستفادة من دالة numpy لتنفيذ ذلك.
انسخ الرمز التالي والصقه في خلية جديدة:
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')
من المفترض أن تظهر النتيجة على النحو التالي:
لنحلّل الرمز البرمجي
نبدأ بتحويل العمود الذي يحتوي على النص المضمّن أو متجهات قاعدة بياناتنا إلى قائمة وتخزينها في list_embedded_text_from_db.
لقد أعددنا أيضًا المتغيّر shortest_distance على القيمة 1 لمواصلة تعديله إلى أن نعثر على أقصر مسافة فعلية.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
بعد ذلك، باستخدام حلقة for، نكرّر العملية ونحصل على المسافة بين المتجه من السؤال وكل مَعلمة في قاعدة البيانات.
باستخدام دالة numpy linalg.norm، نحسب المسافة بينهما.
إذا كانت المسافة المحسوبة أقل من المسافة الواردة في المتغيّر shortest_distance، سيتم ضبط المسافة المحسوبة على هذا المتغيّر.
بعد ذلك، نحتفظ بأقصر مسافة وكذلك بالموضع في القائمة الذي تم العثور عليه فيه. في متغيّري shortest_distance وshortest_position.
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
8. النتائج
بعد معرفة موضع المتجه في القائمة الذي يمثّل أقصر مسافة بين السؤال وقاعدة البيانات، يمكننا طباعة النتائج.
انسخ الرمز البرمجي أدناه والصقه في خلية جديدة:
print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
df_embedded_values_db.at[shortest_position, 'Title']+": "+
df_embedded_values_db.at[shortest_position, 'Text'])
بعد تنفيذه، ستظهر لك رسالة مشابهة لما يلي:
9. تهانينا
تهانينا، لقد نجحت في إنشاء تطبيقك الأول باستخدام نموذج textembedding-gecko@003 في حالة استخدام حقيقية.
لقد تعرّفت على أساسيات النماذج المُدمَجة للنص وكيفية استخدام نموذج gecko003 على GCP Workbench.
أنت الآن تعرف الخطوات الرئيسية المطلوبة لمواصلة تطبيق معرفتك على المزيد من حالات الاستخدام.
الخطوة التالية
اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...