查询以显示对应的每个不同单词的计数

query to display count of corresponding each distinct word

table 中有一列最多可存储 4000 个字符。因此,对于给定的行,我们需要编写一个查询来显示句子中对应的每个不同单词的计数。

例如该列有 "Jack and Jill went up a hill. Jack came tumbling down"

Output :  
<Word> - <Count> 
Jack - 2 
Jill - 1
hill - 1
and - 1
a - 1
came - 1 ... and so on

首先,将单词转换成行,然后进行分组。

在此查询中,我们使用 CONNECT BY 行生成的基本概念。

例如:

select level from dual CONNECT BY level <= 10;

上面的查询将生成 10 行。(分层查询)。

基于这个简单的逻辑,现在我们要计算这里的空格数,并生成那么多行。REGEXP_COUNT(str,'[^ ]+')会给出句子中的空格数。

然后使用级别,从每行的句子中提取一个词。 REGEXP_SUBSTR(str,'[^ ]+',1,level) 会这样做。

您可以尝试使用此查询来处理其他情况。祝你好运。

with tokenised_rows(str) as(
SELECT  REGEXP_SUBSTR('Jack and Jill went up a hill. Jack came tumbling down','[^ ]+',1,LEVEL) 
  FROM dual
CONNECT BY level <= REGEXP_COUNT('Jack and Jill went up a hill. Jack came tumbling down','[^ ]+')
)
select str,count(1) from tokenised_rows
group by str;

由于您标记了 Teradata,您可以将 STRTOK_SPLIT_TO_TABLE 用于分词部分。只需将更多字符添加到分隔符列表即可:

with cte as
(select
    1 as keycol,
    'Jack and Jill went up a hill. Jack came tumbling down' as col)
select keycol, token, count(*) as cnt
FROM TABLE (STRTOK_SPLIT_TO_TABLE(cte.keycol, cte.col, 
            ' .,;:-?!()''"') -- list of separators
     RETURNS (keycol INTEGER,
              tokennum INTEGER,
              token VARCHAR(100) CHARACTER SET UNICODE)
           ) AS d 
group by 1,2
order by 1, cnt desc

但是统计单词可能要复杂得多,因为它通常包括分词、词干提取和停用词。