я мог бы использовать Counter
:
s = 'Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'
words_we_want = ("Spot","brown","hair")
from collections import Counter
data = Counter(s.split())
print (sum(data[word] for word in words_we_want))
Обратите внимание, что это будет под кол на 1, так как 'brown.'
и 'brown'
отдельные элементы счетчика.
Несколько менее элегантное решение, которое не споткнуться на пунктуации использует регулярное выражение:
>>> len(re.findall('Spot|brown|hair','Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'))
8
Вы можете создать регулярное выражение из кортежа просто
'|'.join(re.escape(x) for x in words_we_want)
Хорошая вещь об этих решений заключается в том, что они имеют гораздо лучшую алгоритмическую сложность по сравнению с решением gnibbler. Конечно, на самом деле, что действительно лучше работает с данными реального мира, все еще необходимо измерять OP (поскольку OP является единственным с данными реального мира)
Вы хотите сосчитать "hair" в "hairy"? Ответ nltk не учитывает его, в то время как ответы 'count()' и регулярных выражений выполняются. – EOL
Это легко исключить с помощью 'regex' путем добавления границ слов (' \ b'). – mgilson
Действительно, но это меняет ваш ответ. :) – EOL