سؤال

أحاول معالجة العديد من النصوص بواسطة Regex و NLTK من Python -وهو في http://www.nltk.org/book-. أحاول إنشاء مولد نص عشوائي وأواجه صعوبة في مشكلة. أولاً ، ها هي خوارزمية:

  1. أدخل جملة كمدخلات -وهذا يسمى سلسلة المشغل-

  2. احصل على أطول كلمة في سلسلة الزناد

  3. ابحث في جميع قاعدة بيانات Gutenberg للمشروع عن الجمل التي تحتوي على هذه الكلمة -غير محددة من الأحرف الكبيرة -

  4. أعد أطول جملة لها الكلمة التي تحدثت عنها في الخطوة 3

  5. قم بإلحاق الجملة في الخطوة 1 و Step4 معًا

  6. كرر العملية. لاحظ أنني يجب أن أحصل على أطول كلمة في الجملة الثانية والاستمرار هكذا وما إلى ذلك

حتى الآن تمكنت من القيام بذلك لجملتين أول جملتين ، لكن لا يمكنني إجراء بحث غير حساس للحالة. قاعدة بيانات الجملة بأكملها تتوفر Project Gutenberg عبر gutenberg.sents() وظيفة ولكن regex - حالة البحث غير حساس من الناحية العملية مستحيل عمليا منذ gutenberg.sents() يخرج الجمل في الكتب على النحو التالي -في قائمة بتنسيق القائمة -:

مثال: يتم استدعاء جميع جمل شكسبير ماكبث عن طريق الكتابة

import nltk

from nltk.corpus import gutenberg 

gutenberg.sents('shakespeare-macbeth.txt') 

في خط أوامر Python Shell والإخراج هو:

[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], 
['Actus', 'Primus', '.'], .......] 

مع [مأساة ماكبث بقلم ويليام شكسباري ، 1603] و Actus Primus. كونه أول جملتين.

كيف يمكنني العثور على الكلمة التي أبحث عنها بغض النظر عن كونها كبيرة/صغيرة؟ أنا في حاجة ماسة إلى المساعدة لأنني كنت أتعامل مع هذا خلال اليومين الماضيين وبدأت في ارتداء أعصابي. شكرًا جزيلاً.

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

المحلول

إعطاء قائمة L من الكلمات ، وكلمة مستهدفة t,

any(t.lower()==w.lower() for w in L)

يخبرك ما إذا كان L لديه كلمة T بطريقة غير حساسة للحالة. من الأسرع ، بالطبع ، القيام به

lt = t.lower()
any(lt==w.lower() for w in L)

نظرًا لأن Python لا "يرفع" الحساب المستمر خارج الحلقة ، وما لم تكن ترفعها بنفسك ، فسيتم تنفيذها بشكل متكرر.

بالنظر إلى قائمة القوائم lol, ، أطول قائمة فرعية بما في ذلك t يمكن العثور عليها من قبل

longest = max((L for L in lol if any(lt==w.lower() for w in L)), key=len)

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

نصائح أخرى

ماذا عن استخدام الوظيفة المدمجة: str.lower ()reorting أعد نسخة من السلسلة التي تم تحويلها إلى أحرف صغيرة.

ثم فقط قارن الأوتار.

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