我尝试在SQL Server 2008 R2中实现BM25算法时遇到了困难。我知道SQL Server包含全文搜索选项,它已经实现了BM25的变体,但我想做一些测试,因为FTS程序是不可编辑的(据我所知),我已经决定了自己实现它。
我有两个表,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):
我希望结果采用以下格式:
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实现)中构建查询时遇到问题,无法获得所需的结果格式。任何帮助将不胜感激。
答案 0 :(得分:0)
我在DBA.SE上转发了这个问题,但最后我设法自己解决了这个问题。这是DBA.SE问题的链接,我还在其中添加了问题的解决方案。