Единственный способ сделать это, о котором я знаю, - это проиндексировать все 3 набора слов с их количеством. Ваш вид будет выглядеть примерно так:
class Tuple(db.Model):
words = db.StringListProperty()
count = db.IntegerProperty()
Затем вам нужно вставить или обновить соответствующую сущность кортежа для каждого набора из 3 уникальных слов в вашем тексте. Например, строка «король мертв» приведет к кортежам (король мертв), (король мертв), (король мертв), (король мертв) ... Это очевидно, приводит к экспоненциальному взрыву в записях, но я не знаю, как это можно сделать для того, что вы хотите сделать.
Чтобы найти предложения, вы должны сделать что-то вроде этого:
q = Tuple.all().filter('word =', w1).filter('word =', w2).order('-count')
В более широком смысле алгоритмы рекомендаций, тем не менее, проводится много исследований относительно более эффективных способов сделать это. Это открытый вопрос, о чем свидетельствует наличие проблемы Netflix.