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):
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.