لمحة عن هذا الدرس التطبيقي حول الترميز
1. مقدمة
تاريخ آخر تعديل: 08-04-2024
تضمين النص
يشير إدراج النصوص إلى عملية تحويل البيانات النصية إلى تمثيلات رقمية. وهذه التمثيلات الرقمية، التي غالبًا ما تكون متجهات، تُسجّل المعنى الدلالي والعلاقات بين الكلمات في النص. تخيل الأمر على النحو التالي:
النص يشبه لغة معقّدة مليئة بالتفاصيل الدقيقة والغموض.
تُحوِّل ميزة "تضمين النصوص" هذه اللغة إلى تنسيق رياضي أبسط يمكن للأجهزة فهمه ومعالجته.
مزايا تضمين النصوص
- إتاحة المعالجة الفعّالة: يمكن للأجهزة معالجة الأرقام بشكل أسرع بكثير مقارنةً بالنصّ الأوّلي. وهذا أمر بالغ الأهمية لمهام مثل محركات البحث وأنظمة التوصية والترجمة الآلية.
- فهم المعنى الدلالي: لا يقتصر التضمين على المعنى الحرفي للكلمات فحسب. وتلتقط هذه النماذج السياق والعلاقات بين الكلمات، ما يتيح إجراء تحليل أكثر دقة.
- تحسين أداء تعلُّم الآلة: يمكن استخدام عمليات إدراج النصوص كسمات في نماذج تعلُّم الآلة، ما يؤدي إلى تحقيق أداء أفضل في مهام مثل تحليل المشاعر وتصنيف النصوص ووضع النماذج للمواضيع.
حالات استخدام ميزة "إدراج النص"
من خلال تحويل النص إلى تمثيلات رقمية، توفّر عمليات تضمين النصوص مجموعة متنوعة من التطبيقات في معالجة اللغات الطبيعية (NLP). في ما يلي بعض حالات الاستخدام الرئيسية:
1. محرّكات البحث واسترداد المعلومات:
تسمح عمليات تضمين النصوص لمحرّكات البحث بفهم المعنى الدلالي لعبارات البحث ومطابقتها مع المستندات ذات الصلة، حتى إذا لم تكن الكلمات الرئيسية نفسها متوفّرة.
ومن خلال مقارنة تضمينات طلب البحث مع تضمينات المستندات، يمكن لمحركات البحث تحديد المستندات التي تغطي مواضيع أو مفاهيم مماثلة.
2- أنظمة الاقتراح:
تستخدِم أنظمة الاقتراحات عمليات إدراج النصوص لتحليل سلوك المستخدِم وإعداداته المفضّلة التي يعبّر عنها من خلال المراجعات أو التقييمات أو سجلّ التصفّح.
يمكن للنظام بعد ذلك اقتراح عناصر مماثلة من خلال مقارنة العناصر المضمَّنة في المنتجات أو المقالات أو أي محتوى آخر تفاعل معه المستخدم.
3. رصد السرقة الأدبية:
يمكن أن تساعد المقارنة بين تضمينات جزأين نصيين في تحديد السرقة الأدبية المحتملة من خلال العثور على أوجه تشابه كبيرة في بنيتها الدلالية.
هذه مجرد أمثلة قليلة، ولا تزال الاحتمالات تتزايد مع تطوّر تقنيات تضمين النصوص. ومع تقدّم أجهزة الكمبيوتر في فهم اللغة بشكل أفضل من خلال عمليات التضمين، يمكننا توقّع ظهور المزيد من التطبيقات المبتكرة في المستقبل.
textembedding-gecko@003
Textembedding-gecko@003 هو إصدار محدّد من نموذج إدراج نص مدرَّب مسبقًا تقدّمه Google Cloud Platform (GCP) من خلال Vertex AI وحزمة أدوات وخدمات الذكاء الاصطناعي.
التطبيق الذي ستصممه
في هذا الدرس التطبيقي حول الترميز، ستُنشئ نصًا برمجيًا بلغة Python. هذا النص البرمجي:
- يمكنك استخدام واجهة برمجة تطبيقات Vertex لاستدعاء 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 في صفحة أداة اختيار المشاريع.
- الانتقال إلى أداة اختيار المشاريع
- تأكَّد من تفعيل الفوترة لمشروعك على 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، علينا تثبيت جميع المكتبات المطلوبة لمشروعنا التعليمي.
سنحتاج إلى ما يلي:
- مكتبة نامبي
- باندا
- TextIncludedingInput، و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]
وأخيرًا، بالاستفادة من الباندا، ننشئ إطار بيانات من تلك القائمة والذي سيسمى 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، سنخزّن النص المشفَّر لكل صف ونُلحقه.
باستخدام طريقة التكرارات من pandas، يمكننا تكرار كل صف في إطار البيانات، والحصول على القيم من العمود 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.
في بايثون، يمكننا الاستفادة من دالة 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.
أنت تعرف الآن الخطوات الرئيسية المطلوبة لمواصلة تطبيق معلوماتك على المزيد من حالات الاستخدام.
الخطوات التالية
اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...