Triển khai BM25 (tìm kiếm toàn văn) trong SQL Server


7

Tôi đã gặp một khó khăn, trong khi cố gắng thực hiện thuật toán BM25 trong SQL Server 2008 R2. Tôi biết rằng SQL Server bao gồm tùy chọn Tìm kiếm toàn văn bản, đã triển khai một biến thể của BM25, nhưng tôi muốn thực hiện một số thử nghiệm điều chỉnh tham số và vì các quy trình FTS không thể chỉnh sửa (theo như tôi biết), tôi ' đã quyết định tự thực hiện nó.

Tôi có hai bảng, TF (tần số hạn) và DF (tần số tài liệu) với các cấu trúc sau:

TF

* Lưu ý: cột trọng số biểu thị tầm quan trọng của từ (nó thường là 1)

ID | Term | DocumentID | Count | TermID | Weight*

DF

ID | Term | Count

Bảng TF chứa mối quan hệ giữa một thuật ngữ và tài liệu; đó là tần suất của thuật ngữ trong một tài liệu. Bảng DF chứa thông tin về số lượng tài liệu có chứa một thuật ngữ. Hai bảng có thể được liên kết bằng DF.ID và TF.TermID. Sử dụng hai bảng này bây giờ tôi muốn tính các giá trị tương tự BM25 giữa hai tài liệu (một tài liệu đóng vai trò truy vấn) theo công thức trong bài viết Wikipedia . Các bảng TF và DF lần lượt dịch sang các hàm f (q, D) và n (q):

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tôi muốn kết quả ở định dạng này:

DocumentA_ID | DocumentB_ID | BM25_Value

Đây là một số mã mà tôi có cho đến nay:

DECLARE @N FLOAT;
DECLARE @AVGDL FLOAT;
DECLARE @K1 FLOAT;
DECLARE @B FLOAT;
SET @K1 = 1.2;
SET @B = 0.75;

-- number of all documents
SELECT @N = COUNT(DISTINCT DocumentID) FROM TF;

-- average document length (in words)
SELECT @AVGDL = AVG(DocumentLength) FROM (SELECT DocumentID, SUM(TF.Count) AS DocumentLength FROM TF WHERE Weight = 3 GROUP BY DocumentID) A;


-- BM25 implementation
SELECT  D.DocumentID AS DocumentA, 
        Q.DocumentID AS DocumentB, 
        *, 
-- need help here (SUM or something ...)
        LOG((@N - DF.Count + 0.5)/(DF.Count + 0.5)) AS IDF
FROM TF AS D
        INNER JOIN TF AS Q ON D.Term = Q.Term 
        INNER JOIN DF ON D.TermID = DF.ID
WHERE   D.DocumentID <> Q.DocumentID 

Tôi gặp sự cố khi xây dựng truy vấn trong phần cuối (triển khai BM25) để có được định dạng kết quả mong muốn. Mọi sự trợ giúp sẽ rất được trân trọng.

Câu trả lời:


7

Sau một vài ngày loay hoay, cuối cùng tôi cũng có thể hoàn thành nó. Đây là mã tôi đã kết thúc, được đóng gói thành một thủ tục được lưu trữ. Để làm việc này, tôi đã thêm một bảng khác, chỉ chứa một ID tài liệu và độ dài của nó bằng chữ.

ALTER PROCEDURE [dbo].[BuildIndexBM25]
-- default parameters K1=> [1.2 - 2.0], B => [0.0 - 1.0], Weight => 3 (e.g. titles only)
    @K1 FLOAT = 1.2,
    @B FLOAT = 0.75,
    @Weight FLOAT = 3
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @N FLOAT;
    DECLARE @AVGDL FLOAT;

    -- number of all documents
    SELECT @N = COUNT(DISTINCT DocumentID) FROM TF;

    -- average document length (in words)
    SELECT @AVGDL = AVG(Length) FROM DocumentLength; 

    -- BM25 implementation
    -- result set: | DocumentA | DocumentB | BM25 |
    SELECT 
        DL.ID AS DocumentA,
        BM.DocumentID AS DocumentB, 
        BM.BM25 AS BM25
    FROM (
        SELECT ID FROM DocumentLength
    ) DL
    CROSS APPLY (
        SELECT
                Q.DocumentID,
                SUM(LOG((@N - X.Count + 0.5) / (X.Count + 0.5)) * (Q.Count * (@K1 + 1)) / (Q.Count + @K1 * (1 - @B + (@B * L.Length / @AVGDL)))) AS BM25
        FROM    TF D, TF Q, DF X, DocumentLength L
        WHERE   D.TermID = Q.TermID
            AND D.DocumentID = DL.ID
            AND Q.TermID = X.ID
            AND D.DocumentID = L.ID
            AND Q.Weight = @Weight 
            AND D.Weight = @Weight
        GROUP BY Q.DocumentID
    ) BM
    WHERE   DL.ID != BM.DocumentID
END

Tôi hy vọng câu trả lời này sẽ giúp bất cứ ai muốn tự mình thực hiện thuật toán tìm kiếm toàn văn. Thuật toán mặc định trong SQL Server 2008 R2 chỉ có những khác biệt nhỏ đối với việc triển khai này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.