سؤال

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

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

كيف ؟

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

المحلول

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

وشيء من هذا القبيل لوسين هو الطريق للذهاب. كنت مؤشر جميع المستندات الخاصة بك، وبعد ذلك عندما كنت تريد أن تجد وثائق مماثلة إلى وثيقة معينة، تقوم بدورها المستند نظرا إلى استعلام والبحث في الفهرس. داخليا لوسين سوف تستخدم TF-الجيش الإسرائيلي و<لأ href = "HTTP: // en.wikipedia.org/wiki/Inverted_index "يختلط =" noreferrer "> مؤشر مقلوب لجعل العملية برمتها تأخذ مبلغ من الوقت يتناسب مع عدد من الوثائق التي يمكن أن تتطابق، وليس العدد الكلي للوثائق المجموعة.

نصائح أخرى

وهذا يعتمد على تعريفك للمماثلة.

href="http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html" تحرير لمسافات الخوارزمية الخوارزمية القياسية ل(اللغة اللاتينية) اقتراحات القاموس، ويمكن أن تعمل على النصوص الكاملة. نصين هي مماثلة إذا كان لديهم أساسا نفس الكلمات (إيه الرسائل) في نفس الترتيب. ذلك ما يلي نصيحتان الكتاب سيكون مماثلة وإلى حد ما:

1) "هذا هو كتاب عظيم"

2) "هذه ليست الكتب العظيمة"

و(عدد من الرسائل إلى إزالة، إدراج، حذف أو تغيير لتحويل (2) في وصفه لل"تحرير المسافة" (1)).

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

وثمة نهج آخر هو أن نفهم شيئا من هيكل لغات (اللاتينية). إذا كنت الشريط القصير (غير capitialised أو نقل) الكلمات، وتعيين الأوزان إلى الكلمات (أو البادئات) التي هي مشتركة أو فريدة من نوعها، يمكنك القيام المقارنة Bayesianesque. قد simiplied اثنين التالية مراجعات الكتب، وجدت لتكون مماثلة:

و3) "وكانت الثورة الفرنسية بلاه بلاه بلاه الحرب والسلام بلاه فرنسا." -> فرنسا / الفرنسية (2) الثورة (1) الحرب (1) السلام (1) (لاحظ أن القاموس قد استخدمت في الجمع بين فرنسا والفرنسية)

و4) "هذا الكتاب هو بلاه بلاه ثورة في المطبخ الفرنسي." -> فرنسا (1) الثورة (1)

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

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

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

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

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

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

وكذلك الحال بالنسبة للمقارنة فقط على العنوان، وليس على النص الأساسي للقضية، وذلك فقط على بدلا سلاسل قصيرة.

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

والتثنية على اقتراح لوسين للنص الكامل، ولكن لاحظ أن جافا ليس شرطا. ميناء. NET هو متاح . انظر أيضا الرئيسي لوسين الصفحة للحصول على روابط لمشاريع أخرى، بما في ذلك <وأ href = "HTTP: // لوسين .apache.org / لوسي / "يختلط =" نوفولو noreferrer "> لوسي، وهو ميناء C .

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

للأسف أنا لا أعرف من أي الأدوات التي تسمح لك أن تفعل ذلك (على الرغم من أنني سأكون مهتما في العثور على واحدة)

ويمكنك استخدام مؤشر النص الكامل SQL Server إلى الحصول على المقارنة الذكية، وأعتقد أن SO تستخدم مكالمة اياكس، أن يقوم الاستعلام للعودة إلى أسئلة مشابهة.

ما هي التكنولوجيات الذي تستخدمه؟

إذا كنت تبحث عن الكلمات التي الجرح على حد سواء، هل يمكن أن تتحول إلى SOUNDEX والكلمات SOUNDEX لمباراة ... عملت بالنسبة لي

وحاولت بعض الطرق ولكن لا شيء يعمل well.One قد تحصل نتيجة ساتيفيد نسبيا مثل هذا:    أولا: الحصول على مدونة جوجل SimHash لكل فقرة من كل نص وتخزينها في زرع قاعدة البيانات.    ثانيا: مؤشر لرمز SimHash.    ثالثا: معالجة النص يمكن مقارنتها على النحو الوارد أعلاه، والحصول على كود SimHash والبحث في جميع النص عن طريق مؤشر SimHash التي تشكل بعيدا مسافة المبالغة مثل 5-10. ثم قارن simility مع ناقلات المدى.   وهذا قد يعمل للبيانات الكبيرة.

ويمكنك استخدام إما 1) Minhash / LSH https://en.wikipedia.org/wiki/MinHash

و(انظر أيضا: http://infolab.stanford.edu/~ullman/ MMDS / book.pdf )

أو

2) تصفية التعاونية: https://en.wikipedia.org/wiki/Collaborative_filtering

الرابط في @alex77 الجواب النقاط على سورنسن-النرد معامل الذي كان بشكل مستقل اكتشافها من قبل المؤلف من هذه المادة - المادة هو مكتوب بشكل جيد جدا و تستحق القراءة.

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

  • الرسالة ثلاثة أزواج كلمة التي تحتوي على واحد إملائيا مثل [and,amd] و
  • الرسالة ثلاثة أزواج الكلمة التي الجناس مثل [and,dan]

في الحالة الأولى الزهر خطأ تقارير معامل صفر بينما في الحالة الثانية فإن معامل يتحول كما 0.5 وهو مضلل عالية.

