我有一个名为'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)上应用此查询,因此性能是一个问题。
答案 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之间的所有数字(或者更多/更少,具体取决于需要)。如果您的数据库中已有数字表,则可以用该表/列替换已有的数据表。