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

كيفية بناء نظام التوصية باستخدام TF-IDF وNMF (Python)

ستساعدك المقالة التالية: كيفية بناء نظام التوصية باستخدام TF-IDF وNMF (Python)

يمكن أن تساعد مجموعات المواضيع وأنظمة التوصية خبراء تحسين محركات البحث (SEO) في بناء بنية ربط داخلية قابلة للتطوير.

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

في هذه المقالة، سنستخدم بيانات ويكيبيديا لبناء مجموعات مواضيعية وأنظمة توصية باستخدام أداة تحليل البيانات Python وPandas.

ولتحقيق ذلك، سنستخدم مكتبة Scikit-learn، وهي مكتبة برمجية مجانية لتعلم الآلة لبايثون، مع خوارزميتين رئيسيتين:

  • قوة العمل-جيش الدفاع الإسرائيلي: مصطلح تردد معكوس تردد الوثيقة.
  • نمف: تحليل المصفوفات غير السالبة، وهي عبارة عن مجموعة من الخوارزميات في التحليل متعدد المتغيرات والجبر الخطي التي يمكن استخدامها لتحليل البيانات الأبعاد.

وعلى وجه التحديد، سنقوم بما يلي:

  1. استخراج جميع الروابط من مقالة ويكيبيديا.
  2. قراءة النص من مقالات ويكيبيديا.
  3. إنشاء خريطة TF-IDF.
  4. تقسيم الاستعلامات إلى مجموعات.
  5. بناء نظام التوصية.

فيما يلي مثال لمجموعات المواضيع التي ستتمكن من بنائها:

علاوة على ذلك، إليك نظرة عامة على نظام التوصية الذي يمكنك إعادة إنشائه.

مستعد؟ دعنا نحصل على بعض التعاريف والمفاهيم التي تريد معرفتها أولاً.

الفرق بين مجموعات المواضيع وأنظمة التوصية

يمكن بناء مجموعات المواضيع وأنظمة التوصية بطرق مختلفة.

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

بعبارات SEO بسيطة:

  • مجموعات الموضوع يمكن أن يساعد في إنشاء بنية ترتبط بها جميع المقالات.
  • أنظمة التوصية يمكن أن يساعد في إنشاء بنية ترتبط بها الصفحات الأكثر صلة.

ما هي قوات الدفاع الإسرائيلية؟

TF-IDF، أو مصطلح تردد الوثيقة العكسي، هو رقم يعبر عن الأهمية الإحصائية لأي كلمة معينة لمجموعة المستندات ككل.

يتم حساب TF-IDF بضرب تردد المصطلح وتكرار المستند العكسي.

TF-جيش الدفاع الإسرائيلي = TF * جيش الدفاع الإسرائيلي

  • تف: عدد مرات ظهور الكلمة في المستند/عدد الكلمات في المستند.
  • جيش الدفاع الإسرائيلي: سجل (عدد المستندات / عدد المستندات التي تحتوي على الكلمة).

لتوضيح ذلك، دعونا ننظر في هذا الوضع مع التعلم الالي ككلمة مستهدفة:

  • تحتوي الوثيقة (أ) على الكلمة المستهدفة 10 مرات من أصل 100 كلمة.
  • في المجموعة بأكملها، يحتوي 30 مستندًا من أصل 200 مستندًا أيضًا على الكلمة المستهدفة.

عندها ستكون الصيغة:

قوة العمل-جيش الدفاع الإسرائيلي = (10/100) * سجل (200/30)

ما هو ليس TF-IDF؟

إن قوة العمل التابعة لقوات الدفاع الإسرائيلية ليست شيئاً جديداً. إنه ليس شيئًا تحتاج إلى تحسينه.

وفقًا لجون مولر، فهو مفهوم قديم لاسترجاع المعلومات ولا يستحق التركيز عليه في تحسين محركات البحث.

ليس هناك ما يساعدك على التفوق على منافسيك.

ومع ذلك، يمكن أن يكون TF-IDF مفيدًا لمحركات البحث (SEO).

إن تعلم كيفية عمل TF-IDF يعطي فكرة عن كيفية تفسير الكمبيوتر للغة البشرية.

وبالتالي، يمكن للمرء الاستفادة من هذا الفهم لتحسين مدى ملاءمة المحتوى باستخدام تقنيات مماثلة.

ما هو تحليل المصفوفة غير السالبة (NMF)؟

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

