【问题标题】:Word frequencies from strings in Postgres?Postgres中字符串的词频?
【发布时间】:2011-07-10 17:13:58
【问题描述】:

是否可以从 Postgres 中包含文本字符串的字段中识别不同的单词和每个单词的计数?

【问题讨论】:

    标签: postgresql text nlp word-frequency


    【解决方案1】:

    这样的?

    选择一些_pk, regexp_split_to_table(some_column, '\s') as word FROM some_table

    那么很容易得到不同的词:

    选择不同的词 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨

    或获取每个单词的计数:

    选择单词,计数(*) 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨 按单词分组

    【讨论】:

    • 根据您的数据,将列包装在 lower() 中也可能会有所帮助
    【解决方案2】:

    单词之间应该用空格''或其他分隔符分隔;不是用 's',除非有意这样做,例如,将 'myWordshere' 视为 'myWord' 和 'here'。

    SELECT word, count(*)
    FROM ( 
      SELECT regexp_split_to_table(some_column, ' ') as word
      FROM some_table
    ) t
    GROUP BY word
    

    【讨论】:

    • \s 是任何空白字符的有效正则表达式字符集
    • 我投了反对票,因为答案显然误解了正则表达式。
    【解决方案3】:

    您也可以为此使用 PostgreSQL 文本搜索功能,例如:

    SELECT * FROM ts_stat('SELECT to_tsvector(''hello dere hello hello ridiculous'')');
    

    将产生:

      word   | ndoc | nentry 
    ---------+------+--------
     ridicul |    1 |      1
     hello   |    1 |      3
     dere    |    1 |      1
    (3 rows)
    

    (PostgreSQL 应用与语言相关的词干和停用词删除,这可能是您想要的,也可能不是。可以通过使用 simple 而不是 english 字典来禁用停用词删除和词干提取,见下文。)

    嵌套的 SELECT 语句可以是任何产生 tsvector 列的 select 语句,因此您可以替换一个函数,将 to_tsvector 函数应用于任意数量的文本字段,并将它们连接成一个 tsvector,在您的文档的任何子集上,例如:

    SELECT * FROM ts_stat('SELECT to_tsvector(''english'',title) || to_tsvector(''english'',body) from my_documents id < 500') ORDER BY nentry DESC;
    

    将产生一个总字数矩阵,该矩阵取自前 500 个文档的 titlebody 字段,按出现次数降序排列。对于每个单词,您还将获得它出现在的文档数(ndoc 列)。

    查看文档了解更多详情:http://www.postgresql.org/docs/current/static/textsearch.html

    【讨论】:

    • WHERE 之前应该有一个id &lt; 500
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 2018-03-30
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多