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

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

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

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

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

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

يمكن إدخال النواقل المولدة في خوارزمية التعلم الآلي الخاصة بك.

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

تأمل الجملتين أدناه.

1. "John likes to watch movies. Mary likes movies too."
2. "John also likes to watch football games."

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

1. ['John', 'likes', 'to', 'watch', 'movies.', 'Mary', 'likes', 'movies', 'too.']
2. ['John', 'also', 'likes', 'to', 'watch', 'football', 'games']

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

1. {"John":1,"likes":2,"to":1,"watch":1,"movies":2,"Mary":1,"too":1}
2. {"John":1,"also":1,"likes":1,"to":1,"watch":1,"football":1, "games":1}

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

 {"John":2,"likes":3,"to":2,"watch":2,"movies":2,"Mary":1,"too":1, "also":1,"football":1,"games":1}

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

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

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

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

John likes to watch movies. Mary likes movies too.[1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
John also likes to watch football games.[1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

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

المتجه يتناسب دائمًا مع حجم مفرداتنا.

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

ترميز خوارزمية BOW

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

مصفوفة الإدخال هي:

["Joe waited for the train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]

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

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

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

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

def word_extraction(sentence): ignore = ['a', "the", "is"] words = re.sub("[^\w]", " ", sentence).split() cleaned_text = [w.lower() for w in words if w not in ignore] return cleaned_text

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

import nltkfrom nltk.corpus import stopwords set(stopwords.words('english'))

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

def tokenize(sentences): words = [] for sentence in sentences: w = word_extraction(sentence) words.extend(w) words = sorted(list(set(words))) return words

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

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

['and', 'arrived', 'at', 'bus', 'but', 'early', 'for', 'i', 'joe', 'late', 'looked', 'mary', 'noon', 'samantha', 'station', 'the', 'took', 'train', 'until', 'waited', 'was']

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

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

def generate_bow(allsentences): vocab = tokenize(allsentences) print("Word List for Document \n{0} \n".format(vocab));
for sentence in allsentences: words = word_extraction(sentence) bag_vector = numpy.zeros(len(vocab)) for w in words: for i,word in enumerate(vocab): if word == w: bag_vector[i] += 1 print("{0}\n{1}\n".format(sentence,numpy.array(bag_vector)))

فيما يلي المدخلات المحددة وتنفيذ كودنا:

allsentences = ["Joe waited for the train train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]
generate_bow(allsentences)

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

Output:
Joe waited for the train train[0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2. 0. 1. 0.]
The train was late[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Mary and Samantha took the bus[1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
I looked for Mary and Samantha at the bus station[1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Mary and Samantha arrived at the bus station early but waited until noon for the bus[1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

As you can see, each sentence was compared with our word list generated in Step 1. Based on the comparison, the vector element value may be incremented. These vectors can be used in ML algorithms for document classification and predictions.

We wrote our code and generated vectors, but now let’s understand bag of words a bit more.

Insights into bag of words

The BOW model only considers if a known word occurs in a document or not. It does not care about meaning, context, and order in which they appear.

This gives the insight that similar documents will have word counts similar to each other. In other words, the more similar the words in two documents, the more similar the documents can be.

Limitations of BOW

  1. Semantic meaning: the basic BOW approach does not consider the meaning of the word in the document. It completely ignores the context in which it’s used. The same word can be used in multiple places based on the context or nearby words.
  2. Vector size: For a large document, the vector size can be huge resulting in a lot of computation and time. You may need to ignore words based on relevance to your use case.

This was a small introduction to the BOW method. The code showed how it works at a low level. There is much more to understand about BOW. For example, instead of splitting our sentence in a single word (1-gram), you can split in the pair of two words (bi-gram or 2-gram). At times, bi-gram representation seems to be much better than using 1-gram. These can often be represented using N-gram notation. I have listed some research papers in the resources section for more in-depth knowledge.

You do not have to code BOW whenever you need it. It is already part of many available frameworks like CountVectorizer in sci-kit learn.

Our previous code can be replaced with:

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(allsentences)print(X.toarray())

It’s always good to understand how the libraries in frameworks work, and understand the methods behind them. The better you understand the concepts, the better use you can make of frameworks.

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

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

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

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