2016-06-11 6 views
0

Я использую NLTK - специфический инструментарий для манипулирования текстами тела, и я определил функцию для пересечения пользовательских входов с помощью слов Шекспира.Python NLTK :: Пересекающиеся слова и предложения

def shakespeareOutput(userInput): 

    user = userInput.split() 
    user = random.sample(set(user), 3) 

    #here is NLTK's method 
    play = gutenberg.sents('shakespeare-hamlet.txt') 

    #all lowercase 
    hamlet = map(lambda sublist: map(str.lower, sublist), play) 

print hamlet возвращается:

[ ['[', 'the', 'tragedie', 'of', 'hamlet', 'by', 'william', 'shakespeare', '1599', ']'], 
['actus', 'primus', '.'], 
['scoena', 'prima', '.'], 
['enter', 'barnardo', 'and', 'francisco', 'two', 'centinels', '.'], 
['barnardo', '.'], 
['who', "'", 's', 'there', '?']...['finis', '.'], 
['the', 'tragedie', 'of', 'hamlet', ',', 'prince', 'of', 'denmarke', '.']] 

Я хотел бы найти предложение, которое содержит наибольшее количество вхождений слов пользователя и возвращает предложение. Я пытаюсь:

bestCount = 0 
    for sent in hamlet: 
     currentCount = len(set(user).intersection(sent)) 
     if currentCount > bestCount: 
      bestCount = currentCount 
      answer = ' '.join(sent) 
      return ''.join(answer).lower(), bestCount 

вызова функции:

shakespeareOutput("The Actus Primus") 

возвращается:

['The', 'Actus', 'Primus'] None

, что я делаю неправильно?

благодарит заранее.

+3

Я думаю, что оператор 'return' должен быть из цикла' for'. В противном случае функция вернет самый первый «отправленный» элемент из списка «hamlet». – Rahul

ответ

2

Ваш способ оценки currentCount не правильный. Set intersection возвращает количество согласованных элементов, а не количество совпадающих элементов.

>>> s = [1,1,2,3,3,4] 
>>> u = set([1,4]) 
>>> u.intersection(s) 
set([1, 4]) # the len is 2, however the total number matched elements are 3 

Используйте следующий код.

bestCount = 0 

for sent in hamlet: 
    currentCount = sum([sent.count(i) for i in set(user)]) 
    if currentCount > bestCount: 
     bestCount = currentCount 
     answer = ' '.join(sent) 

return answer.lower(), bestCount 
+0

На самом деле идея не имеет возвращенной суммы, а скорее ONE ** предложение **, которое больше похоже на вход, следовательно, len() лучше всего подходит объективу. но спасибо, вы научили меня чему-то приятному в отношении разницы между пересечением и подсчетом. –

 Смежные вопросы

  • Нет связанных вопросов^_^