2013-09-04 8 views
6

Ich habe eine SQL Server-Tabelle von Produkten, und jedes Produkt hat eine Beschreibung, die öffentlich auf unserer Website verfügbar ist. Ich möchte verhindern oder zumindest unsere Benutzer warnen, wenn eine Beschreibung der Beschreibung eines anderen Produkts zu ähnlich ist. Die Länge der einzelnen Produktbeschreibungen kann stark variieren.SQL - Ähnlichkeit zwischen zwei Strings unterschiedlicher Länge

würde ich Abfrage für Produkte mit Beschreibungen wie die doppelte/ähnliche Absätze/Textblöcke untereinander umfassen. dh String A hat eine Reihe von einzigartigen Inhalten, sondern teilt mir einen ähnlichen/identischen Absatz w/string B. Allerdings bin ich mir nicht sicher, welche Ähnlichkeit Algorithmus am besten zu verwenden:

Fuzzy hashing Art klingt, was ich suche, aber ich bin nicht nur w/feinen Unterschiede für Duplicate Content suchen. Ich bin auch für Duplicate Content suchen w/feinen Unterschiede in einem einzigartigen Textblock injiziert. Und ich hätte keine Ahnung, wie man Fuzzy-Hashes in SQL implementiert. SOUNDEX() und DIFFERENCE() scheinen Fuzzy-Hashing zu verwenden, sind aber für meinen Anwendungsfall ziemlich ungenau.

Im Idealfall würde die Ähnlichkeit SQL-Funktion schnell sein, aber ich konnte in einer anderen Tabelle gecached Ähnlichkeitswerte speichern und einen Job einplanen gelegentlich zu aktualisieren.

Was ist die beste Algorithmus/SQL (oder CLR-Integration) Implementierung dies zu erreichen?

+0

Warum beschränken Sie sich auf die Implementierung in SQL? –

+0

Nun, ich nehme an, dass es nicht in SQL sein muss. Ich gehe jedoch davon aus, dass eine reine SQL-Implementierung leistungsfähiger sein wird. Ich könnte möglicherweise eine .NET CLR-Integration wie [diese Ähnlichkeitsbibliothek] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ... aber ich habe keine Erfahrung mit SQL Server CLR-Integration und ich würde immer noch nicht wissen, welchen Algorithmus zu verwenden. –

+0

Eine Sache, die Sie versuchen könnten, ist, die Zeichenfolge zu nehmen und nur bestimmte Buchstaben zu berücksichtigen, dann Levenshtein diese Zeichenfolgen.Nehmen Sie zum Beispiel einen Text wie "Lorem ipsum dolor sit amet" und betrachten Sie nur Beispiele für e und t. Die resultierende Zeichenfolge würde etet, die Sie Levenshtein gegen eine andere gefilterte Zeichenfolge könnte. Natürlich braucht man etwas Tuning, aber hoffentlich kommt man auf die Idee. – kevmo314

Antwort

2

ich nicht so kürzlich von Fuzzy-String-Matching beitreten Gruppennamen hatte.
Ich habe ungefähr 40 verschiedene Algorithmen ausprobiert, aber keine war gut genug, um dies zu tun, obwohl die Gruppennamen nur durch einige Rechtschreibfehler, fehlende Whitespaces und gelegentliche zusätzliche _mLF am Ende unterschieden.

Also, wenn Sie eine ähnliche Sache versuchen, empfehle ich Sie jetzt zu stoppen, und die Daten senden (in meinem Fall Excel-Datei) zurück an den Benutzer zur Korrektur, wo es hingehört.

Wenn Sie beim Vergleich von Strings wirklich nur daran interessiert sind, kann diese Verbindung nur, was Sie brauchen:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

fand ich die Jaro-Winkler funktionieren die besten Ergebnisse in meinem Fall zu erhalten, aber man kann Testen Sie das für sich selbst.

+0

Ja, im Idealfall würde ich den Benutzern sagen, dass sie aufhören sollten, doppelten Text einzugeben. Aber einige werden es weiterhin tun ... Ich muss in der Lage sein, rückblickend zu entdecken, wenn Inhalte dupliziert/ähnlich sind. Dieser Artikel hilft definitiv. –

+1

Ich habe auch gefunden, dass dieser unscharfe Suchalgorithmus einigermaßen performant ist: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –