مشروع Gutenberg Python مشكلة؟
سؤال
أحاول معالجة العديد من النصوص بواسطة Regex و NLTK من Python -وهو في http://www.nltk.org/book-. أحاول إنشاء مولد نص عشوائي وأواجه صعوبة في مشكلة. أولاً ، ها هي خوارزمية:
أدخل جملة كمدخلات -وهذا يسمى سلسلة المشغل-
احصل على أطول كلمة في سلسلة الزناد
ابحث في جميع قاعدة بيانات Gutenberg للمشروع عن الجمل التي تحتوي على هذه الكلمة -غير محددة من الأحرف الكبيرة -
أعد أطول جملة لها الكلمة التي تحدثت عنها في الخطوة 3
قم بإلحاق الجملة في الخطوة 1 و Step4 معًا
كرر العملية. لاحظ أنني يجب أن أحصل على أطول كلمة في الجملة الثانية والاستمرار هكذا وما إلى ذلك
حتى الآن تمكنت من القيام بذلك لجملتين أول جملتين ، لكن لا يمكنني إجراء بحث غير حساس للحالة. قاعدة بيانات الجملة بأكملها تتوفر 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 أعد نسخة من السلسلة التي تم تحويلها إلى أحرف صغيرة.
ثم فقط قارن الأوتار.