تحسن وقد اقترح والتي في جوهرها تتكون من أخذ أول و آخر حرف من كلمة وخلق إضافية bigram.

في رأيي تحسين هو حقا فقط مطلوب 3 كلمات الرسالة في كلمات أطول أخرى bigrams يكون التخزين المؤقت التأثير الذي يغطي المشكلة.قانون بلدي التي تطبق هذا التحسن هو أدناه.

function wordPairCount(word)
{
 var i,rslt = [],len = word.length - 1;
 for(i=0;i < len;i++) rslt.push(word.substr(i,2));
 if (2 == len) rslt.push(word[0] + word[len]);
 return rslt;
}

function pairCount(arr)
{
 var i,rslt = [];
 arr = arr.toLowerCase().split(' ');
 for(i=0;i < arr.length;i++) rslt = rslt.concat(wordPairCount(arr[i]));
 return rslt;
}

function commonCount(a,b)
{
 var t;
 if (b.length > a.length) t = b, b = a, a = t; 
 t = a.filter(function (e){return b.indexOf(e) > -1;});
 return t.length;
}

function myDice(a,b)
{
 var bigrams = [],
 aPairs = pairCount(a),
 bPairs = pairCount(b);
 debugger;
 var isct = commonCount(aPairs,bPairs);
 return 2*commonCount(aPairs,bPairs)/(aPairs.length + bPairs.length); 
}

$('#rslt1').text(myDice('WEB Applications','PHP Web Application'));
$('#rslt2').text(myDice('And','Dan'));
$('#rslt3').text(myDice('and','aMd'));
$('#rslt4').text(myDice('abracadabra','abracabadra'));
*{font-family:arial;}
table
{
 width:80%;
 margin:auto;
 border:1px solid silver;
}

thead > tr > td
{
 font-weight:bold;
 text-align:center;
 background-color:aqua;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<table>
<thead>
<tr>
<td>Phrase 1</td>
<td>Phrase 2</td>
<td>Dice</td>
</tr>
<thead>
<tbody>
<tr>
<td>WEB Applications</td>
<td>PHP Web Application</td>
<td id='rslt1'></td>
</tr>
<tr>
<td>And</td>
<td>Dan</td>
<td id='rslt2'></td>
</tr>
<tr>
<td>and</td>
<td>aMd</td>
<td id='rslt3'></td>
</tr>
<tr>
<td>abracadabra</td>
<td>abracabadra</td>
<td id='rslt4'></td>
</tr>
</tbody>
</table>

ملاحظة المتعمد إملائيا في المثال الأخير:abracadabra مقابل abracaبدرة.على الرغم من عدم إضافية bigram يتم تطبيق تصحيح معامل ذكرت هو 0.9.مع تصحيح كان 0.91.

نأمل أن هذا سوف يساعد الآخرين في هذا الموضوع.

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

وهنا هي خوارزمية أساسية هي:

class Statistics {
  std::unordered_map<std::string, int64_t> _counts;
  int64_t _totWords;

  void process(std::string& token);
public:
  explicit Statistics(const std::string& text);

  double Dist(const Statistics& fellow) const;

  bool IsEmpty() const { return _totWords == 0; }
};

namespace {
  const std::string gPunctStr = ".,;:!?";
  const std::unordered_set<char> gPunctSet(gPunctStr.begin(), gPunctStr.end());
}

Statistics::Statistics(const std::string& text) {
  std::string lastToken;
  for (size_t i = 0; i < text.size(); i++) {
    int ch = static_cast<uint8_t>(text[i]);
    if (!isspace(ch)) {
      lastToken.push_back(tolower(ch));
      continue;
    }
    process(lastToken);
  }
  process(lastToken);
}

void Statistics::process(std::string& token) {
  do {
    if (token.size() == 0) {
      break;
    }
    if (gPunctSet.find(token.back()) != gPunctSet.end()) {
      token.pop_back();
    }
  } while (false);
  if (token.size() != 0) {
    auto it = _counts.find(token);
    if (it == _counts.end()) {
      _counts.emplace(token, 1);
    }
    else {
      it->second++;
    }
    _totWords++;
    token.clear();
  }
}

double Statistics::Dist(const Statistics& fellow) const {
  double sum = 0;
  for (const auto& wordInfo : _counts) {
    const std::string wordText = wordInfo.first;
    const double freq = double(wordInfo.second) / _totWords;
    auto it = fellow._counts.find(wordText);
    double fellowFreq;
    if (it == fellow._counts.end()) {
      fellowFreq = 0;
    }
    else {
      fellowFreq = double(it->second) / fellow._totWords;
    }
    const double d = freq - fellowFreq;
    sum += d * d;
  }
  return std::sqrt(sum);
}

والطريقة أبسط وأسرع مقارنة التشابه بين الملخصات وربما من خلال الاستفادة من مفهوم مجموعة. أولا تحويل النصوص المجردة إلى مجموعة من الكلمات. ثم تأكد من مدى التداخل كل مجموعة. وتأتي ميزة بايثون وضع اليد جدا تنفيذ هذه المهمة. سوف يفاجأ لمعرفة مدى يقارن هذا الأسلوب لتلك "الأوراق مماثلة / ذات الصلة" الخيارات هناك تقدمها GScholar، ADS، WOS أو المكبر.

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