في هذه المقالة، سيتم استخدام NMF لتحديد عدد الموضوعات التي نريد تجميع جميع المقالات تحتها.

تعريف مجموعات الموضوع

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

تعريف أنظمة التوصية

يمكن أن تساعد أنظمة التوصية في إنشاء بنية ترتبط بها الصفحات الأكثر صلة.

بناء مجموعة الموضوع

يمكن بناء مجموعات المواضيع وأنظمة التوصية بطرق مختلفة.

في هذه الحالة، يتم تجميع مجموعات المواضيع حسب أوزان IDF وأنظمة التوصية حسب تشابه جيب التمام.

استخراج جميع الروابط من مقالة محددة في ويكيبيديا

يتم استخراج الروابط الموجودة على صفحة ويكيبيديا في خطوتين.

أولا، حدد موضوعا محددا. في هذه الحالة نستخدم مقالة ويكيبيديا عن التعلم الآلي.

ثانيًا، استخدم واجهة برمجة تطبيقات Wikipedia للعثور على جميع الروابط الداخلية للمقالة.

فيما يلي كيفية الاستعلام عن واجهة برمجة تطبيقات Wikipedia باستخدام مكتبة طلبات Python.

طلبات الاستيراد main_subject = “التعلم الآلي” url = “https://en.wikipedia.org/w/api.php” params = { ‘action’: ‘query’، ‘format’: ‘json’، ‘generator’: ‘links’، ‘titles’: main_subject، ‘prop’:’pageprops’، ‘ppprop’:’wikibase_item’، ‘gpllimit’:1000، ‘redirects’:1 } r = request.get(url, params=params) r_json = r.json() Linked_pages = r_json[‘query’][‘pages’]

page_titles = [p[‘title’] لـ p في Linked_pages.values()]

وأخيرًا، النتيجة هي قائمة بجميع الصفحات المرتبطة بالمقالة الأولية.

تمثل هذه الروابط كلًا من الكيانات المستخدمة لمجموعات المواضيع.

حدد مجموعة فرعية من المقالات

لأغراض الأداء، سنختار فقط أول 200 مقالة (بما في ذلك المقالة الرئيسية حول التعلم الآلي).

# حدد المقالات X الأولى num_articles = 200 صفحة = page_titles[:num_articles]

# تأكد من إبقاء الموضوع الرئيسي في صفحات القائمة += [main_subject]

# تأكد من عدم وجود تكرارات في القائمة pages = list(set(pages))

قراءة النص من مقالات ويكيبيديا

الآن، نحن بحاجة إلى استخراج محتوى كل مقالة لإجراء الحسابات لتحليل TF-IDF.

للقيام بذلك، سنقوم بجلب واجهة برمجة التطبيقات (API) مرة أخرى لكل صفحة من الصفحات المخزنة في متغير الصفحات.

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

Note أنك قد تحتاج إلى تثبيت حزمتي tqdm وlxml لاستخدامهما.

