الأخبار التكنولوجية والاستعراضات والنصائح!

تجميع اللغة الطبيعية – الجزء 1 – نحو الذكاء الاصطناعي

ستساعدك المقالة التالية: تجميع اللغة الطبيعية – الجزء 1 – نحو الذكاء الاصطناعي

معالجة اللغة الطبيعية

تجميع اللغة الطبيعية – الجزء الأول

ساعد روبوتات المحادثة في التعامل مع الأسئلة الشائعة باستخدام كود Python للترميز و GloVe و TF-IDF

تصنيف الأشياء أمر طبيعي بالنسبة لنا: كتبنا وأفلامنا وموسيقانا كلها لها أنواع ؛ الأشياء التي ندرسها مقسمة بين مواضيع مختلفة وحتى الطعام الذي نأكله ينتمي إلى مطابخ مختلفة!
في السنوات الأخيرة ، تمكنا من تطوير خوارزميات أفضل وأفضل لتصنيف النص: يبدو أن نماذج مثل BERT-ITPT-FiT (BERT + with In-Task Pre-Training + Fine-Tuning) أو XL-NET هي أبطال حاكمة في هذا ، على الأقل في 29 مجموعة بيانات معيارية متاحة على PapersWithCode.

في السنوات الأخيرة ، تمكنا من تطوير خوارزميات أفضل وأفضل لتصنيف النص: يبدو أن نماذج مثل BERT-ITPT-FiT (BERT + with In-Task Pre-Training + Fine-Tuning) أو XL-NET هي أبطال حاكمة في هذا ، على الأقل في 29 مجموعة بيانات معيارية متاحة على PapersWithCode.

لكن ماذا لو لم نعرف الفئات المتاحة للنصوص التي نريد تحليلها؟ خذ على سبيل المثال مجموعة من المحادثات أو مجموعة من الكتب أو المقالات التي تنتمي جميعها إلى تخصصات مختلفة في نفس الموضوع: التسميات ليست دائمًا واضحة تمامًا مثل البريد العشوائي / ليس البريد العشوائي ، فقد لا يكون لدينا أي فكرة عن عدد أو ماذا نوع من الملصقات التي يمكن توقعها ، أو أن أساليب التصنيف العادية المدربة مسبقًا لن تتمتع بمعرفة متعمقة بالمجال مطلوبة لعدم تصنيفها كلها على أنها متشابهة ، في حين لا يتوفر ما يكفي من المواد أو الوقت أو القوة الحسابية لضبط محول بدقة نموذج.

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

لنرى كيف!

من الكلمات إلى القيم الرقمية: الترميز والتضمين

أول شيء يتعين علينا القيام به ، كما هو الحال دائمًا عند التعامل مع اللغة الطبيعية ، هو تحويل النص إلى شيء يمكن أن تفهمه خوارزمياتنا. يتم تقسيم الفقرات والجمل إلى مكوناتها الأساسية ، الكلمات ، في عملية تسمى الترميز. لكن الكلمات نفسها لا يمكن تغذيتها في نموذج حسابي نظرًا لعدم إمكانية تطبيق العمليات الحسابية عليها ، وهو ما يفسر الحاجة إلى تعيينها في متجهات للأرقام الحقيقية: تتحول أساسًا إلى متواليات من الأرقام التي تمثلها في فضاء رياضي ، أيضًا الحفاظ على العلاقات بينهما (عملية تُعرف باسم تضمين الكلمات ، وهو مصطلح يأتي من الرياضيات لتحديد خريطة الحقن والحفاظ على البنية).

يبدو الأمر معقدًا ، ولكن هناك طرقًا بسيطة للقيام بذلك ، مثل تلك الموضحة أدناه: بدءًا من ثلاث جمل (على اليسار) يتم استخراج الرموز المميزة الخاصة بهم ويتم إجراء تضمين بسيط جدًا (على اليمين) عن طريق حساب تكرارات كل رمز (كلمة) في النصوص الأصلية

في المثال أعلاه ، تم تضمين كلمة بدء التشغيل كـ [1,0,1] لأنه يظهر مرة واحدة في النص الأول والثالث ولكن ليس في النص الثاني ، بينما يتم تضمين كلمة “في” كـ [0,2,0] لأنه يظهر فقط في الجملة الثانية ، مرتين.

Note أنه ليس مثالًا عمليًا للغاية: نظرًا للعدد القليل من المدخلات ، ينتهي الأمر بالكلمات المختلفة بالتضمين نفسه (على سبيل المثال ، يظهر كل من “متخصص” و “في” في النص الثاني فقط ، لذا فإنهما يشتركان في نفس التضمين [0,1,0]) ، ولكننا نأمل أن تساعدك في الحصول على فهم أفضل لكيفية عمل العملية.

لاحظ أيضًا أن الرموز كلها أحرف صغيرة وتمت إزالة علامات الترقيم: هذه ممارسة شائعة ، على الرغم من أنها تعتمد على نوع النص الذي نتعامل معه.

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

