Проблема в Python-проекте "Гутенберг"?


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

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

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

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

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

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

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

До сих пор мне удавалось сделать это для первых двух предложений, но я не могу выполнить поиск без учета регистра. Вся база данных предложений Проекта Гутенберг доступно через функцию 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 2

2 ответа:

Задан список 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 () ¶ Возвращает копию строки, преобразованной в нижний регистр.

Тогда просто сравните строки.