Postgresql 如何从Postgres文本中提取n-gram词序

Postgresql 如何从Postgres文本中提取n-gram词序,postgresql,n-gram,text-analysis,Postgresql,N Gram,Text Analysis,我希望使用Postgres从文本中提取单词序列。 例如,下面句子的整个单词三角图 "ed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium" 会是 “ed ut透视术” “你看不清楚” “全方位透视” 我一直在用R做这件事,但我希望博士后能够更有效地处理它 我在这里看到过类似的问题 但是我不明白如何使用pg_trgm提取单词序列。下面的函数假设一个单词由字母数字字符组成(任何其他字符都被删除),

我希望使用Postgres从文本中提取单词序列。 例如,下面句子的整个单词三角图

"ed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium"
会是

  • “ed ut透视术”
  • “你看不清楚”
  • “全方位透视”
我一直在用R做这件事,但我希望博士后能够更有效地处理它

我在这里看到过类似的问题
但是我不明白如何使用pg_trgm提取单词序列。下面的函数假设一个单词由字母数字字符组成(任何其他字符都被删除),空格用作分隔符

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)
查找所有六个单词短语:

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)

请参阅中的示例,您可以通过使用:
arr:=regexp_split_to_数组(str,[^[:alnum:][124;\ s]')@a_horse_和_no_name-谢谢,答案更新了(模式需要修改一点)。