首页 > 解决方案 > 字符串列中单词的频率

问题描述

我正在寻找一个可以让我

想象这是一张“News_Articles”表,有两列:“ID”和“Headline”。我怎样才能从这个显示中得到结果

NEWS_ARTICLES

ID 标题
0001 今日新闻:今天的地方选举!
0002 今天 COVID-19 利率下降
0003 今天是在当地购物的日子
  1. 每行一个字(来自标题栏)
  2. 它出现在多少个唯一 ID 中的计数
  3. 单词在整个数据集中出现的总次数

期望的结果

单词 Unique_Count 总数
今天 3 4
当地的 2 2
选举 1 1

理想情况下,我们也希望从单词中删除任何连词(请参阅上面的“今天”被视为“今天”)。

我还希望能够删除诸如“the”或“a”之类的填充词。理想情况下,这将通过一些现有的库,但如果没有,我总是可以手动删除我看到的带有 where 子句的库。

如果需要,我还会将所有字符更改为小写。

谢谢!

标签: sqlpostgresql

解决方案


您可以使用全文搜索并unnest提取词位,然后聚合:

SELECT parts.lexeme AS word,
       count(*) AS unique_count,
       sum(cardinality(parts.positions)) AS total_count
FROM news_articles
   CROSS JOIN LATERAL unnest(to_tsvector('english', news_articles.headline)) AS parts
GROUP BY parts.lexeme;

 word  │ unique_count │ total_count 
═══════╪══════════════╪═════════════
 -19   │            1 │           1
 covid │            1 │           1
 day   │            1 │           1
 drop  │            1 │           1
 elect │            1 │           1
 local │            2 │           2
 news  │            1 │           1
 rate  │            1 │           1
 shop  │            1 │           1
 today │            3 │           4
(10 rows)

推荐阅读