5

'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) に適用する必要があるため、パフォーマンスが懸念されます。

4

1 に答える 1

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   

この関数には数値テーブルが必要です。これは基本的にはCREATE TABLE Numbers(Num int)1 から 10,000 までのすべての数値 (または必要に応じてそれ以上/以下) を含んでいます。DB に数値テーブルが既にある場合は、そのテーブル/列を既存のものに置き換えることができます。

于 2014-02-21T22:50:47.550 に答える