ومع ذلك ، يوفر هذا الأسلوب ميزة تضمين المستندات نفسها في نفس الوقت مع الكلمات: قراءة الجدول عموديًا ، يمكن قراءة النص 1 على أنه [1,1,1,1,1,1,0,0,0,0]. هذا يجعل من السهل مواجهة المصادر المختلفة من خلال إدخال مقياس المسافة.

مثال رمز الترميز في Python باستخدام nltk:

#! pip install nltk من nltk.tokenize import word_tokenize text = “Digitiamo هي شركة ناشئة من إيطاليا” tokenized_text = nltk.word_tokenize (text) print (tokenized_text) # OUTPUT:
# [‘Digitiamo’, ‘is’, ‘a’, ‘Startup’, ‘from’, ‘Italy’]

مثال رمز التضمين في Python باستخدام Word2Vec الخاص بـ gensim

#! نقطة تثبيت – ترقية gensim من gensim.models استيراد Word2Vec
النموذج = Word2Vec ([tokenized_text]، min_count = 1)
“”
min_count () – يتجاهل كل الكلمات ذات التردد الكلي أقل من هذا. تم تحسين Word2Vec للعمل مع نصوص متعددة في نفس الوقت في شكل قائمة من النصوص. عند العمل مع نص واحد ، يجب وضعه في قائمة تشرح الأقواس المربعة حول tokenized_text
طباعة (list (model.wv.vocab)) # الإخراج:
# [‘Digitiamo’, ‘is’, ‘a’, ‘Startup’, ‘from’, ‘Italy’]

حفلات الزفاف شائعة الاستخدام: TF-IDF و GloVe

  • TF-IDF تمثل تيerm Fاستعادة-أناnverse دوثيقة Fتكرار ويشدد على أهمية كل مصطلح بناءً على عدد المرات التي يظهر فيها في نصوص أخرى من المجموعة. قد يكون من المفيد جدًا تضمين النصوص في مجال متخصص لغرض التجميع. الكلمات التي تظهر في كل مستند ، بغض النظر عن مدى ندرة استخدامها اليومي ، ستُعطى وزناً ضئيلاً للغاية ، بينما الكلمات التي تظهر فقط في بعض المستندات ستُعطى وزناً أكبر ، مما يسهل التعرف على المجموعات المحتملة.
    على سبيل المثال ، إذا كنا نحاول تضمين مجموعة من الأوراق حول علم الغدد الصماء ، فمن المحتمل أن يتم ذكر كلمة “علم الغدد الصماء” نفسها عدة مرات في كل ورقة ، مما يجعل وجودها غير مفيد للغاية لغرض التمييز بينها.
  • قفاز (غلوبال Vectors لتمثيل الكلمات) هي خوارزمية غير خاضعة للإشراف تربط الكلمات بناءً على عدد المرات التي تحدث فيها معًا ، في محاولة لتعيين المعنى الأساسي. يمكنك أن ترى بعض الأمثلة على العلاقات بين الكلمات التي تم الحصول عليها من خلال GloVe في الصورة أدناه: “رجل” تقريبًا بعيد عن “امرأة” مثل “ملك” عن “ملكة” يسير في نفس الاتجاه ، لأن لهما نفس المعنى لـ الأجناس المختلفة (والعكس صحيح بالطبع). يحدث الشيء نفسه للمقارنات وصيغ التفضيل في اللوحة الرابعة: المتجه الذي ينقلك من “واضح” إلى “أكثر وضوحًا” ، إذا تم تطبيقه على “ناعم” ، ينقلك إلى “أكثر ليونة”.
    اعتمادًا على حجم مجموعة ملفات القفازات مكتبة يمكن أن تكون مكملاً جيدًا لـ GloVe: وفقًا لـ GitHub ، “إنها مفيدة للمجالات التي تتطلب تمثيلات متخصصة ولكنها تفتقر إلى البيانات الكافية لتدريبها من البداية. تبدأ القفازات بالتمثيلات مسبقة الصنع للأغراض العامة وتضبطها على مجال متخصص “، كما أنها متوافقة مع Numpy و TensorFlow.

ممتاز! الآن بعد أن قمنا بتحويل كلماتنا إلى متجهات عددية وقمنا بتعيينها في مساحة ، إذا استخدمنا التضمين الذي يعمل فقط للكلمات وليس النصوص الكاملة ، فقد حان الوقت للعودة إلى الجمل: تذكر هدفنا الأصلي؟ لا نريد فقط تعيين الكلمات ، ولكن نحاول تجميع النصوص أو الجمل الموجودة فيها.

هناك العديد من الطرق للقيام بذلك وقد يعمل بعضها بشكل أفضل من البعض الآخر ، اعتمادًا على السياق. ربما يكون أسهلها ، وهو فعال أيضًا بالنسبة للنص القصير ، هو متوسط ​​تضمين كل كلمة في النص لإنشاء تضمين النص بأكمله.

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

مثال كود Tf-Idf في Python باستخدام sklearn

