如何从 Postgres 中的文本中提取 n-gram 单词序列
How to extract n-gram word sequences from text in Postgres
我希望使用 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 来提取单词序列
下面的函数假设一个单词由字母数字字符组成(任何其他字符都被删除)并且 space 作为分隔符。
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)
我希望使用 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 来提取单词序列
下面的函数假设一个单词由字母数字字符组成(任何其他字符都被删除)并且 space 作为分隔符。
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)