سؤال

أنا أبحث عن فئة Java بسيطة يمكنها حساب حساب TF-IDF. أريد أن أجري اختبار التشابه على وثائق 2. لقد وجدت الكثير من واجهة برمجة التطبيقات الكبيرة التي استخدمت فئة TF-IDF. لا أريد استخدام ملف جرة كبير ، فقط لإجراء اختباري البسيط. الرجاء المساعدة! أو أطلس إذا كان يمكن لأحد أن يخبرني كيف يجد TF؟ و IDF؟ سأقوم بحساب النتائج :) أو إذا كنت تستطيع أن تخبرني ببعض البرنامج التعليمي الجيد Java لهذا الغرض. من فضلك لا تخبرني عن البحث عن Google ، لقد فعلت ذلك بالفعل لمدة 3 أيام ولم أتمكن من العثور على أي شيء :( من فضلك أيضًا لا تحيلني إلى Lucene :(

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

المحلول

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

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

إذا لم يكن واضحًا من هذه الإجابة ، فهناك TF لكل مصطلح لكل مستند ، و IDF لكل مصطلح.

ثم TF-IDF (المصطلح ، المستند) = TF (المصطلح ، المستند) * IDF (المصطلح)

أخيرًا ، يمكنك استخدام نموذج مساحة المتجه لمقارنة المستندات ، حيث يكون كل مصطلح بعدًا جديدًا و "طول" جزء المتجه الذي يشير إلى هذا البعد هو حساب TF-IDF. كل مستند هو متجه ، لذا احسب المتجهين ثم حساب المسافة بينهما.

لذلك للقيام بذلك في Java ، اقرأ الملف في سطر واحد في وقت واحد مع قائد fileReader أو شيء ما ، وتقسيمه على المساحات أو أي محددات أخرى تريد استخدامها - كل كلمة مصطلح. عد عدد مرات يظهر كل مصطلح في كل ملف ، ويظهر عدد الملفات في كل مصطلح. ثم لديك كل ما تحتاجه للقيام بالحسابات المذكورة أعلاه.

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

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)

لهذا الغرض ، X1 هو TF-IDF للمصطلح X في المستند 1.

تحرير: ردًا على سؤالك حول كيفية حساب الكلمات في المستند:

  1. اقرأ الملف في سطر سطر مع قارئ ، مثل new BufferedReader(new FileReader(filename)) - تستطيع الاتصال BufferedReader.readLine() في حلقة من حين لآخر ، التحقق من فارغة في كل مرة.
  2. لكل سطر ، اتصل line.split("\\s") - سيؤدي ذلك إلى تقسيم خطك على المسافة البيضاء ويمنحك مجموعة من جميع الكلمات.
  3. لكل كلمة ، أضف 1 إلى عدد الكلمة للمستند الحالي. يمكن القيام بذلك باستخدام أ HashMap.

الآن ، بعد حساب D لكل مستند ، سيكون لديك قيم X حيث X هي عدد المستندات. لمقارنة جميع المستندات ضد بعضها البعض هو إجراء مقارنات X^2 فقط - لا ينبغي أن يستغرق هذا وقتًا طويلاً بشكل خاص مقابل 10000. تذكر أن المستندتين أكثر تشابهًا إذا كانت القيمة المطلقة للفرق بين قيم D أقل. لذا ، يمكنك بعد ذلك حساب الفرق بين DS لكل زوج من المستندات وتخزينه في قائمة انتظار ذات أولوية أو بنية فرعية أخرى بحيث تتقاطع المستندات الأكثر تشابهًا إلى الأعلى. منطقي؟

نصائح أخرى

agazerboy ، منشور مدونة Sujit Pal يعطي وصفًا دقيقًا لحساب TF و IDF. نتائج التحقق من WRT ، أقترح عليك أن تبدأ بمجموعة صغيرة (على سبيل المثال 100 وثيقة) حتى تتمكن من رؤية ما إذا كنت على صواب. بالنسبة لـ 10000 وثيقة ، يبدأ استخدام Lucene في أن يبدو كخيار عقلاني حقًا.

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

          TF = sqrt(freq)

و

          IDF = log(numDocs/(docFreq+1)) + 1.

يتم استخدام وظائف السجل و SQRT لترطب القيم الفعلية. يمكن أن يؤدي استخدام القيم الخام إلى تشويه النتائج بشكل كبير.

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