من sklearn.feature_extraction.text استيراد TfidfVectorizer corpus = [
‘Digitiamo is a Startup from Italy’,
‘Digitiamo is specialized in NLP in Italy’,
‘Italy is not a Startup’
]
vectorizer = TfidfVectorizer () X = vectorizer.fit_transform (corpus) print (vectorizer.get_feature_names ())
print (X.shape) # الإخراج:
# [‘digitiamo’, ‘from’, ‘in’, ‘is’, ‘italy’, ‘nlp’, ‘not’, ‘specialized’, ‘startup’]
# (3، 9) # get_feature_names تسترجع قاموس الكلمات ، بينما X.shape # هو 3×9: 3 مستندات ، 9 كلمات مختلفة. تم إيقاف كلمة “أ”.

استخدام GloVe في Python (المصدر)

بمجرد تنزيل تضمين GloVe من المصدر الرسمي ، يمكنك استخدامه كما هو موضح أدناه (اعتمادات لـ Karishma Malkan)

استيراد numpy كـ np

def loadGloveModel (ملف):
طباعة (“تحميل نموذج القفاز”)
f = open (File، ‘r’)
gloveModel = {}
للخط في و:
SplitLines = line.split ()
كلمة = SplitLines[0]
wordEmbedding = np.array ([float(value) for value in splitLines[1:]])
قفاز[word] = wordEmbedding
print (len (gloveModel) ، “تم تحميل الكلمات!”)
قفاز العودة

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

قفاز الطباعة[‘hello’]

بدلاً من ذلك ، يمكنك تحميل الملف باستخدام الباندا كما هو موضح أدناه (الائتمان إلى Petter)

استيراد الباندا كما pd
استيراد كلمات csv = pd.read_table (glove_data_file، sep = “” ، index_col = 0 ، الرأس = بلا ، الاقتباس = csv.QUOTE_NONE)

ثم للحصول على المتجه لكلمة:

def vec (ث):
إرجاع الكلمات[w].as_matrix ()

ولإيجاد أقرب كلمة إلى المتجه:

Words_matrix = Words.as_matrix ()

def find_closest_word (v):
فرق = Words_matrix – v
دلتا = np.sum (فرق * فرق ، محور = 1)
أنا = np.argmin (دلتا)
عودة الكلمات[i].اسم

يمكن أيضًا فتح الملف باستخدام الجنس كما هو موضح أدناه (اعتمادات لـ Ben) ، ربما تكون أفضل طريقة لأنها تتوافق مع الطرق الأخرى التي رأيناها من قبل في هذه المقالة وتسمح لك باستخدام طرق gensim word2vec (على سبيل المثال ، التشابه)

استخدم glove2word2vec لتحويل متجهات GloVe بتنسيق نصي إلى تنسيق نص word2vec:

من gensim.scripts.glove2word2vec استيراد glove2word2vec
glove2word2vec (glove_input_file = “vectors.txt” ، word2vec_output_file = “gensim_glove_vectors.txt”)

أخيرًا ، اقرأ word2vec txt إلى نموذج gensim باستخدام KeyedVectors:

من gensim.models.keyedvectors استيراد KeyedVectors
glove_model = KeyedVectors.load_word2vec_format (“gensim_glove_vectors.txt” ، ثنائي = خطأ)

حساب متوسط ​​الزخارف بالكلمات للحصول على حفلات الزفاف النصية

إعادة الاستيراد
من gensim.models استيراد نص Word2Vec = ‘Digitiamo هي شركة ناشئة من إيطاليا’ tokenized_text = nltk.word_tokenize (text) model = Word2Vec ([tokenized_text]، min_count = 1) modelledText = []
للكلمة في text.split ():
كلمة = re.sub (ص ‘[^ws]’،”،كلمة)
# إزالة علامات الترقيم
modelledText.append (نموذج[word]) embedText = sum (modelledText) / len (modelledText)
# الزواجات نواقل لذلك يمكن اضافة وتقسيم الطباعة (embedText)

الآن وقد حصلنا أخيرًا على تضمين نصوصنا ، يمكننا تجميعها كما لو كانت مدخلات بيانات رقمية عادية!

لمعرفة المزيد حول بعض تقنيات المجموعات المتاحة ، اقرأ الجزء الثاني من هذه المقالة ، والمتوفر قريبًا! إذا كنت تريد أن يتم إعلامك عند نشرها ، فقم بالاشتراك في النشرة الإخبارية لدينا عن طريق تحريك الأداة أدناه (تمامًا مثل فتح iPhone)

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

حول Digitiamo

Digitiamo هي شركة ناشئة من إيطاليا تركز على استخدام الذكاء الاصطناعي لمساعدة الشركات على إدارة معارفهم والاستفادة منها. لمعرفة المزيد ، تفضل بزيارتنا.

عن المؤلفين


تم نشر Natural Language Clustering – الجزء 1 في الأصل في Towards AI on Medium ، حيث يواصل الأشخاص المحادثة من خلال تسليط الضوء على هذه القصة والرد عليها.

تم النشر عبر نحو الذكاء الاصطناعي