مقدمة إلى Bag of Words وكيفية ترميزها في Python لـ NLP

البلاط الأبيض والأسود الخربشة على سطح أسود بواسطة Pixabay

Bag of Words (BOW) هي طريقة لاستخراج الميزات من المستندات النصية. هذه الميزات يمكن استخدامها لتدريب خوارزميات التعلم الآلي. يخلق المفردات من جميع الكلمات الفريدة التي تحدث في جميع الوثائق في مجموعة التدريب.

بعبارات بسيطة ، هي عبارة عن مجموعة من الكلمات لتمثيل جملة بها عدد الكلمات وتتجاهل في الغالب الترتيب الذي تظهر به.

BOW هو نهج يستخدم على نطاق واسع مع:

  1. معالجة اللغة الطبيعية
  2. استرجاع المعلومات من الوثائق
  3. تصنيفات المستندات

على المستوى العالي ، فإنه ينطوي على الخطوات التالية.

يمكن أن تكون المتجهات المولدة مدخلات في خوارزمية تعلم الآلة.

دعنا نبدأ بمثال لنفهمه من خلال اتخاذ بعض الجمل وتوليد المتجهات لهؤلاء.

النظر في الجملتين أدناه.

1. "جون يحب مشاهدة الأفلام. ماري تحب الأفلام أيضًا."
2. "جون يحب أيضًا مشاهدة ألعاب كرة القدم".

يمكن تمثيل هاتين الجملتين أيضًا بمجموعة من الكلمات.

1. ["جون" ، "يحب" ، "إلى" ، "شاهد" ، "أفلام" ، "ماري" ، "يحب" ، "أفلام" ، "أيضًا."]
2. ["جون" ، "أيضًا" ، "يحب" ، "إلى" ، "يشاهد" ، "كرة القدم" ، "الألعاب"]

علاوة على ذلك ، بالنسبة لكل جملة ، قم بإزالة تكرارات متعددة للكلمة واستخدم عدد الكلمات لتمثيل هذا.

1. {"John": 1 ، "like": 2 ، "to": 1 ، "watch": 1 ، "movies": 2 ، "Mary": 1 ، "too": 1}
2. {"جون": 1 ، "أيضًا": 1 ، "الإعجابات": 1 ، "إلى": 1 ، "مشاهدة": 1 ، "كرة القدم": 1 ، "ألعاب": 1}

على افتراض أن هذه الجمل جزء من مستند ، يوجد أدناه تردد الكلمة المدمج لمستندنا بأكمله. تؤخذ كل الجمل في الاعتبار.

 {"جون": 2 ، "يحب": 3 ، "إلى": 2 ، "شاهد": 2 ، "أفلام": 2 ، "ماري": 1 ، "أيضًا": 1 ، "أيضًا": 1 ، " كرة القدم ": 1،" ألعاب ": 1}

سيتم استخدام المفردات أعلاه من جميع الكلمات الموجودة في المستند ، مع عدد الكلمات الخاص بكل منها ، لإنشاء متجهات لكل جملة من الجمل.

سيكون طول المتجه دائمًا مساويًا لحجم المفردات. في هذه الحالة ، يكون طول المتجه 11.

لتمثيل جملنا الأصلية في المتجه ، تتم تهيئة كل متجه بجميع الأصفار - [0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0]

يتبع ذلك التكرار والمقارنة مع كل كلمة في مفرداتنا ، وزيادة قيمة المتجه إذا كانت الجملة تحتوي على هذه الكلمة.

جون يحب مشاهدة الأفلام. ماري تحب الأفلام أيضا.
[1 ، 2 ، 1 ، 1 ، 2 ، 1 ، 1 ، 0 ، 0 ، 0]
جون يحب أيضا مشاهدة مباريات كرة القدم.
[1 ، 1 ، 1 ، 1 ، 0 ، 0 ، 0 ، 1 ، 1 ، 1]

على سبيل المثال ، في الجملة 1 ، تظهر كلمة "الإعجاب" في الموضع الثاني وتظهر مرتين. وبالتالي فإن العنصر الثاني من متجهنا للجمل 1 سيكون 2: [1 ، 2 ، 1 ، 1 ، 2 ، 1 ، 1 ، 0 ، 0 ، 0]

يتجه المتجه دائمًا إلى حجم المفردات لدينا.