طلبات الاستيراد من lxml استيراد html من tqdm.notebook import tqdm text_db = []
للصفحة في tqdm(pages): Response = request.get( ‘https://en.wikipedia.org/w/api.php’, params={ ‘action’: ‘parse’, ‘page’: page, ‘ التنسيق’: ‘json’، ‘prop’: ‘نص’، ‘عمليات إعادة التوجيه’:” } ).json() Raw_html = استجابة[‘parse’][‘text’][‘*’]

document = html.document_fromstring(raw_html) text=”” لـ p في document.xpath(‘//p’): text += p.text_content() text_db.append(text) print(‘Done’)

سيعرض هذا الاستعلام قائمة يمثل فيها كل عنصر نص صفحة ويكيبيديا المقابلة.

## طباعة عدد المقالات print(‘عدد المقالات المستخرجة:’, len(text_db))

انتاج:

عدد المقالات المستخرجة: 201

وكما نرى، هناك 201 مقالة.

وذلك لأننا أضفنا مقالة “التعلم الآلي” أعلى أفضل 200 رابط من تلك الصفحة.

علاوة على ذلك، يمكننا اختيار المقالة الأولى (الفهرس 0) وقراءة أول 300 حرف للحصول على فهم أفضل.

# قراءة أول 300 حرف من المقالة الأولى text_db[0][:300]

انتاج:

‘\nعلم الأحياء هو الدراسة العلمية للحياة.[1][2][3] إنه علم طبيعي ذو نطاق واسع ولكن لديه العديد من الموضوعات الموحدة التي تربطه معًا كمجال واحد متماسك.[1][2][3] على سبيل المثال، تتكون جميع الكائنات الحية من خلايا تعالج المعلومات الوراثية المشفرة في الجينات، والتي يمكنها ‘

إنشاء خريطة TF-IDF

في هذا القسم سوف نعتمد على pandas و TfidfVectorizer لإنشاء Dataframe يحتوي على الـ bi-grams (كلمتين متتاليتين) لكل مقالة.

هنا، نحن نستخدم TfidfVectorizer.

وهذا يعادل استخدام CountVectorizer متبوعًا بـ TfidfTransformer، والذي قد تراه في البرامج التعليمية الأخرى.

وبالإضافة إلى ذلك، نحن بحاجة إلى إزالة “الضوضاء”. في مجال معالجة اللغات الطبيعية، تسمى كلمات مثل “the” و”a” و”I” و”we” “كلمات التوقف”.

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

وبالتالي، باستخدام nltk، سنضيف قائمة بكلمات التوقف الإنجليزية إلى فئة TfidfVectorizer.

استيراد الباندا كـ pd من sklearn.feature_extraction.text استيراد TfidfVectorizer من nltk.corpus استيراد كلمات الإيقاف

# إنشاء قائمة بكلمات التوقف الإنجليزية stop_words = stopwords.words(‘english’)

# إنشاء مثيل للفئة vec = TfidfVectorizer( stop_words=stop_words, ngram_range=(2,2), # bigrams use_idf=True )

# تدريب النموذج وتحويل البيانات tf_idf = vec.fit_transform(text_db)

# إنشاء الباندا DataFrame df = pd.DataFrame( tf_idf.toarray(), columns=vec.get_feature_names(), Index=pages )

# إظهار الأسطر الأولى من DataFrame df.head()

في DataFrame أعلاه:

  • الصفوف هي المستندات.
  • الأعمدة هي ثنائية الجرام (كلمتين متتاليتين).
  • القيم هي ترددات الكلمة (tf-idf).

فرز ناقلات جيش الدفاع الإسرائيلي

أدناه، نقوم بفرز متجهات تكرار المستند العكسي حسب الصلة.

idf_df = pd.DataFrame( vec.idf_, Index=vec.get_feature_names(), columns=[‘idf_weigths’]
) idf_df.sort_values(by=[‘idf_weigths’]).الرأس(10)

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

كلما كان جيش الدفاع الإسرائيلي أكبر، كلما كان أكثر صلة بالمقالة.

كلما انخفض جيش الدفاع الإسرائيلي، كلما كان أكثر شيوعًا في جميع المقالات.

  • إشارة واحدة من أصل مقالة واحدة = سجل (1/1) = 0.0
  • إشارة واحدة من مقالتين = سجل (2/1) = 0.69
  • إشارة واحدة من أصل 10 مقالات = سجل (10/1) = 2.30
  • إشارة واحدة من 100 مقالة = سجل (100/1) = 4.61

تقسيم الاستعلامات إلى مجموعات باستخدام NMF

باستخدام مصفوفة tf_idf، سنقوم بتقسيم الاستعلامات إلى مجموعات موضعية.

ستحتوي كل مجموعة على غرامات ثنائية وثيقة الصلة.

أولاً، سوف نستخدم NMF لتقليل أبعاد المصفوفة إلى موضوعات.

ببساطة، سنقوم بتجميع 201 مقالة في 25 موضوعًا.

من sklearn.decomposition استيراد NMF من sklearn.preprocessing استيراد تطبيع # (اختياري) تعطيل FutureWarning من Scikit-تعلم من التحذيرات import simplefilter simplefilter(action=’ignore’,category=FutureWarning) # حدد عدد مجموعات المواضيع n_topics = 25 # إنشاء مثيل NMF nmf = NMF(n_components=n_topics) # ملائمة النموذج لـ tf_idf nmf_features = nmf.fit_transform(tf_idf) # تطبيع الميزات norm_features = Normalize(nmf_features)

يمكننا أن نرى أن عدد الصور الكبيرة يظل كما هو، ولكن يتم تجميع المقالات في موضوعات.

# قارن بين إطارات البيانات المعالجة وغير المعالجة print(‘Original df:’, df.shape) print(‘NMF Processed df:’, nmf.components_.shape)

ثانيًا، سنقدم توصيات الاستعلام لكل مجموعة من المجموعات الـ 25.

# إنشاء إطار بيانات متفاوت المسافات لمكونات df المجمعة في NMF = pd.DataFrame( nmf.components_, columns=[df.columns]
) مجموعات = {} # عرض أهم 25 استعلامًا لكل مجموعة لـ i في النطاق(len(components)): المجموعات[i] = []
حلقة = dict(components.loc[i,:].nlargest(25)).items() لـ k,v في الحلقة: المجموعات[i].إلحاق({‘س’:ك[0]،’sim_score’: v})

ثالثاً، سنقوم بإنشاء إطار بيانات يوضح التوصيات.

# قم بإنشاء إطار بيانات باستخدام مجموعة القاموس المجمعة = مجموعة pd.DataFrame(clusters).T[‘topic’] = التجمع[0].تطبيق (لامدا س: س[‘q’]) grouping.drop(0, axis=1, inplace=True) grouping.set_index(‘topic’, inplace=True) def show_queries(df): للعمود في df.columns: df[col] = مدافع[col].تطبيق (لامدا س: س[‘q’]) return df # اعرض الاستعلام في إطار البيانات فقط Clusted_queries = show_queries(grouping)clused_queries.head()

وأخيرًا، النتيجة هي DataFrame الذي يعرض 25 موضوعًا بالإضافة إلى أفضل 25 بيجرام لكل موضوع.

بناء نظام التوصية

الآن، بدلاً من بناء مجموعات المواضيع، سنقوم الآن ببناء نظام توصية باستخدام نفس الميزات التي تمت تسويتها من الخطوة السابقة.

يتم تخزين الميزات التي تمت تسويتها في المتغير norm_features.

# حساب أوجه التشابه في جيب التمام لكل مجموعة بيانات = {} # إنشاء إطار بيانات Norm_df = pd.DataFrame(norm_features, Index=pages) للصفحة في الصفحات: # تحديد توصيات الصفحة توصيات = norm_df.loc[page,:]

# حساب أوجه التشابه في جيب التمام = بيانات norm_df.dot(recommendations).[page] = []
حلقة = dict(similarities.nlargest(20)).items() لـ k، v في الحلقة: إذا k != الصفحة: البيانات[page].append({‘q’:k,’sim_score’: v})

ما يفعله الكود أعلاه هو:

  • حلقات من خلال كل صفحة من الصفحات المحددة في البداية.
  • يحدد الصف المقابل في إطار البيانات الذي تمت تسويته.
  • يحسب تشابه جيب التمام لجميع استعلامات بيغرام.
  • تحديد أفضل 20 استعلامًا مرتبة حسب درجة التشابه.

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

والخطوة التالية هي تحويل هذا القاموس إلى DataFrame.

# تحويل القاموس إلى موصي dataframe = pd.DataFrame(data).T def show_queries(df): للعمود في df.columns: df[col] = مدافع[col].تطبيق (لامدا س: س[‘q’]) إرجاع df show_queries(الموصي).head()

يعرض DataFrame الناتج الاستعلام الأصلي مع المواضيع الموصى بها المصنفة في كل عمود.

هاهو!

لقد انتهينا من بناء نظام التوصيات الخاص بنا ومجموعة المواضيع.

مساهمات مثيرة للاهتمام من مجتمع SEO

أنا من أشد المعجبين بدانييل هيريديا، الذي لعب أيضًا مع قوة العمل التابعة لجيش الدفاع الإسرائيلي العثور على الكلمات ذات الصلة باستخدام TF IDF وtextblob وPython.

يمكن أن تكون دروس بايثون شاقة.

مقال واحد قد لا يكون كافيا.

إذا كان الأمر كذلك، فأنا أشجعك على القراءة البرنامج التعليمي Koray Tuğberk GÜBÜR، والذي يكشف عن طريقة مماثلة لاستخدام TF-IDF.

ابتكر بيلي بوناروس أيضًا تطبيقًا مبتكرًا لـ TF-IDF في بايثون وأظهره كيفية إنشاء أداة بحث الكلمات الرئيسية TF-IDF.

خاتمة

في النهاية، أتمنى أن تكون قد تعلمت منطقًا هنا يمكن تكييفه مع أي موقع ويب.

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

باستخدام Python وScikit-learn، لقد تعلمت كيفية إنشاء برنامج خاص بك – وتعلمت أساسيات TF-IDF وعوامل المصفوفة غير السالبة في هذه العملية.

المزيد من الموارد: