ما هي الخوارزميات المحاكمة والصورية لاقتراح مقالات ذات صلة هناك؟

StackOverflow https://stackoverflow.com/questions/1254627

سؤال

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

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

كيف يمكنك الذهاب حول العثور على المستندات ذات الصلة ربما؟

أنا مهتم بالأحرى في الخوارزمية الفعلية، ليست حلولا جاهزة، على الرغم من أنني سأكون على ما يرام عند إلقاء نظرة على شيء ينفذ في Ruby أو Python، أو الاعتماد على MySQL أو PGSQL.

تعديل: الجواب الحالي جيد جدا ولكن أود أن أرى المزيد. ربما بعض رمز مثال عاري حقا لشيء أو اثنين.

هل كانت مفيدة؟

المحلول

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

أبسط نهج يسمى حقيبة الكلمات. وبعد يتم تقليل كل وثيقة إلى متجه متناثر {word: wordcount} أزواج، ويمكنك رمي SafeBayes (أو بعضها البعض) المصنف في مجموعة ناقلات تمثل مجموعة المستندات الخاصة بك، أو حساب درجات التشابه بين كل كيس وكل كيس آخر (يسمى هذا تصنيف جار K-Learner). KNN سريع للبحث، ولكن يتطلب التخزين O (n ^ 2) لمصفوفة النتيجة؛ ومع ذلك، لمدونة، N ليست كبيرة جدا. لشيء ما حجم صحيفة كبيرة، أصبحت KNN بسرعة غير عملي، وبالتالي فإن خوارزمية التصنيف داخل ذبابة في بعض الأحيان أفضل في بعض الأحيان. في هذه الحالة، قد تفكر الترتيب آلة ناقلات الدعم. وبعد SVMS أنيق لأنهم لا يقيدونك إلى تدابير التشابه الخطي، وما زالوا سريعين للغاية.

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

إذا لم تكن إحدى الكتيبات التشابه بشكل جيد بما فيه الكفاية، فيمكنك مجردة من طبقة تشابه حقيبة من N-N-Gram، حيث تقوم بإنشاء المتجه الذي يمثل مستند يستند إلى أزواج أو ثلاث مرات من الكلمات. (يمكنك استخدام TUPLES 4 أو حتى tuples أكبر، ولكن في الممارسة العملية لا يساعد هذا كثيرا. بلسان النحوي. Otoh، ربما لا تحتاج إلى هذا التشابه الدلالي؛ من الأفضل للأشياء مثل الكشف عن الانتحال. تقطيع, أو تقليل وثيقة لأسفل إلى أشجار تحليل خفيفة الوزن، يمكن أيضا استخدامها (هناك خوارزميات تصنيف للأشجار)، ولكن هذا مفيد للأشياء مثل مشكلة التأليف ("بالنظر إلى وثيقة من أصل غير معروف، الذي كتبه؟") وبعد

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

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

هذه جميعها تنطوي على توليد البيانات الوصفية من النص غير المنظم؛ القيام بمقارنات مباشرة بين الكتل الخام من النص غير قابلة للمساعدة، لذلك المستندات المسبقة للأشخاص في البيانات الوصفية أولا.

نصائح أخرى

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

في نهج أكثر عملية وأقل نظرية، أوصي بأن يكون لديك نظرة أ هذه و هذه غيرها أمثلة شفرة كبيرة.

يجب عليك قراءة كتاب "الذكاء الجماعي البرمجة: بناء تطبيقات Web 2.0 الذكية" (ISBN 0596529325)!

بالنسبة لبعض الأسلوب والرمز: اسأل نفسك أولا، سواء كنت ترغب في العثور على أوجه التشابه المباشر بناء على مطابقات Word، أو ما إذا كنت ترغب في إظهار مقالات مماثلة قد لا تتعلق مباشرة بالآخر، ولكنها تنتمي إلى نفس المجموعة من المقالات.

يرى تحليل العنقودية / التجميع التقسيم.

طريقة بسيطة للغاية (ولكن نظرية وبطيئة) للعثور عليها مباشرة تشابه هي:

Preprocess:

  1. تخزين قائمة الكلمات المسطحة لكل مقالة (لا تقم بإزالة الكلمات المكررة).
  2. "عبور انضمام" المقالات: عد عدد الكلمات في المادة أ التي تطابق نفس الكلمات في المادة B. لديك الآن مصفوفة int word_matches[narticles][narticles] (يجب ألا تخزينها من هذا القبيل، تشابه A-> B هي نفس b-> a، لذلك يوفر مصفوفة متناثرة تقريبا نصف الفضاء).
  3. تطبيع الكلمات Word_Matches إلى النطاق 0..1! (ابحث عن عدد أقصى عدد، ثم قم بتقسيم أي عدد من أي عدد) - يجب عليك تخزين العوامات هناك، وليس Ints؛)

