Проект Гутенберга Python проблема? - PullRequest
2 голосов
/ 23 августа 2010

Я пытаюсь обработать различные тексты с помощью регулярных выражений и NLTK python, который находится на http://www.nltk.org/book-. Я пытаюсь создать генератор случайных текстов, и у меня возникают трудности с проблемой. Во-первых, вот мой алгоритм:

  1. Введите предложение как ввод - это называется триггерной строкой -

  2. Получить самое длинное слово в строке триггера

  3. Поиск во всей базе данных Project Gutenberg предложений, содержащих это слово - независимо от прописных букв -

  4. Верните самое длинное предложение со словом, о котором я говорил на шаге 3

  5. Добавить предложение в Шаг 1 и Шаг 4 вместе

  6. Повторите процесс. Обратите внимание, что я должен получить самое длинное слово во втором предложении и продолжать в том же духе и так далее -

До сих пор мне удавалось сделать это для первых двух предложений, но я не могу выполнить поиск без учета регистра. Вся база данных предложений Project Gutenberg доступна через функцию gutenberg.sents(), но регулярное выражение - поиск без учета регистра практически невозможен, поскольку gutenberg.sents() выводит предложения в книгах следующим образом - в списке формата списка -:

ПРИМЕР: все предложения макбета Шекспира вызываются набрав

import nltk

from nltk.corpus import gutenberg 

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

в командной строке оболочки Python и вывод:

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

с [Трагедия Макбета Уильяма Шекспара, 1603] и Actus Primus. будучи первыми двумя предложениями.

Как мне найти слово, которое я ищу, независимо от того, является ли оно прописными / строчными? Я отчаянно нуждаюсь в помощи, так как я возился с этим в течение последних двух дней, и это начинает нервировать. Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 23 августа 2010

С учетом списка 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 и имеют одинаковую максимальную длину, это даст вам первый, как это бывает.

0 голосов
/ 23 августа 2010

Как насчет использования встроенной функции: str.lower () ¶ Возвращает копию строки, преобразованной в нижний регистр.

Затем просто сравните строки.

...