Du willst die Phrasen also am jeweiligen Text erkennen und nicht aus einer vorgefertigten Liste holen.
Da hast du das Problem, dass du auch einige zusammenhanglose Paare findest, wo Wörter oft hintereinander stehen, aber nicht wirklich nur so zusammengehören.
Du könntest den Text erst mal durchlaufen und Wortketten bilden, für die du bist zu einer bestimmten Länge (z.B. 10 Wörter) die Häufigkeit zählst.
Also für den Text A B C D E F G usw....
A kommt 10 mal vor (im ganzen Text)
A-B kommt 3 mal vor
A-B-C kommt 1 mal vor
A-B-C-D kommt 1 mal vor
A-B-C-D-E 1 mal...
bis zur Maximallänge
Dann
B kommt 5 mal vor
B-C 2 mal
...
Dann musst du anhand der Zähler rausfinden was eine Phrase ist und was nicht.
Dann nochmal den Text nochmal durchlaufen und pro Wort schauen ob das Wort Teil einer Phrase ist oder einzeln zählt.
Beide Durchläufe sind natürlich schon rekursiv, aber ich denke anders gehts kaum und die Phrasenlänge wird ja relativ niedrig sein, nur wenige Wörter?
Ein Ersatz für die Rekursion könnte nur dann klappen wenn du denn Text zur Suche mehrmals durchläufst. Aber ob du ihn 5 mal durchläufst und dafür nur immer 1 Wort anschaust, oder einmal und dafür pro Wort 5 weitere Wörter anschaust, das reißts sicher auch nicht raus.