SQL Server 按TextID统计文本列各唯一单词出现次数
SQL Server文本词频统计实现方案
实现逻辑
先对Comments字段做文本清洗,把所有非单词分隔符统一替换为空格,再拆分字符串为单个单词,最后按Textid和单词分组统计出现次数即可。
适用SQL Server 2016及以上版本(内置STRING_SPLIT函数)
WITH CleanedComments AS ( -- 文本预处理:替换常见标点、换行符、制表符为空格,转小写实现大小写不敏感统计 SELECT Textid, LOWER( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( Comments, ',', ' '), '.', ' '), '!', ' '), '?', ' '), CHAR(10), ' '), CHAR(9), ' ' ) ) AS CleanText FROM MyComments ), SplitWords AS ( -- 拆分单词,过滤空字符串 SELECT Textid, value AS Word FROM CleanedComments CROSS APPLY STRING_SPLIT(CleanText, ' ') WHERE value <> '' ) -- 分组统计词频 SELECT Textid AS TextID, Word, COUNT(*) AS WordCount FROM SplitWords GROUP BY Textid, Word ORDER BY Textid, WordCount DESC;
适用SQL Server 2016以下版本(自定义拆分函数)
首先创建自定义字符串拆分函数:
CREATE FUNCTION dbo.SplitString ( @InputString VARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS @Result TABLE (Value VARCHAR(1000)) AS BEGIN DECLARE @StartIndex INT, @EndIndex INT SET @StartIndex = 1 -- 末尾补分隔符避免漏处理最后一个单词 IF RIGHT(@InputString, 1) <> @Delimiter BEGIN SET @InputString = @InputString + @Delimiter END WHILE CHARINDEX(@Delimiter, @InputString, @StartIndex) > 0 BEGIN SET @EndIndex = CHARINDEX(@Delimiter, @InputString, @StartIndex) INSERT INTO @Result(Value) VALUES(LTRIM(RTRIM(SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex)))) SET @StartIndex = @EndIndex + 1 END RETURN END GO
调用函数实现统计,把上面示例中的STRING_SPLIT(CleanText, ' ')替换为dbo.SplitString(CleanText, ' ')即可。
注意事项
- 如果需要大小写敏感统计,去掉
LOWER()函数即可 - 单条文本15000词的场景下,如果需要更复杂的分词(比如处理连字符、专有名词、过滤停用词),建议在应用层用专业分词库处理后再入库统计,SQL层面处理复杂分词性能较差。
内容的提问来源于stack exchange,提问作者TenkMan
相关产品推荐
相关产品推荐

