SQL Server 2008中列中出现的所有单词的字数

时间:2014-02-21 22:38:56

标签: sql sql-server word-count word-frequency

我有一个名为'ticket_diary_comment'的表,其中包含一个名为'comment_text'的列。此列填充了文本数据。我想得到整个专栏中出现的所有单词的频率。例如:

Comment_Text
I am a good guy
I am a bad guy
I am not a guy

我想要的是什么:

Word    Frequency
I       3
good    1
bad     1
not     1
guy     3

请注意,我还删除了输出中的停用词。我知道计算一个特定单词的频率并不困难,但我正在寻找能够计算一列中出现停用词的所有单词的东西。

我很感激在这个问题上提供任何帮助。 我还想提一下,我必须在大数据集(大约1 TB)上应用此查询,因此性能是一个问题。

1 个答案:

答案 0 :(得分:4)

我会使用表值函数来拆分字符串,然后在查询中对它们进行分组。像这样:

SELECT item, count(1)
FROM ticket_diary_comment 
    CROSS APPLY dbo.fn_SplitString(comment_text, ' ')
GROUP BY item

以及fn_SplitString的定义:

CREATE FUNCTION [dbo].[fn_SplitString]   
(   
    @String VARCHAR(8000),   
    @Delimiter VARCHAR(255)   
)   
RETURNS   
@Results TABLE   
(   
    ID INT IDENTITY(1, 1),   
    Item VARCHAR(8000)   
)   
AS   
BEGIN   
INSERT INTO @Results (Item)   
SELECT SUBSTRING(@String+@Delimiter, num,   
    CHARINDEX(@Delimiter, @String+@Delimiter, num) - num)   
FROM Numbers   
WHERE num <= LEN(REPLACE(@String,' ','|'))   
AND SUBSTRING(@Delimiter + @String,   
            num,   
            LEN(REPLACE(@delimiter,' ','|'))) = @Delimiter   
ORDER BY num RETURN   
END   

此功能需要numbers table,基本上只有CREATE TABLE Numbers(Num int)并且包含1到10,000之间的所有数字(或者更多/更少,具体取决于需要)。如果您的数据库中已有数字表,则可以用该表/列替换已有的数据表。