г.Ответ Ханкина более элегантный, но следующее больше соответствует подходу, с которого вы начали:
import sys
import string
import nltk
from nltk.corpus import gutenberg
def longest_element(p):
"""return the first element of p which has the greatest len()"""
max_len = 0
elem = None
for e in p:
if len(e) > max_len:
elem = e
max_len = len(e)
return elem
def downcase(p):
"""returns a list of words in p shifted to lower case"""
return map(string.lower, p)
def unique_words():
"""it turns out unique_words was never referenced so this is here
for pedagogy"""
# there are 2.6 million words in the gutenburg corpus but only ~42k unique
# ignoring case, let's pare that down a bit
for word in gutenberg.words():
words.add(word.lower())
print 'gutenberg.words() has', len(words), 'unique caseless words'
return words
print 'loading gutenburg corpus...'
sentences = []
for sentence in gutenberg.sents():
sentences.append(downcase(sentence))
trigger = sys.argv[1:]
target = longest_element(trigger).lower()
last_target = None
while target != last_target:
matched_sentences = []
for sentence in sentences:
if target in sentence:
matched_sentences.append(sentence)
print '===', target, 'matched', len(matched_sentences), 'sentences'
longestSentence = longest_element(matched_sentences)
print ' '.join(longestSentence)
trigger = longestSentence
last_target = target
target = longest_element(trigger).lower()
Однако, учитывая ваше примерное предложение, он достигает фиксации в двух циклах:
$ python nltkgut.py Thane of code
загрузка gutenburg corpus ...
=== target thane соответствует 24 предложениям
norway himselfe с ужасными числами, которому помогает этот самый дислоцирующий трейтор, thane of cawdor, начался неприятный конфликт, до тех пор, пока невеста Беллоны, получившая доказательство, не столкнулась с ним сравнениями самообороны, точки против точки, мятежного оружия мятежного оружия, обуздав его похотливый дух: и в заключение победа упала на
=== целевой жених совпал с 1 предложением
норвегия химсельф, с ужасными числами, при поддержке этого самого дислоцирующего подноса, тана Кавдора, начался непристойный конфликт, пока жених этой Беллоны, находящийся в пруве, не столкнулся с нимselfe - сравнения, точка против точки, бунтарское искусствоЯ получаю оружие, сдерживая его похотливый дух: и в заключение, победа упала на
Отчасти проблема с ответом на последнюю проблему состоит в том, что он сделал то, что вы просили, но вы спросилиболее конкретный вопрос, чем вы хотели получить ответ.Таким образом, ответ застрял в некоторых довольно сложных выражениях списка, которые я не уверен, что вы поняли.Я предлагаю вам более свободно использовать операторы печати и не импортировать код, если вы не знаете, что он делает.Развернув список выражений, я обнаружил (как уже отмечалось), что вы никогда не использовали список слов в корпусе.Функции также помогают.