سؤال

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

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

  • يمكنني استخدام asp.net و sql server 2005 مع FTS (fullTextSearch)

شكرا لك

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

المحلول

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

واحدة من هذه الخوارزميات هي Levenshtein المسافة.

ومع ذلك, لا تنسى البحث عن الحلول القائمة.أعتقد على سبيل المثال لوسين لديه القدرة على البحث عن السلاسل المتشابهة.

راجع للشغل, وهنا آخر ذات الصلة في هذا الموضوع: كيف جوجل "هل يعني ذلك؟" خوارزمية العمل ؟

نصائح أخرى

ويتم ذلك بالاستعلام من خلال التعبير العادي عن أقرب الكلمات الرئيسية المطابقة للعبارة.

هنا مقالة رائعة قد تساعدك.

مع T-SQL يمكنك استخدام SOUNDEX وظيفة لمقارنة الكلمات صوتيا.

إذا أخذت مدخلات المستخدمين ثم قارنتها بكلمات أخرى في قاعدة البيانات الخاصة بك عن طريق كود soundex، فيجب أن تكون قادرًا على الخروج بقائمة "هل تقصد"؟كلمات.

على سبيل المثال

select SOUNDEX('andrew')
select SOUNDEX('androo')

سينتج كلاهما نفس الإخراج (A536).

هناك خوارزميات أفضل هذه الأيام، ولكن Soundex مدمج في خادم SQL.

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

لقد فعلت ذلك باستخدام طريقة الفرع والربط.اسمحوا لي أن أحفر الكود:

bool matchWithinBound(char* a, char* b, int bound){
  // skip over matching characters
  while(*a && *b && *a == *b){a++; b++;}
  if (*a==0 && *b==0) return true;
  // if bound too low, quit
  if (bound <= 0) return false;
  // try assuming a has an extra character
  if (*a && matchWithinBound(a+1, b, bound-1)) return true;
  // try assuming a had a letter deleted
  if (*b && matchWithinBound(a, b+1, bound-1)) return true;
  // try assuming a had a letter replaced
  if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
  // try assuming a had two adjacent letters swapped
  if (a[0] && a[1]){
    char temp;
    int success;
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    success = matchWithinBounds(a, b, bound-1);
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    if (success) return true;
  }
  // can try other modifications
  return false;
}

int DistanceBetweenWords(char* a, char* b){
  int bound = 0;
  for (bound = 0; bound < 10; bound++){
    if (matchWithinBounds(a, b, bound)) return bound;
  }
  return 1000;
}

لماذا لا تستخدم جوجل باور؟ يمكنك الاستفادة من خدمة الاقتراحات الخاصة بهم

هنا هو مثال على C#

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