English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعلم خوارزميات استخراج ميزات النص وتحويلها إلى مقياس

يشارك هذا المقال رموز الشيفرة الخاصة باستخراج الخصائص النصية وتحويلها إلى نماذج باستخدام Python، للاستفادة منها.

افترض أننا看完 فيلم نولان الكبير "Interstellar"، فكيف يمكن للآلة تحليل تقييمات الجمهور للفيلم بأنه "مثالي" (positive) أو "سيء" (negative)؟

هذا النوع من المشاكل ينتمي إلى تحليل المشاعر. الخطوة الأولى في معالجة هذه المشاكل هي تحويل النصوص إلى خصائص.

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

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

1. إعداد البيانات

يدعم مكتبة sklearn.datasets في Python قراءة جميع النصوص المعدة مسبقًا من الدليل. ومع ذلك، يجب أن يكون الدليل منظمًا بشكل معين حيث يكون كل مجلد بعنوان علامة. على سبيل المثال، تتكون مجموعة البيانات التي يستخدمها هذا المقال من علامتين، واحدة هي "net" والأخرى هي "pos"، ويكون هناك 6 ملفات نصية تحت كل مجلد. يظهر الدليل كما يلي:

neg
    1.txt
    2.txt
    ......
pos
    1.txt
    2.txt
    ....

تم جمع محتويات 12 ملفًا كما يلي:

neg: 
  shit. 
  waste my money. 
  waste of money. 
  sb movie. 
  waste of time. 
  a shit movie. 
pos: 
  nb! nb movie! 
  nb! 
  worth my money. 
  I love this movie! 
  a nb movie. 
  worth it! 

2. خصائص النص

كيف يمكن استخراج الموقف العاطفي من هذه النصوص الإنجليزية وتصنيفها؟

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

بالطبع، مجموعة البيانات المذكورة أعلاه تم تصميمها ببساطة لسهولة التوصيف. في الواقع، يمكن أن يكون لدي الكلمة نفسها موقف غير واضح. ولكن لا يزال هناك سبب يبرر الاعتقاد بأن كلما زاد عدد المرات التي يظهر فيها الكلمة في الفئة neg، كلما زادت فرصتها في التعبير عن الموقف السلبي.
كما لاحظنا أن بعض الكلمات ليست ذات معنى بالنسبة لتقسيم المشاعر. على سبيل المثال، في البيانات المذكورة أعلاه، كلمة "of" و "I" وغيرها. هذه الكلمات لها اسم، وهوStop_Word)(الكلمات المرفوضة). هذه الكلمات يمكن تجاهلها تمامًا عند إجراء الإحصاء. من الواضح أن تجاهل هذه الكلمات يمكن تحسين مساحة التخزين لسجلات التردد، ويمكن تحسين سرعة بناء النموذج أيضًا.
تعد كلمة كل كلمة كنقطة هامة في النموذج، ولكن هناك مشكلة. على سبيل المثال، في البيانات المذكورة أعلاه، كلمة "movie" تظهر 5 مرات في 12 عينة، ولكن تردد المرات في الجانبين الإيجابي والسالب تقريبًا متساوي، مما لا يوجد فيه فرق كبير. بينما كلمة "worth" تظهر 2 مرة فقط، ولكنها تظهر فقط في الفئة الإيجابية، مما يعني أن لديها عاطفة قوية، أي أن لديها فرقًا كبيرًا.

لذلك، نحتاج إلى إدخالTF-IDF(Term Frequency-Inverse Document Frequency،تردد الكلمة و التناسب العكسي للملفاتنقوم بمراجعة كل كلمة.

TF (تردد الكلمة)حسابها بسيط جدًا، وهو حساب تردد كلمة معينة في وثيقة معينة. على سبيل المثال، في وثيقة "I love this movie"، تردد كلمة "love" هو 1/4. إذا تم إزالة الكلمات المرفوضة "I" و "it"، فإن التردد يصبح 1/2.

IDF (التناسب العكسي للملفات)يعني، بالنسبة لكلمة t معينة، أي وثيقة تحتوي على هذه الكلمة، تمثل نسبة Dt إلى عدد الوثائق D، ثم نحسب الناتج الطبيعي.
على سبيل المثال، كلمة "movie" تظهر 5 مرات، بينما مجموع عدد الوثائق هو 12، لذا IDF = ln(5/12).
من الواضح، أن IDF مصمم لجعل الكلمات التي تظهر نادرًا ولكنها تحتوي على عاطفة قوية تبرز. على سبيل المثال، كلمة "movie" لها IDF = ln(12/5) = 0.88، وهو أقل بكثير من IDF لـ "love" = ln(12/1) = 2.48.

TF-IDFببساطة ضع النوعين معًا. بهذه الطريقة، يمكننا حساب TF-IDF لكل كلمة في كل وثيقة، وهي النتائج التي نحصل عليها من النصوص.

3- تحويل نماذج فيزيائية

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

# -*- coding: utf-8 -*- 
استيراد مكتبة scipy كـ sp 
استيراد مكتبة numpy كـ np 
من مكتبة sklearn.datasets، استيراد مكتبة load_files 
من مكتبة sklearn.cross_validation، استيراد مكتبة train_test_split 
من مكتبة sklearn.feature_extraction.text، استيراد مكتبة TfidfVectorizer 
'''''تحميل مجموعة البيانات، تقسيم مجموعة البيانات 80% تدريب، 20% اختبار''' 
movie_reviews = load_files('endata')  
doc_terms_train, doc_terms_test, y_train, y_test\ 
  = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) 
