【问题标题】:Word count for all the words appearing in a column in SQL Server 2008 [duplicate]SQL Server 2008中出现在列中的所有单词的字数[重复]
【发布时间】:2014-03-23 16:28:18
【问题描述】:

我有一个名为'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)上,所以性能是一个问题。

【问题讨论】:

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


    【解决方案1】:

    我会使用表值函数来拆分字符串,然后将它们分组到一个查询中。像这样的:

    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到10000的所有数字(或更多/更少,取决于需要)。如果您的数据库中已经有一个数字表,您可以用该表/列替换您已有的。

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2016-02-02
      • 1970-01-01
      • 2012-02-15
      • 2017-09-07
      相关资源
      最近更新 更多