استخدام النص والمعالم الرقمية المستخرجة في مشكلة تصنيف التعليقات





كيف تبدو البيانات؟



أولاً ، دعنا نلقي نظرة على بيانات الاختبار والتدريب المتاحة (بيانات من تحدي تصنيف التعليقات السامة على منصة kaggle.com). في بيانات التدريب ، على عكس بيانات الاختبار ، توجد تسميات للتصنيف:





الشكل 1 - رأس بيانات التدريب



من الجدول يمكنك أن ترى أن لدينا 6 أعمدة تسمية في بيانات التدريب ("سامة" ، "شديدة السمية" ، "فاحشة" ، "تهديد" ، "إهانة" ، "هوية_رات") ، حيث تشير القيمة "1" إلى أن التعليق ينتمي إلى الفئة ، يوجد أيضًا عمود "comment_text" يحتوي على التعليق وعمود "معرف" - معرف التعليق.



لا تحتوي بيانات الاختبار على تسميات فئة ، حيث يتم استخدامها لإرسال الحل:





الشكل 2 - اختبار رأس البيانات



ميزة استخراج



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





الشكل 3 - أفضل 10 أنواع من التعليقات السامة



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



لنرى أيضًا كيف يتم توزيع عدد الأنواع لكل تعليق:





الشكل 4 - عدد الأنواع التي تمت مواجهتها



لاحظ أن الوضع السائد هو عندما يتميز التعليق بنوع واحد فقط من السمية ؛ أيضًا ، في كثير من الأحيان ، يتميز التعليق بثلاثة أنواع من السمية ، وفي كثير من الأحيان يُنسب التعليق إلى جميع الأنواع.



الآن دعنا ننتقل إلى مرحلة استخراج الميزات من النص ، والتي تسمى غالبًا استخراج الميزات. لقد استخرجت السمات التالية:



طول التعليق. أعتقد أن التعليقات الغاضبة ستكون قصيرة على الأرجح.

الأحرف الكبيرة. في التعليقات العاطفية العدوانية ، من الممكن أن تكون الأحرف الكبيرة أكثر شيوعًا في الكلمات ؛

