Проблема Project Gutenberg Python?

Я пытаюсь обрабатывать различные тексты с помощью регулярных выражений и 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. это первые два предложения.

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


person sarevok    schedule 23.08.2010    source источник


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

person Alex Martelli    schedule 23.08.2010
comment
Большое спасибо за то, что помогли мне сохранить мой рассудок, сэр, я очень ценю вашу помощь. - person sarevok; 23.08.2010
comment
@Alex Martelli, еще раз здравствуйте, сэр, я применил ваш код к своему потоку, но мне не удалось выполнить поток, который я написал в своем вопросе выше. Я попытался поместить весь код в цикл while — создать переменную x = 1, а затем выполнить while x:, чтобы поток продолжался. Однако после извлечения самого длинного предложения, в котором есть это самое длинное слово, он просто продолжает печатать одно и то же предложение вместо разных, несмотря на то, что самое длинное предложение назначается новому предложению. Что я должен делать ? -кстати, я преобразовал список «самый длинный» в предложение, используя .join, чтобы он действовал как обычные строки- - person sarevok; 26.08.2010
comment
@sarevok, невозможно отладить ошибки в вашем коде так, как вы можете описать их в комментарии. Пожалуйста, отредактируйте свой вопрос или лучше (поскольку я ответил на этот вопрос;-), закройте этот вопрос и откройте другой, показывающий код точно так же, как вы сейчас пытаетесь его использовать. - person Alex Martelli; 26.08.2010
comment
@ Алекс Мартелли, я сделал, как вы просили, вопрос можно найти здесь: stackoverflow.com/questions/3571887/ :) - person sarevok; 26.08.2010
comment
@sarevok, я вижу, ты уже получил там ответ. В любом случае, поскольку вы решили не закрывать этот вопрос, принимая мой ответ (несмотря на ваш чрезвычайно благодарный первоначальный комментарий и тот факт, что я ответил на ваш вопрос так, как вы его задали), я должен сделать вывод, что все, на что я отвечу, просто не может удовлетворить вас, и поэтому перестаньте тратить мое время на изучение ваших вопросов до тех пор, пока вы не докажете обратное. Серьезно: основной принцип этикета переполнения стека заключается в том, чтобы принять соответствующий и правильный ответ на ваш вопрос. Спасибо дешево, принятие является ключевым. - person Alex Martelli; 26.08.2010
comment
@Alex Martelli, я открыл этот пост, чтобы вы могли просмотреть мой код. Я признаю, что я новичок в этикете форума и что я был занят своим основным проектом летней стажировки вместе с этим побочным проектом Python. Сначала я не зарегистрировался на этом сайте, потому что был слишком занят. Я был в этом мире достаточно долго, чтобы знать, что спасибо стоит дешево, и, конечно же, я выберу ваш ответ как самый полезный, поскольку он есть, сразу после того, как я активирую свою учетную запись. - person sarevok; 26.08.2010
comment
@Alex Martelli, также приношу свои извинения, если я прозвучал грубо в своем последнем посте. Под занятостью я подразумевал, что спешил, что не позволяло мне «заморачиваться» с процессом OpenID. - person sarevok; 26.08.2010
comment
@sarevok, мои извинения, в свою очередь, если я прозвучал резко - у меня, конечно, не было возможности узнать, что у вас были веские причины не принять (таких много ходит; 0). Позвольте мне взглянуть на ваш другой вопрос, чтобы увидеть, могу ли я еще что-нибудь добавить к его «А» (я сомневаюсь в этом, поскольку вижу, что их несколько). - person Alex Martelli; 26.08.2010

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

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

person a2j    schedule 23.08.2010