'''''نموذج مجال الكلمات الحقيقي مع ميزات BOOL، يرجى الانتباه، يتم استدعاء واجهة transform للنماذج الاختبارية''' 
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ 
              stop_words = 'english') 
x_train = count_vec.fit_transform(doc_terms_train) 
x_test = count_vec.transform(doc_terms_test) 
x    = count_vec.transform(movie_reviews.data) 
y    = movie_reviews.target 
print(doc_terms_train) 
print(count_vec.get_feature_names()) 
print(x_train.toarray()) 
print(movie_reviews.target) 

النتيجة التشغيلية كالتالي:
[b'هدر الوقت.', b'فيلم قذر.', b'فيلم نايب.', b'أحب هذا الفيلم!', b'قذر.', b'جدير بالمال.', b'فيلم سب.', b'جدير بالاهتمام!']
['حب', 'المال', 'الفيلم', 'نايب', 'سب', 'قذر', 'الوقت', 'هدر الوقت', 'جدير بالاهتمام']
[[ 0.          0.          0.          0.          0.          0.   0.70710678  0.70710678  0.        ]]
 [ 0.          0.          0.60335753 0.          0.          0.79747081 0.          0.          0.        ]
 [ 0.          0.          0.53550237 0.84453372 0.          0.          0.   0.          0.        ]
 [ 0.84453372 0.          0.53550237 0.          0.          0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          1.          0.   0.          0.        ]
 [ 0.76642984 0.          0.          0.          0.          0.   0.          0.64232803]
 [ 0.          0.          0.53550237 0.          0.84453372 0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.   0.          1.        ]]
[1 1 0 1 0 1 0 1 1 0 0 0]

النصوص التي تخرجها python غير منظمة. لقد قمت بإنشاء جدول كما يلي:

من الجدول السابق يمكن ملاحظة النقاط التالية:

1、تصفية الكلمات غير المهمة.

عند إعداد count_vec، قمنا بمرور stop_words = 'english' في بناء count_vec، مما يعني استخدام الكلمات غير المهمة الإنجليزية الافتراضية. يمكنك استخدام count_vec.get_stop_words() لرؤية الكلمات غير المهمة المدمجة في TfidfVectorizer. بالطبع، يمكنك أيضًا إرسال قائمة الكلمات غير المهمة الخاصة بك (مثل 'movie')

2、حساب TF-IDF.

يستخدم حساب التردد هنا TfidfVectorizer من sklearn. هذه الفئة تنحدر من CountVectorizer، وتضيف ميزات مثل TF-IDF إلى الإحصاءات الأساسية للتردد الكلمات.
سنرى أن النتيجة التي تم حسابها هنا مختلفة قليلاً عن النتيجة التي تم حسابها من قبل. لأن count_vec تم بناؤه بشكل افتراضي مع max_df=1، لذا تمت معالجة TF-IDF لتنظيم القيم بين [0،1].

نتيجة count_vec.fit_transform هي مصفوفة ضخمة. يمكننا رؤية العديد من الصفر في الجدول أعلاه، لذا استخدم sklearn مصفوفات متفرقة في التنفيذ الداخلي. على الرغم من أن حجم البيانات في هذا المثال صغير. إذا كان لديك اهتمام، يمكنك تجربة بيانات حقيقية يستخدمها باحثو التعلم الآلي، من جامعة كورنيل:http://www.cs.cornell.edu/people/pabo/movie-review-data/هذا الموقع يقدم العديد من مجموعات البيانات، من بينها قاعدة بيانات بحجم حوالي 2M، حوالي 700 مثال وعدم مثال. لا يعتبر هذا الحجم كبيرًا، يمكن تشغيله في غضون دقيقة واحدة، يُنصح بتجربته. ولكن يجب الانتباه إلى أن هذه مجموعات البيانات قد تحتوي على أحرف غير قانونية. لذا تم تمرير decode_error = 'ignore' في بناء count_vec لتجاهل هذه الأحرف غير القانونية.

نتيجة الجدول أعلاه هي نتيجة 8 ميزات لـ 8 عينات. يمكن استخدام هذا النتيجة لفئات مختلفة من خوارزميات التصنيف.

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعد في تعلمكم، ونأمل أيضًا أن تدعموا وتصرخوا لتعليمات.

بيان: محتوى هذا المقال تم جمعه من الإنترنت، يحق لصاحب الحقوق أن يتحكم فيه، تم جمع المحتوى من قبل المستخدمين على الإنترنت ويتم تحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وقدم الدليل على هذا الأمر، إذا تم التحقق من ذلك، فإن هذا الموقع سيزيل المحتوى المزعوم عن انتهاك حقوق النسخ فورًا.

مفضل لك