代码之家  ›  专栏  ›  技术社区  ›  mikelus

如何从Postgres文本中提取N-gram词序列

  •  2
  • mikelus  · 技术社区  · 6 年前

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

    "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提取单词序列

    1 回复  |  直到 6 年前
        1
  •  3
  •   klin    6 年前

    下面的函数假定一个单词由字母数字字符组成(任何其他字符都将被删除),空格用作分隔符。

    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)