سؤال

لدي قاعدة بيانات كاملة من الآسيوية-حرف تعبئة السجلات (الصينية واليابانية والكورية) جنبا إلى جنب مع اللاتينية حرف تعبئة السجلات (الإنجليزية, الفرنسية, سمها ما شئت) ، أريد أن أداء fulltext البحث عليها.

MySQL يقول:

إيديوغرامي لغات مثل الصينية و اليابانيين ليس لديهم كلمة المحددات.ولذلك FULLTEXT محلل لا يمكن تحديد مكان الكلمات begin و end في هذه لغات.الآثار المترتبة على هذا و بعض الحلول لهذه المشكلة الموضحة في القسم 11.8, "النص الكامل البحث عن وظائف".

القسم 11.8 في الواقع لا تقدم الحلول أو حتى ذكر المشكلة.

لذلك ، كيف يمكنك فرز البحث عن واحد صيني مختلط الطابع قاعدة البيانات? %LIKE% العمل, ولكن لا يجب أنيق أهمية التقييم.يجب فقط الاعتماد مرات حرف يظهر في سجل رتبة من ذلك ؟ وأنا أقدر أي نصيحة لديك.وذلك بفضل!

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

المحلول

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

غير أنني أعرف أن لوسين الرياضة محلل الصينية ، اليابانية ، الكورية ، لذا أعتقد أن لديها نوعا من الدعم ما تفعله.عادة ما أقوم به عندما كنت في حاجة إلى دمج لوسين مع php هو أنني تنفيذ لوسين كما socket server و الاتصال به من php.

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

من أجل تنفيذ خطة فهرسة باستخدام MySQL, قد تضطر إلى إنشاء عدد قليل من الجداول مع البنية التالية:

document
  document_id
  document_text
  document_tokencount

document_token
  document_id
  token_id
  token_docfrequency
  index (token_id, document_id)

token
  token_id
  token_unicode
  token_globalfrequency
  index (token_unicode)

ثم أود أن عملية لكل وثيقة إدراج صف في document_token الجدول لكل حرف (رمز) في مستند.على token_unicode مجال تحتوي على عدد صحيح unicode تسلسل تستخدم referr إلى هذه الشخصية.على token_docfrequency الحقل يحتوي على عدد صحيح المقابلة لعدد من المرات أن المستند يحتوي على رمز ، في حين token_globalfrequency الحقل يحتوي على مجموع عدد مرات مصطلح يستخدم في جميع الوثائق.

هذا من شأنه أن تسمح لك أن تفعل البحث السريع عن الرموز:

SELECT * FROM document_token WHERE token_id = 1
UNION
SELECT * FROM document_token WHERE token_id = 2
UNION
SELECT * FROM document_token WHERE token_id = 3

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

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

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

tf-idf = tf(t,d) / tf(d) * log(D / d(t))

where:
tf(t,d) = token frequency in current document
tf(d) = total number of tokens in current document
D = total number of documents
d(t) = number of document that contains the token

حساب هذه النتيجة لكل مصطلح في استعلام البحث الأولى ، وتخزين النتيجة في hashmap أو شيئا مماثلة.هذا هو أول ناقل يسمى v_1.ثم انتقل إلى المستند الأول.حساب tf-الجيش الإسرائيلي درجة لكل مصطلح في الوثيقة وكذلك وتخزينها كما v_2.الآن يمكنك حساب درجة على هذه الوثيقة باستخدام جيب التمام similiarity:

score = arccos(v_1 * v_2 / (|v_1| * |v_2|))

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

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

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