يعد تضمين النص إحدى مهام التعلم الآلي التي يتم استخدامها لإنشاء تمثيل متجه لجزء من النص. يمكن بعد ذلك استخدام هذا المتجه كمدخل لخوارزمية التعلم الآلي. الهدف من تضمين النص هو التقاط معنى النص بطريقة مناسبة للتعلم الآلي.
هناك العديد من الطرق المختلفة لإنشاء تضمينات نصية، ولكن الأكثر شيوعًا هو استخدام الشبكة العصبية. الشبكة العصبية هي خوارزمية تعلم آلي جيدة جدًا في تعلم العلاقات المعقدة. المدخلات إلى الشبكة العصبية هي متجه، والإخراج هو متجه بنفس الحجم. تتعلم الشبكة العصبية تعيين متجهات الإدخال إلى متجهات الإخراج بطريقة تلتقط العلاقات بين المدخلات والمخرجات.
لإنشاء تضمين نص، يتم تدريب الشبكة العصبية أولاً على مجموعة كبيرة من النص. بيانات التدريب عبارة عن مجموعة من الجمل، ويتم تمثيل كل جملة كمتجه. يتم إنشاء المتجهات عن طريق أخذ متجهات الكلمات في الجملة وجمعها معًا. يتم بعد ذلك تدريب الشبكة العصبية على تعيين متجهات الجملة بحجم متجه ثابت.
بمجرد تدريب الشبكة العصبية، يمكن استخدامها بعد ذلك لإنشاء تضمينات نصية لأجزاء جديدة من النص. يتم تمثيل النص الجديد أولاً كمتجه، ثم يتم استخدام الشبكة العصبية لتعيين المتجه بحجم المتجه الثابت. والنتيجة هي تضمين نص يجسد معنى النص.
يمكن استخدام تضمينات النص لمجموعة متنوعة من مهام التعلم الآلي. على سبيل المثال، يمكن استخدامها لتحسين أداء خوارزمية التعلم الآلي المستخدمة لتصنيف النصوص. يمكن أيضًا استخدام عمليات تضمين النص للعثور على أجزاء مماثلة من النص، أو لتجميع النصوص معًا.
هناك العديد من الطرق المختلفة لإنشاء تضمينات نصية، وسيعتمد اختيار الطريقة على التطبيق. ومع ذلك، تعد الشبكات العصبية طريقة قوية ومستخدمة على نطاق واسع لإنشاء تضمينات نصية.
Co:here عبارة عن شبكة عصبية قوية يمكنها إنشاء النص وتضمينه وتصنيفه. في هذا البرنامج التعليمي، سوف نستخدم Co:here لتضمين الأوصاف. لاستخدام Co:here، تحتاج إلى إنشاء حساب على Co:here والحصول على مفتاح API.
سنبرمج بلغة بايثون، لذلك نحتاج إلى تثبيت مكتبة cohere
بواسطة pip
pip install cohere
أولاً، علينا تنفيذ cohere.Client
. في وسيطات العميل، يجب أن يكون مفتاح API الذي قمت بإنشائه من قبل، والإصدار 2021-11-08
. سأقوم بإنشاء الفصل CoHere
، وسيكون مفيدًا في الخطوات التالية.
class CoHere :
def __init__ ( self , api_key ):
self . co = cohere . Client ( f' { api_key } ' , '2021-11-08' )
self . examples = []
الجزء الرئيسي من كل شبكة عصبية هو مجموعة البيانات. في هذا البرنامج التعليمي، سأستخدم مجموعة بيانات تتضمن 1000 وصف لـ 10 فئات. إذا كنت تريد استخدام نفس الشيء، يمكنك تنزيله هنا.
تحتوي مجموعة البيانات التي تم تنزيلها على 10 مجلدات في كل مجلد 100 files.txt
مع الأوصاف. اسم الملفات هو علامة وصف، على سبيل المثال، sport_3.txt
.
سنقوم بمقارنة Random Forest
مع Co:here Classifier
، لذلك يتعين علينا إعداد البيانات بطريقتين. بالنسبة إلى Random Forest
سنستخدم Co:here Embedder
، وسنركز على هذا في هذا البرنامج التعليمي. يتطلب مصنف Cohere عينات، حيث يجب تصميم كل عينة كقائمة [description, label]
وقد قمت بذلك في البرنامج التعليمي السابق (هنا)
في البداية، نحتاج إلى تحميل جميع البيانات للقيام بذلك. نقوم بإنشاء الدالة load_examples
. في هذه الوظيفة سوف نستخدم ثلاث مكتبات خارجية:
os.path
للذهاب إلى المجلد الذي يحتوي على البيانات. يتم تنفيذ الكود في مسار يوجد به ملف python's file.py
. هذه مكتبة داخلية، لذا لا نحتاج إلى تثبيتها.
numpy
هذه المكتبة مفيدة للعمل مع المصفوفات. في هذا البرنامج التعليمي، سوف نستخدمه لتوليد أرقام عشوائية. يجب عليك تثبيت هذه المكتبة عن طريق pip pip install numpy
.
يساعدنا glob
على قراءة جميع أسماء الملفات والمجلدات. هذه مكتبة خارجية، لذا يلزم التثبيت - pip install glob
.
يجب استخراج مجموعة البيانات التي تم تنزيلها في مجلد data
. بواسطة os.path.join
يمكننا الحصول على مسارات عالمية للمجلدات.
folders_path = os . path . join ( 'data' , '*' )
في نظام التشغيل Windows، الإرجاع يساوي data*
.
ثم يمكننا استخدام طريقة glob
للحصول على كافة أسماء المجلدات.
folders_name = glob ( folders_path )
folders_name
عبارة عن قائمة تحتوي على مسارات نوافذ المجلدات. في هذا البرنامج التعليمي، هذه هي أسماء التسميات.
[ 'data \ business' , 'data \ entertainment' , 'data \ food' , 'data \ graphics' , 'data \ historical' , 'data \ medical' , 'data \ politics' , 'data \ space' , 'data \ sport' , 'data \ technologie' ]
حجم Co:here
مجموعة بيانات التدريب لا يمكن أن يكون أكبر من 50 مثالًا ويجب أن يحتوي كل فصل على 5 أمثلة على الأقل، ولكن بالنسبة لـ Random Forest
يمكننا استخدام 1000 مثال. مع for
يمكننا الحصول على أسماء كل ملف. تبدو الوظيفة بأكملها كما يلي:
import os . path
from glob import glob
import numpy as np
def load_examples ( no_of_ex ):
examples_path = []
folders_path = os . path . join ( 'data' , '*' )
folders_name = glob ( folders_path )
for folder in folders_name :
files_path = os . path . join ( folder , '*' )
files_name = glob ( files_path )
for i in range ( no_of_ex // len ( folders_name )):
random_example = np . random . randint ( 0 , len ( files_name ))
examples_path . append ( files_name [ random_example ])
return examples_path
تأخذ الحلقة الأخيرة بشكل عشوائي مسارات N لكل تسمية وإلحاقها بقائمة جديدة examples_path
.
الآن علينا إنشاء مجموعة التدريب. للقيام بذلك، سنقوم بتحميل الأمثلة باستخدام load_examples()
. في كل مسار يوجد اسم فئة، وسوف نستخدمه لإنشاء عينات. يجب قراءة الأوصاف من الملفات، ولا يمكن أن يكون الطول طويلاً، لذا في هذا البرنامج التعليمي، سيكون الطول مساويًا لـ 100. ولإدراج texts
، يتم إلحاق قائمة [descroption, class_name]
. وبالتالي، فإن العودة هي تلك القائمة.
def examples ( no_of_ex ):
texts = []
examples_path = load_examples ( no_of_ex )
for path in examples_path :
class_name = path . split ( os . sep )[ 1 ]
with open ( path , 'r' , encoding = "utf8" ) as file :
text = file . read ()[: 100 ]
texts . append ([ text , class_name ])
return texts
نعود إلى فئة CoHere
. يتعين علينا إضافة طريقة واحدة - لتضمين الأمثلة.
الطريقة الثانية cohere
هي تضمين النص. تحتوي الطريقة على وسيطات serval، مثل:
حجم model
من النموذج.
قائمة texts
للنصوص المراد تضمينها.
truncate
إذا كان النص أطول من الرمز المميز المتاح، أي جزء من النص يجب أن يؤخذ LEFT
أو RIGHT
أو NONE
.
كل منهم يمكنك أن تجد هنا.
في هذا البرنامج التعليمي، سيتم تنفيذ طريقة cohere
كطريقة لفئة CoHere
الخاصة بنا.
def embed ( self , no_of_ex ):
# as a good developer we should split the dataset.
data = pd . DataFrame ( examples ( no_of_ex ))
self . X_train , self . X_test , self . y_train , self . y_test = train_test_split (
list ( data [ 0 ]), list ( data [ 1 ]), test_size = 0.2 , random_state = 0 )
# in the next two lines we create a numeric form of X_train data
self . X_train_embeded = self . co . embed ( texts = X_train ,
model = "large" ,
truncate = "LEFT" ). embeddings
self . X_test_embeded = self . co . embed ( texts = X_test ,
model = "large" ,
truncate = "LEFT" ). embeddings
سيكون X_train_embeded
عبارة عن مجموعة من الأرقام، والتي تبدو كما يلي:
[ 386, 0.39653537, -0.409076, 0.5956299, -0.06624506, 2.0539167, 0.7133603,...
لإنشاء تطبيق يقوم بمقارنة عرضين محتملين، سنستخدم Stramlit
. هذه مكتبة سهلة ومفيدة للغاية.
تثبيت
pip install streamlit
سنحتاج إلى إدخالات نصية لمفتاح واجهة برمجة التطبيقات co:here
.
في مستندات Streamlit يمكننا العثور على طرق:
st.header()
لإنشاء رأس في تطبيقنا
st.test_input()
لإرسال طلب نصي
st.button()
لإنشاء زر
st.write()
لعرض نتائج نموذج Cohere.
st.progress()
لعرض شريط التقدم
st.column()
لتقسيم التطبيق
st . header ( "Co:here Text Classifier vs Random Forest" )
api_key = st . text_input ( "API Key:" , type = "password" )
cohere = CoHere ( api_key )
cohere . list_of_examples ( 50 ) # number of examples for Cohere classifier
# showed in the previous tutorial
cohere . embed ( 1000 ) # number of examples for random forest
# initialization of random forest with sklearn library
forest = RandomForestClassifier ( max_depth = 10 , random_state = 0 )
col1 , col2 = st . columns ( 2 )
if col1 . button ( "Classify" ):
# training process of random forest, to do it we use embedded text.
forest . fit ( cohere . X_train_embeded , cohere . y_train )
# prediction process of random forest
predict = forest . predict_proba ( np . array ( cohere . X_test_embeded [ 0 ]). reshape ( 1 , - 1 ))[ 0 ]
here = cohere . classify ([ cohere . X_test [ 0 ]])[ 0 ] # prediction process of cohere classifier
col2 . success ( f"Correct prediction: { cohere . y_test [ 0 ] } " ) # display original label
col1 , col2 = st . columns ( 2 )
col1 . header ( "Co:here classify" ) # predictions for cohere
for con in here . confidence :
col1 . write ( f" { con . label } : { np . round ( con . confidence * 100 , 2 ) } %" )
col1 . progress ( con . confidence )
col2 . header ( "Random Forest" ) # predictions for random forest
for con , pred in zip ( here . confidence , predict ):
col2 . write ( f" { con . label } : { np . round ( pred * 100 , 2 ) } %" )
col2 . progress ( pred )
لتشغيل أمر استخدام التطبيق Streamlit
streamlit run name_of_your_file . py
يبدو التطبيق الذي تم إنشاؤه مثل هذا
يعد تضمين النص أداة قوية يمكن استخدامها لتحسين أداء خوارزميات التعلم الآلي. تعد الشبكات العصبية طريقة فعالة ومستخدمة على نطاق واسع لإنشاء تضمينات نصية. يمكن استخدام عمليات تضمين النص في مهام مثل تصنيف النص وتشابه النص وتجميع النص.
في هذا البرنامج التعليمي، قمنا بمقارنة Random Forest
مع Co:here Classifier
، ولكن إمكانيات Co:here Embedder
هائلة. يمكنك بناء الكثير من الأشياء معها.
ترقبوا الدروس المستقبلية! يمكن لمستودع هذا الرمز التحقق هنا.
شكرًا لك! - أدريان باناشوفيتش، متدرب في علوم البيانات في New Native