0

在尝试在 SQL Server 2008 R2 中实现 BM25 算法时,我遇到了困难。我知道 SQL Server 包含全文搜索选项,它已经实现了 BM25 的变体,但我想做一些测试,并且由于 FTS 程序是不可编辑的(据我所知),我已经决定自己实施。

我有两个表,TF(词频)和 DF(文档频率),结构如下:

特遣部队

*注:权重列表示单词的重要性(通常为1)

ID | Term | DocumentID | Count | Weight*

东风

ID | Term | Count

TF表包含一个term和一个document的关系;也就是说,文档中术语的频率。DF 表包含有关多少文档包含一个术语的信息。使用这两个表,我现在想根据维基百科文章中的公式计算两个文档(一个文档充当查询)之间的 BM25 相似性值。表 TF 和 DF 分别转换为函数 f(q, D) 和 n(q):

在此处输入图像描述

在此处输入图像描述

我希望结果采用这种格式:

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 实现)中构建查询以获得所需的结果格式时遇到问题。任何帮助将不胜感激。

4

1 回答 1

1

我在 DBA.SE 上转发了这个问题,但最后我自己解决了。这是 DBA.SE 问题的链接,我还在其中添加了问题的解决方案。

https://dba.stackexchange.com/questions/42023/bm25-full-text-search-implementation-in-sql-server/42215#42215

于 2013-05-15T06:27:04.010 回答