Implementierung von BM25 (Volltextsuche) in SQL Server


7

Ich habe beim Versuch, den BM25-Algorithmus in SQL Server 2008 R2 zu implementieren, einen Stumpf getroffen. Ich weiß, dass SQL Server die Option Volltextsuche enthält, die bereits eine Variante von BM25 implementiert, aber ich möchte einige Parameteroptimierungstests durchführen, und da die FTS-Prozeduren (soweit ich weiß) nicht bearbeitbar sind, habe ich ' Ich habe beschlossen, es selbst zu implementieren.

Ich habe zwei Tabellen, TF (Termhäufigkeit) und DF (Dokumenthäufigkeit) mit den folgenden Strukturen:

TF

* Hinweis: Die Gewichtsspalte gibt die Wichtigkeit des Wortes an (normalerweise 1).

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

DF

ID | Term | Count

Die TF-Tabelle enthält die Beziehung zwischen einem Begriff und einem Dokument. das heißt, die Häufigkeit des Begriffs in einem Dokument. Die DF-Tabelle enthält Informationen darüber, wie viele Dokumente einen Begriff enthalten. Die beiden Tabellen können mit DF.ID und TF.TermID verknüpft werden. Mit diesen beiden Tabellen möchte ich nun die BM25-Ähnlichkeitswerte zwischen zwei Dokumenten (ein Dokument dient als Abfrage) gemäß der Formel im Wikipedia-Artikel berechnen . Die Tabellen TF und DF werden in die Funktionen f (q, D) bzw. n (q) übersetzt:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ich möchte, dass das Ergebnis in diesem Format vorliegt:

DocumentA_ID | DocumentB_ID | BM25_Value

Hier ist ein Code, den ich bisher habe:

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 

Ich habe Probleme beim Erstellen der Abfrage im letzten Abschnitt (BM25-Implementierung), um das gewünschte Ergebnisformat zu erhalten. Jede Hilfe wäre sehr dankbar.

Antworten:


7

Nach ein paar Tagen des Herumspielens gelang es mir endlich, dies zu erledigen. Hier ist der Code, den ich erhalten habe und der in eine gespeicherte Prozedur gepackt wurde. Damit dies funktioniert, habe ich eine weitere Tabelle hinzugefügt, die nur eine Dokument-ID und deren Länge in Worten enthält.

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

Ich hoffe, diese Antwort hilft jedem, der selbst einen Volltextsuchalgorithmus implementieren wollte. Der Standardalgorithmus in SQL Server 2008 R2 unterscheidet sich nur geringfügig von dieser Implementierung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.