قد ينتج عن الوثيقة الكبيرة التي تكون فيها المفردات الضخمة ضخمة المتجه الذي يحتوي على الكثير من القيم 0. وهذا ما يسمى ناقلات متفرق. تتطلب ناقلات متفرق المزيد من الذاكرة والموارد الحسابية عند وضع النماذج. إن العدد الهائل من المواقف أو الأبعاد يمكن أن يجعل عملية وضع النماذج صعبة للغاية بالنسبة للخوارزميات التقليدية.

ترميز خوارزمية BOW لدينا

ستكون المدخلات إلى الكود الخاص بنا عبارة عن جمل متعددة وسيكون الإخراج هو المتجهات.

مجموعة الإدخال هي:

["انتظر جو القطار" ، "القطار تأخر" ، "استقلت ماري وسامانثا الحافلة" ،
"بحثت عن ماري وسامانثا في محطة الحافلات" ،
"وصلت ماري وسامانثا إلى محطة الحافلات في وقت مبكر ولكن انتظرت حتى الظهر للحافلة"]

الخطوة 1: رمزي الجملة

سنبدأ بإزالة كلمات التوقف من الجمل.

كلمات التوقف هي كلمات لا تحتوي على أهمية كافية لاستخدامها بدون خوارزمية. لا نريد أن تأخذ هذه الكلمات مساحة في قاعدة البيانات الخاصة بنا ، أو تستغرق وقتًا طويلاً في المعالجة. لهذا ، يمكننا إزالتها بسهولة عن طريق تخزين قائمة الكلمات التي تعتبرها كلمات توقف.

التوكين هو عملية تقسيم سلسلة من السلاسل إلى أجزاء مثل الكلمات والكلمات الرئيسية والعبارات والرموز والعناصر الأخرى المسماة الرموز. يمكن أن تكون الرموز عبارة عن كلمات أو عبارات فردية أو حتى جمل كاملة. في عملية الرمز المميز ، يتم تجاهل بعض الأحرف مثل علامات الترقيم.

def word_extraction (جملة):
    تجاهل = ['a' ، "the" ، "is"]
    الكلمات = re.sub ("[^ \ w]"، ""، جملة) .split ()
    cleaned_text = [w.lower () لـ w بالكلمات إذا لم يتم تجاهلها]
    عودة cleaned_text

من أجل تنفيذ أقوى لكلمات التوقف ، يمكنك استخدام مكتبة python nltk. لديها مجموعة من الكلمات المحددة مسبقا لكل لغة. هنا مثال:

استيراد nltk
من nltk.corpus استيراد كلمات التوقف
 مجموعة (stopwords.words ( 'الإنجليزية'))

الخطوة 2: تطبيق الرمز المميز على جميع الجمل

رمزية def (جمل):
    الكلمات = []
    للجملة في الجمل:
        w = word_extraction (جملة)
        words.extend (ث)
        
    الكلمات = مرتبة (قائمة (مجموعة (كلمات)))
    عودة الكلمات

تكرر الطريقة كل الجمل وتضيف الكلمة المستخرجة إلى صفيف.

سيكون ناتج هذه الطريقة:

["و" ، "وصلت" ، "في" ، "حافلة" ، "لكن" ، "مبكّرة" ، "من أجل" ، "أنا" ، "جو" ، "متأخرة" ، "نظرت ،" مريم "،" ظهرًا ، "سامانثا" ، "محطة" ، "ال" ، "أخذ" ، "قطار" ، "حتى" ، "انتظر" ، "كان"]

الخطوة 3: بناء المفردات وتوليد ناقلات

استخدم الطرق المعرفة في الخطوتين 1 و 2 لإنشاء مفردات المستند واستخراج الكلمات من الجمل.

def gener_bow (allsentences):
    vocab = الرمز المميز (allsentences)
    print ("Word List for Document \ n {0} \ n" .format (vocab))؛
للحكم في allsentences:
        الكلمات = word_extraction (جملة)
        bag_vector = numpy.zeros (len (vocab))
        ل ث في الكلمات:
            لأني ، الكلمة في التعداد (فوكب):
                إذا كانت الكلمة == w:
                    bag_vector [i] + = 1
                    
        طباعة ( "{0} \ ن {1} \ ن" .format (الجملة، numpy.array (bag_vector)))

فيما يلي المدخلات المحددة وتنفيذ التعليمات البرمجية الخاصة بنا:

