DBに、フリーテキストフィールド列を含むテーブルがあります。
各単語がすべての行に表示される頻度を知りたいのですが、すべての単語のTF-IDFを計算することもできます。ここで、私のドキュメントは行ごとのそのフィールドの値です。
SQLクエリを使用してこれを計算することは可能ですか?そうでない場合、またはもっと簡単な方法がある場合は、私にそれを教えていただけますか?
どうもありがとう、
ジョン
DBに、フリーテキストフィールド列を含むテーブルがあります。
各単語がすべての行に表示される頻度を知りたいのですが、すべての単語のTF-IDFを計算することもできます。ここで、私のドキュメントは行ごとのそのフィールドの値です。
SQLクエリを使用してこれを計算することは可能ですか?そうでない場合、またはもっと簡単な方法がある場合は、私にそれを教えていただけますか?
どうもありがとう、
ジョン
SQL Server 2008では、ニーズに応じて、列に全文インデックスを適用し、テーブル値関数sys.dm_fts_index_keywords
とsys.dm_fts_index_keywords_by_document
テーブル値関数をクエリして、発生回数を取得できます。
編集:実際には、永続的な全文インデックスを作成しなくても、パーサーを活用できます
WITH testTable AS
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL
SELECT 3, N'red lorry yellow lorry' UNION ALL
SELECT 4, N'the quick brown fox jumped over the lazy dog'
)
SELECT display_term, COUNT(*) As Cnt
FROM testTable
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0)
WHERE TXT IS NOT NULL
GROUP BY display_term
HAVING COUNT(*) > 1
ORDER BY Cnt DESC
戻り値
display_term Cnt
------------------------------ -----------
the 3
brown 2
lorry 2
sea 2
SQL Server 2008のソリューション:
ここに表があります:
CREATE TABLE MyTable (id INT, txt VARCHAR(MAX));
これがSQLクエリです:
SELECT sum(case when TSplitted.txt_word = 'searched' then 1 else 0 end) as cnt_searched
, count(*) as cnt_all
FROM MyTable MYT
INNER JOIN Fn_Split(MYT.id,' ',MYT.txt) TSplitted on MYT.id=TSplitted.id
ここにテーブル値関数Fn_Split(@id int、@separator VARCHAR(32)、@string VARCHAR(MAX))(ここから取得):
CREATE FUNCTION Fn_Split (@id int, @separator VARCHAR(32), @string VARCHAR(MAX))
RETURNS @t TABLE
(
ret_id INT
,txt_word VARCHAR(MAX)
)
AS
BEGIN
DECLARE @xml XML
SET @XML = N'<root><r>' + REPLACE(@s, @separator, '</r><r>') + '</r></root>'
INSERT INTO @t(ret_id, val)
SELECT @id, r.value('.','VARCHAR(5)') as Item
FROM @xml.nodes('//root/r') AS RECORDS(r)
RETURN
END