Durch die Verknüpfung einer Tokenstabelle mit sich selbst ("self join") lassen sich die Felder von zwei oder mehr auf einander folgenden Datensätzen dergestalt anordnen, dass sie nebeneinander in einer Zeile erscheinen. Da die Anzahl der in dieser Weise verknüpften Datensätze variabel ist, spricht man von sog. n-Grammen, wobei n für eben diese Anzahl steht. In der Korpuslinguistik wird gerne mit Tri-Grammen (3-Gramme) gearbeitet. Um diese zu erzeugen, muss die Tokenstabelle insgesamt dreimal mit sich selbst verknüpft werden, und zwar unter der join-Bedingung, dass die Werte im Feld ID jeweils um den Wert 1 voneinander abweichen:
select a.ID as a_id, b.ID as b_id, c.ID as c_id, a.token as a_token, b.token as b_token, c.token as c_token, a.pos as a_pos, b.pos as b_pos, c.pos as c_pos from tokens a join tokens b on (a.ID=b.ID-1) join tokens c on (b.ID=c.ID-1) limit 50 ;
Mehrwert entsteht u.a., indem man nach den auftretenden Wortarten-Kombinationen gruppiert (sog. POS-Triple) und nach Häufigkeit sortieren lässt. Die Einbindung der Tabelle stts ermöglicht die zusätzliche Anzeige der Bescheibungen der POS-Kürzel:
select count(*) as Haeufigkeit, concat_ws(' // ', a.pos, b.pos, c.pos) as POS_Triple, concat_ws(' // ', ap.description, bp.description, cp.description) as POS_Triple_description, group_concat(distinct a.token, ' ', b.token, ' ', c.token separator ' // ') as Tokens from tokens a join tokens b on (a.ID=b.ID-1) join tokens c on (b.ID=c.ID-1) join stts ap on (a.pos=ap.pos) join stts bp on (b.pos=bp.pos) join stts cp on (c.pos=cp.pos) group by a.pos, b.pos, c.pos order by count(*) desc limit 50 ;