2013-05-07 54 views
0

我試圖在SQL Server 2008 R2中實現BM25算法時遇到了一個問題。我知道SQL Server包含全文搜索選項,該選項已經實現了BM25的一個變體,但我想做一些測試,並且由於FTS程序是不可編輯的(據我所知),我決定自己實現它。SQL Server中的BM25實現

我有兩個表,TF(詞頻)和DF(文檔頻率)具有以下結構:

TF

*注:重量欄表示單詞的重要性(它被通常爲1種)

ID | Term | DocumentID | Count | Weight* 

DF

ID | Term | Count 

TF表包含術語和文檔之間的關係;即文檔中術語的頻率。 DF表包含有關多少個文檔包含術語的信息。使用這兩個表,我現在想根據Wikipedia article中的公式計算兩個文檔(一個文檔充當查詢)之間的BM25相似性值。表TF和DF轉換爲分別函數f(Q,d)和N(q)中:

enter image description here

enter image description here

我想的結果是在這種格式:

DocumentA_ID | DocumentB_ID | BM25_Value 

下面是一些代碼,我到現在爲止:

ALTER PROCEDURE [dbo].[BM25] 
-- default parameters k => [1.2 - 2.0], b => [0.0 - 1.0] 
    @K1 FLOAT = 1.2, 
    @B FLOAT = 0.75 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @N FLOAT; 
    DECLARE @AVGDL FLOAT; 

    -- number of all documents 
    SELECT @N = CAST(COUNT(*) AS FLOAT) 
    FROM FullDocument; 

    -- average length of documents (in words) 
    SELECT @AVGDL = AVG(Length) 
    FROM (
     SELECT DocumentID, 
       CAST(COUNT(*) AS FLOAT) AS Length 
     FROM TF 
     GROUP BY DocumentID 
    ) A; 

    -- BM25 implementation 
-- SELECT TF.Term, 
--   TF.DocumentID, 
--   C.DocumentLength, 
--   LOG((@N - DF.Count + 0.5)/(DF.Count + 0.5)) * (TF.Count * (@K1 + 1))/(TF.Count + @K1 * (1 - @B + @B * (C.DocumentLength/@AVGDL))) AS BM25, 
--   Weight 
-- FROM TF 
-- INNER JOIN DF ON TF.Term = DF.Term 
-- INNER JOIN (
--  SELECT DocumentID, 
--    COUNT(*) AS DocumentLength 
--  FROM TF 
--  GROUP BY DocumentID 
-- ) C ON TF.DocumentID = C.DocumentID 
END 

我在構建上一節(BM25實現)中的查詢時遇到問題以獲取所需的結果格式。任何幫助將不勝感激。

回答