文字列を与えると、その文字列をn-gramに分解する関数をSQLで書いてみました。
bigramとtrigramは使用頻度が高いので、特殊化した関数を別途定義してみました。
#standardSQL
CREATE TEMPORARY FUNCTION NGRAM(str STRING, n INT64)
RETURNS ARRAY<STRING> AS ((
SELECT ARRAY(SELECT SUBSTR(str, seq, n) FROM UNNEST(T.seqs) AS seq)
FROM (
SELECT str, GENERATE_ARRAY(1, LENGTH(str) - n + 1) AS seqs
) AS T
));
CREATE TEMPORARY FUNCTION BIGRAM(str STRING)
RETURNS ARRAY<STRING> AS (NGRAM(str, 2));
CREATE TEMPORARY FUNCTION TRIGRAM(str STRING)
RETURNS ARRAY<STRING> AS (NGRAM(str, 3));
SELECT BIGRAM('I am an NLPer')