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