allsentences = ["انتظر جو قطار القطار" ، "القطار متأخر" ، "استقلت ماري وسامانثا الحافلة" ،
"بحثت عن ماري وسامانثا في محطة الحافلات" ،
"وصلت ماري وسامانثا إلى محطة الحافلات في وقت مبكر ولكن انتظرت حتى الظهر للحافلة"]
generate_bow (allsentences)

متجهات الإخراج لكل من الجمل هي:

انتاج:
جو انتظر القطار القطار
[0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2.. 0. 1. 0.]
القطار كان متأخرا
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
استغرق مريم وسامانثا الحافلة
[1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
بحثت عن ماري وسامانثا في محطة الحافلات
[1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
وصلت ماري وسامانثا إلى محطة الحافلات في وقت مبكر ولكن انتظرت حتى الظهر للحافلة
[1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

كما ترون ، تمت مقارنة كل جملة بقائمة الكلمات التي تم إنشاؤها في الخطوة 1. استنادًا إلى المقارنة ، قد تتم زيادة قيمة عنصر المتجه. يمكن استخدام هذه المتجهات في خوارزميات ML لتصنيف المستندات والتنبؤات.

لقد كتبنا الكود الخاص بنا والناقلات التي تم إنشاؤها ، ولكن الآن دعونا نفهم حقيبة الكلمات أكثر قليلاً.

نظرة ثاقبة في كيس من الكلمات

يعتبر نموذج BOW فقط في حالة حدوث كلمة معروفة في مستند أم لا. لا تهتم بالمعنى والسياق والترتيب الذي تظهر به.

هذا يعطي نظرة ثاقبة أن وثائق مماثلة سيكون لها عدد الكلمات مماثلة لبعضها البعض. بمعنى آخر ، كلما كانت الكلمات متشابهة في وثيقتين ، كلما كانت المستندات مماثلة.

حدود القوس

  1. المعنى الدلالي: نهج BOW الأساسي لا يأخذ في الاعتبار معنى الكلمة في المستند. إنه يتجاهل تمامًا السياق الذي يتم استخدامه فيه. يمكن استخدام نفس الكلمة في أماكن متعددة بناءً على السياق أو الكلمات القريبة.
  2. حجم المتجه: بالنسبة لمستند كبير ، يمكن أن يكون حجم المتجه كبيرًا مما ينتج عنه الكثير من الحساب والوقت. قد تحتاج إلى تجاهل الكلمات بناءً على مدى ملاءمتها لحالة الاستخدام الخاصة بك.

كانت هذه مقدمة صغيرة لأسلوب BOW. أظهر الرمز كيف يعمل على مستوى منخفض. هناك الكثير لفهم حول BOW. على سبيل المثال ، بدلاً من تقسيم الجملة الخاصة بنا في كلمة واحدة (1 غرام) ، يمكنك تقسيم زوج من كلمتين (ثنائية الغرام أو 2 غرام). في بعض الأحيان ، يبدو التمثيل ثنائي الغرام أفضل بكثير من استخدام غرام واحد. وغالبًا ما يمكن تمثيلها باستخدام تدوين N-gram. لقد أدرجت بعض الأبحاث في قسم الموارد لمزيد من المعرفة المتعمقة.

ليس لديك رمز BOW كلما احتجت إليه. هو بالفعل جزء من العديد من الأطر المتاحة مثل CountVectorizer في تعلم sci-kit.

يمكن استبدال الرمز السابق الخاص بنا بـ:

من sklearn.feature_extraction.text استيراد CountVectorizer

المتجه = CountVectorizer ()
X = vectorizer.fit_transform (allsentences)

طباعة (X.toarray ())

من الجيد دائمًا فهم كيفية عمل المكتبات في الأطر وفهم الأساليب التي تقف وراءها. كلما فهمت المفاهيم بشكل أفضل ، استفادت بشكل أفضل من الأطر.

شكرا لقرائتك المجلة. الكود الظاهر متاح على جيثب الخاص بي.

يمكنك متابعتي على "متوسط" و "Twitter" و "LinkedIn" ، بالنسبة لأي أسئلة ، يمكنك التواصل معي على البريد الإلكتروني (praveend806 [at] gmail [dot] com).

موارد لقراءة المزيد عن حقيبة الكلمات

  1. ويكيبيديا BOW
  2. فهم نموذج حقيبة الكلمات: إطار إحصائي
  3. النماذج والتطبيقات الخاصة بالحفاظ على دلالات الكلمات