الرموز الانفعالية. عند كتابة تعليق سام ، من غير المحتمل استخدام الرموز التعبيرية الملونة بشكل إيجابي (:) ، وما إلى ذلك ، فإننا نعتبر أيضًا وجود رموز حزينة (:( ، وما إلى ذلك) ؛

علامات ترقيم. ربما لا يلتزم مؤلفو التعليقات السلبية بقواعد الترقيم ، فهم يستخدمون في الغالب "!" ؛

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

تمت إضافة الميزات على النحو التالي:



train_data[‘total_length’] = train_data[‘comment_text’].apply(len)
train_data[‘uppercase’] = train_data[‘comment_text’].apply(lambda comment: sum(1 for c in comment if c.isupper()))
train_data[‘exclamation_punction’] = train_data[‘comment_text’].apply(lambda comment: comment.count(‘!’))
train_data[‘num_punctuation’] = train_data[‘comment_text’].apply(lambda comment: comment.count(w) for w in ‘.,;:?’))
train_data[‘num_symbols’] = train_data[‘comment_text’].apply(lambda comment: sum(comment.count(w) for w in ‘*&$%’))
train_data[‘num_words’] = train_data[‘comment_text’].apply(lambda comment: len(comment.split()))
train_data[‘num_happy_smilies’] = train_data[‘comment_text’].apply(lambda comment: sum(comment.count(w) for w in (‘:-)’, ‘:)’, ‘;)’, ‘;-)’)))
train_data[‘num_sad_smilies’] = train_data[‘comment_text’].apply(lambda comment: sum(comment.count(w) for w in (‘:-(’, ‘:(’, ‘;(’, ‘;-(’)))


تحليل البيانات استكشافية



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





الشكل 5 - الارتباط



الارتباط يشير إلى وجود علاقة خطية بين السمات. كلما كانت قيمة الارتباط في المعامل أقرب إلى 1 ، زاد وضوح الاعتماد الخطي بين العناصر.



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



بعد ذلك ، سنبني العديد من التصورات لفهم أكثر تفصيلاً لتأثير الميزات على ملصق الفصل. أولاً ، دعنا نرى كيف يتم توزيع أطوال التعليقات:





الشكل 6 - توزيع أطوال التعليقات (الرسم البياني تفاعلي ، ولكن هنا لقطة شاشة)



كما هو متوقع ، التعليقات التي لم يتم تصنيفها (أي عادية) أطول بكثير من التعليقات ذات العلامات. من بين التعليقات السلبية ، أقصرها هي التهديدات ، والأطول سامة.



الآن دعونا نفحص التعليقات من حيث علامات الترقيم. سنقوم ببناء تمثيلات رسومية للقيم المتوسطة لجعل الرسوم البيانية أكثر قابلية للتفسير:





الشكل 7 - متوسط ​​قيم علامات الترقيم (الرسم البياني تفاعلي ، ولكن هنا لقطة شاشة)



من الشكل يمكنك أن ترى أننا حصلنا على ثلاث مجموعات.



الأول هو التعليقات العادية ، وتتميز بالالتزام بقواعد الترقيم (وضع علامات الترقيم ، ":" ، على سبيل المثال) وعدد قليل من علامات التعجب.



والثاني يتكون من التهديدات والتعليقات شديدة السمية (شديدة السمية) ، وتتميز هذه المجموعة بالاستخدام الكثيف لعلامات التعجب وتستخدم علامات الترقيم الأخرى في المستوى المتوسط.



المجموعة الثالثة - سامة (سامة) ، فاحشة (فاحشة) ، إهانات (إهانة) وكراهية تجاه شخص معين (كراهية الهوية) بها عدد قليل من علامات الترقيم وعلامات التعجب.



دعنا نضيف محورًا ثالثًا لمزيد من الوضوح - الحالة الكبيرة:





الشكل 8 - صورة ثلاثية الأبعاد (تفاعلية ، ولكن هذه لقطة شاشة)



هنا نرى موقفًا مشابهًا - تم تمييز ثلاث مجموعات. لاحظ أيضًا أن المسافة بين عناصر المجموعة الثانية أكبر من المسافة بين عناصر المجموعة الثالثة. يمكن ملاحظة ذلك في المؤامرة ثنائية الأبعاد أيضًا:





الشكل 9 - الأحرف الكبيرة وعلامات الترقيم (تفاعلية ، هذه لقطة شاشة)



الآن دعونا نلقي نظرة على أنواع التعليقات في سياق الأحرف الكبيرة / عدد أحرف الطرف الثالث:





الشكل 10 - الأحرف الكبيرة وعدد أحرف الطرف الثالث (تفاعلية ، هذه لقطة شاشة)



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



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



يتم فصل التعليقات شديدة السمية عن البقية ؛

تبرز التعليقات العادية أيضًا ؛

التعليقات السامة والفاحشة والمسيئة قريبة جدًا من بعضها البعض من حيث الخصائص المدروسة.

استخدام DataFrameMapper للجمع بين ميزات النص والرقمية



الآن ، دعنا نلقي نظرة على كيفية استخدام النص والميزات الرقمية معًا في الانحدار اللوجستي.



أولاً ، تحتاج إلى اختيار نموذج لتمثيل النص في شكل مناسب لخوارزميات التعلم الآلي. لقد استخدمت نموذج tf-idf ، حيث يمكنه تمييز كلمات معينة وجعل الكلمات المتكررة أقل أهمية (على سبيل المثال ، حروف الجر):



tvec = TfidfVectorizer(
sublinear_tf=True,
strip_accents=’unicode’,
analyzer=’word’,
token_pattern=r’\w{1,}’,
stop_words=’english’,
ngram_range=(1, 1),
max_features=10000
)


لذلك ، إذا أردنا العمل مع إطار البيانات الذي توفره مكتبة Pandas وخوارزميات التعلم الآلي لمكتبة Sklearn ، فيمكننا استخدام وحدة Sklearn-pandas ، والتي تعمل كنوع من الرابط بين أساليب Dataframe و Sklearn.



mapper = DataFrameMapper([
			([‘uppercase’], StandardScaler()),
			([‘exclamation_punctuation’], StandardScaler()),
			([‘num_punctuation’], StandardScaler()),
			([‘num_symbols’], StandardScaler()),
			([‘num_happy_smilies’], StandardScaler()),
			([‘num_sad_smilies’], StandardScaler()),
			([‘total_length’], StandardScaler())
		], df_out=True)


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



x_train = np.round(mapper.fit_transform(numeric_features_train.copy()), 2).values
x_train_features = sparse.hstack((csr_matrix(x_train), train_texts))


يتم أيضًا تنفيذ تسلسل مماثل من الإجراءات على مجموعة بيانات الاختبار.



تجربة حسابية



لتنفيذ التصنيف متعدد العلامات ، سنقوم ببناء حلقة تمر عبر جميع الفئات وتقييم جودة التصنيف من خلال التحقق من الصحة باستخدام المعلمات cv = 3 والتسجيل = 'roc_auc':



scores = []
class_names = [‘toxic’, ‘severe_toxic’, ‘obscene’, ‘threat’, ‘identity_hate’]
for class_name in class_names:
	train_target = train_data[class_name]
	classifier = LogisticRegression(C=0.1, solver= ‘sag’)
	cv_score = np.mean(cross_val_score(classifier, x_train_features, train_target, cv=3, scoring= ‘auc_roc’))
	scores.append(cv_score)
	print(‘CV score for class {} is {}’.format(class_name, cv_score))
	classifier.fit(train_features, train_target)

print(‘Total CV score is {}’.format(np.mean(scores)))</source
<b> :</b>

<img src="https://habrastorage.org/webt/kt/a4/v6/kta4v6sqnr-tar_auhd6bxzo4dw.png" />
<i> 11 —  </i>

      ,       ,  , ,       ,   .  ,    ,       ,      .    - ,   “toxic”, ,  ,       (  3).         , ,          ,        .



All Articles