العثور على مقالات مماثلة:

  1. حدد مقالات X بأعلى المباريات من Word_Matches

محرك بحث صغير من نوع Vector-الفضاء في Ruby. الفكرة الأساسية هي أن وثائقتين مرتبطة إذا كانت تحتوي على نفس الكلمات. لذلك نحسب حدوث كلمات في كل مستند، ثم حساب جيب التمام بين هذه المخلفات (تحتوي كل شروط على مؤشر ثابت، إذا ظهر هناك 1 في هذا الفهرس، إن لم يكن صفر). سيكون جيب التمام 1.0 إذا كان لديك وثيقتان جميع المصطلحات شائعة، و 0.0 إذا لم يكن لديهم شروط شائعة. يمكنك ترجمة ذلك مباشرة إلى٪٪.

terms = Hash.new{|h,k|h[k]=h.size}
docs = DATA.collect { |line| 
  name = line.match(/^\d+/)
  words = line.downcase.scan(/[a-z]+/)
  vector = [] 
  words.each { |word| vector[terms[word]] = 1 }
  {:name=>name,:vector=>vector}
}
current = docs.first # or any other
docs.sort_by { |doc| 
  # assume we have defined cosine on arrays
  doc[:vector].cosine(current[:vector]) 
}
related = docs[1..5].collect{|doc|doc[:name]}

puts related

__END__
0 Human machine interface for Lab ABC computer applications
1 A survey of user opinion of computer system response time
2 The EPS user interface management system
3 System and human system engineering testing of EPS
4 Relation of user-perceived response time to error measurement
5 The generation of random, binary, unordered trees
6 The intersection graph of paths in trees
7 Graph minors IV: Widths of trees and well-quasi-ordering
8 Graph minors: A survey

تعريف Array#cosine يترك بمثابة تمرين للقارئ (يجب أن يتعامل مع قيم NIL وأطوال مختلفة، ولكن جيدا لذلك وصلنا Array#zip الصحيح؟)

راجع للشغل، يتم أخذ وثائق المثال من ورق SVD بواسطة Deerwester Etal :)

منذ بعض الوقت قمت بتنفيذ شيء مماثل. ربما تكون هذه الفكرة قديمة الآن، لكنني آمل أن تساعد.

أجرت موقع ASP 3.0 على شبكة الإنترنت لبرمجة المهام الشائعة وبدأت من هذا المبدأ: لدى المستخدم شك وسيظل على موقع الويب طالما أنه يمكنه العثور على محتوى مثير للاهتمام حول هذا الموضوع.

عندما وصل المستخدم، بدأت ASP 3.0 Session كائن وتسجيل جميع ملفات التنقل المستخدم، تماما مثل قائمة مرتبطة. في Session.OnEnd الحدث، وأخذ الرابط الأول، ابحث عن الرابط التالي وزيادة عمود عداد مثل:

<Article Title="Cookie problem A">
    <NextPage Title="Cookie problem B" Count="5" />
    <NextPage Title="Cookie problem C" Count="2" />
</Article>

لذلك، للتحقق من المقالات ذات الصلة، اضطررت إلى قائمة الأعلى ن NextPage الكيانات، التي أمرها عمود مكافحة تنازلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top