我希望使用Postgres从Text中提取单词序列。 例如以下句子的整个单词三字母组
"ed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium"
将会
"ed ut perspiciatis"
"ut perspiciatis unde"
"perspiciatis unde omnis"
... 我一直在使用R进行此操作,但我希望Postgres能够更有效地处理它。
我在这里n-grams from text in PostgreSQL看到了类似的问题 但我不明白如何使用pg_trgm提取单词序列
答案 0 :(得分:3)
下面的函数假定一个单词由字母数字字符组成(其他所有字符均被删除),并且空格用作分隔符。
create or replace function word_ngrams(str text, n int)
returns setof text language plpgsql as $$
declare
i int;
arr text[];
begin
arr := regexp_split_to_array(str, '[^[:alnum:]]+');
for i in 1 .. cardinality(arr)- n+ 1 loop
return next array_to_string(arr[i : i+n-1], ' ');
end loop;
end $$;
找到所有三个单词的短语:
select word_ngrams('ed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium', 3)
word_ngrams
----------------------------
ed ut perspiciatis
ut perspiciatis unde
perspiciatis unde omnis
unde omnis iste
omnis iste natus
iste natus error
natus error sit
error sit voluptatem
sit voluptatem accusantium
(9 rows)
找到所有六个单词的短语:
select word_ngrams('ed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium', 6)
word_ngrams
---------------------------------------------
ed ut perspiciatis unde omnis iste
ut perspiciatis unde omnis iste natus
perspiciatis unde omnis iste natus error
unde omnis iste natus error sit
omnis iste natus error sit voluptatem
iste natus error sit voluptatem accusantium
(6 rows)