Dubletten Agent

  • Hallo Leute,


    Ich bin neu hier und grüße euch erst mal ganz herzlich. Bin Student und beschäftige mich erst seit kurzem mit Notes, komme eher aus dem Java Umfeld.


    Ich schreibe zur Zeit einen Agenten, der sich Dubletten vornimmt. Ich bin soweit, dass er in einer Spalte nach gleichen Einträgen sucht. Nun möchte ich einen Abgleich hinzufügen: der Agent soll mir sozusagen Einträge ausspucken bei denen sich nur 1-4 Zeichen in der Adresse unterscheiden.


    Hintergrund sind doppelte Einträge, die entstanden sind weil im Quellsystem beispielsweise ein Buchstabe falsch geschrieben wurde.


    Bin über jede Hilfe sehr dankbar. :]

  • Was konkret ist Deine Frage? Willst Du jetzt von uns einen Ähnlichkeits- Algorithmus?
    Unter Umständen tut @Soundex das, was Du willst, ansonsten gibt es sicher genügend freie Bibliotheken, an denen Du Dich bedienen kannst (auf Java- Basis sowieso, und für LotusScript müsstest Du halt bei VisualBasic- Beispielen suchen, die sind meist direkt auch in LotusScript zu verwenden).

  • Ja, der Ähnlichkeits- Algorithmus ist mein Ziel. Würde das ungern mit Formelsprache lösen.
    Die Frage ist eigentlich mit welchen Funktionen ich auf eine bestimmte Anzahl unterschiedlicher/zusätzlicher Zeichen prüfen kann.

  • Diese Funktion gibt es nicht. Das musst Du Dir selbst schreiben, oder auf fertige Lösungen zurückgreifen.


    Um konkreter zu werden (habe mal kurz aus Interesse gegoogelt) suchst Du nach einer VB- Implementierung des Levenstein- Distanz- Algorithmus
    Also z.B. diese:

  • Bei allem Respekt: den Ansatz als solchen halte ich schon für falsch. Egal wie und was du programmierst: der Code kann nicht entscheiden, was ein Dublette ist und was wirklich so gewollt ist. Woher soll der Code wissen, dass "Volker22" und "Volker21" entweder zwei verschiedene Personen sind oder die selbe mit Typo? Woher soll der Code wissen, ob (hier bei uns) die "Dudweiler Straße" und die "Dudweiler Landstraße" wirklich an zwei Ecken der Stadt liegen, oder ob eins davon eine Falscheingabe war? Und wenn dein Code das wissen sollte: kannst du unserem Pizzaheini Bescheid sagen? Der hat damit so seine Problemchen und wir warten jeden zweiten oder dritten Mittwoch auf unsere Nervennahrung. ;)


    Wer auch immmer Unsinn in die Datenbasis eingetragen hat, soll sie auch wieder fixen. Alles andere ist bestenfalls Augenwischerei, im schlimmsten Fall werden korrekte Daten "korrigiert" und hinterher ist das Geschrei groß.


    Auch wenn ich ein großer Freund davon bin, die Blödmannsgehilfentätigkeiten dem Computer zu überlassen: aber solange wir keine anständige KI haben, sollte lieber eine richtige I drangehen und noch warten, bis das K auch was taugt.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Diese Funktion gibt es nicht. Das musst Du Dir selbst schreiben, oder auf fertige Lösungen zurückgreifen.


    Um konkreter zu werden (habe mal kurz aus Interesse gegoogelt) suchst Du nach einer VB- Implementierung des Levenstein- Distanz- Algorithmus
    Also z.B. diese:

    Vielen Dank, glaube das hilft mir schon weiter !




    Woher soll der Code wissen, dass "Volker22" und "Volker21" entweder zwei verschiedene Personen sind oder die selbe mit Typo? Woher soll der Code wissen, ob (hier bei uns) die "Dudweiler Straße" und die "Dudweiler Landstraße" wirklich an zwei Ecken der Stadt liegen, oder ob eins davon eine Falscheingabe war?


    Der Code soll es nicht "wissen" und eigenständig Dokumente löschen sondern Einträge die sehr ähnlich sind einfach nur ausgeben damit diese manuell im Quellsystem bereinigt werden können. In der DB sind mehr als 10.000 Einträge deswegen ist im Prinzip eine automatisierte Eingrenzung nötig. An den Einträgen hängen auch wichtige Dokumente, d.h. es müsste sowieso händisch überprüft werden. Das durchscrollen bei 10.000 Einträgen dauert nur einfach doch etwas zu lange, deswegen will ich eine Vorauswahl durch den Agenten. :) Sorry wenn ich das nicht detailliert genug beschrieben habe.

  • Vom Löschen habe ich auch nichts gesagt ;)
    Hast du dir mal die @Like- und @Matches- Operatoren angeschaut? Die können in gewissen Grenzen Regexp ... zwar nicht ganz so, wie man es von den meisten Tools auf unixoiden Systemen gewohnt ist, aber für den geschilderten Einsatzbereich sollte das (vorerst) ausreichen.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Hast du dir mal die @Like- und @Matches- Operatoren angeschaut? Die können in gewissen Grenzen Regexp ... zwar nicht ganz so, wie man es von den meisten Tools auf unixoiden Systemen gewohnt ist, aber für den geschilderten Einsatzbereich sollte das (vorerst) ausreichen.

    @like habe ich mir schon angeschaut, @matches kannte ich tatsächlich noch nicht, das klingt allerdings ziemlich interessant.
    Wobei ich nicht wirklich wüsste wie die Logik hinter @matches für mein Problem aussehen sollte..

  • Da ließen sich schon Lösungen bauen:
    - wenn der Inhalt von Feld1 aus Doc1 @Matches Feld2 aus Doc2 (ggf. Regexp draus bauen), setze Flag in Doc2 (bspw. die UUID von Doc1), anschließend eine temporäre View, die nach dem Flag kategorisiert ist
    => sieht dann so aus:
    |> UUID: 4711
    - Doc5
    - Doc6
    - Doc12
    |> UUID: 0815
    - Doc3
    - Doc11
    - DocPiUndDrölfzich


    Dann hast du einen ungefähren Überblick, was Pi mal Daumen als ähnlich angesehen wird. Ist zwar immernoch eine Heidenarbeit, das Doc für Doc auseinander zu klamüsern, aber immerhin ein Ansatz.
    Der eklatante Nachteil ist natürlich, dass du
    a) das für alle Dokumente über alle Dokumente laufen lassen musst (10k x 10k). Aber das macht nix, kann nachts laufen
    b) alle Docs angepackt werden, was zum Einen die Docs selbst verändert (ist mglw. nicht gewünscht) und zum Anderen einen großen Replizieraufwand nach sich zieht. Das selbe hinterher, wenn du nach der Bereinigung die Flags wieder rausnimmst.


    Aber wie man es auch drehen und wenden mag und wie auch immer eine elegantere Lösung aussehen mag: zum Einen hat der Server erstmal genug zu tun, zum Anderen muss dann der Fachverantwortliche am Ende doch jedes Doc auf sachliche Richtigkeit kontrollieren. Kommt halt davon, wenn man bei der Datenerfassung und -pflege schlampig arbeitet, da muss er durch.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • b) alle Docs angepackt werden, was zum Einen die Docs selbst verändert (ist mglw. nicht gewünscht) und zum Anderen einen großen Replizieraufwand nach sich zieht. Das selbe hinterher, wenn du nach der Bereinigung die Flags wieder rausnimmst.

    durch das Flag setzen werden die Docs doch nicht wirklich verändert oder? Teilweise hängen da wichtige "Aktivitäten" drann, die nicht verloren gehen sollen. Aber wie du schon sagst müssen die Einträge ja eh von den Verursachern manuell überprüft werden, solange da also nichts verloren geht wäre das also kein Problem. Ich teste das auch vorerst an einer Kopie der Datenbank.


    Noch eine dumme Frage: Kann ich die @Befehle auch einfach in einer neuen View verwenden oder müssen die in einen Agenten?
    In einer View würde ja eh nichts passieren können eigentlich...

  • Wenn du ein Flag setzt auf einem Dokument dann wird dieses Dokument erst mal verändert, d.h. es bekommt auch einen neuen Timestamp und interne Systemfelder werden ebenfalls verändert.


    Am Inhalt des Dokumentes selbst, also die restlichen Felder, verursacht das erst mal keine Änderung, außer du berechnest das Dokument neu durch.


    In einer View kannst du nur auf Dokumentebene arbeiten, aber nicht Dokumente miteinander vergleichen, das geht nur mit Agenten und entsprechendem Code.
    Wenn du die als Aktion in eine View machst werden die betroffenen Dokumente ebenfalls verändert, nur, daß du es dann manuell ausführen musst und da wird der Lauf recht lange dauern, bei der Anzahl an Vergleichen

  • Also der Levenshtein-Algorithmus funktioniert mit Teststrings wunderbar und liefert ein gutes Ergebnis.
    Ich versuche nun die Werte einer Spalte abzugleichen, das sieht momentan so aus:


    Bekomme beim Ausführen die Fehlermeldung "Division by zero", was ich mir nicht so recht erklären kann.


    Ziel ist eigentlich nur noch Wert 1 aus Spalte 5 mit Wert 2 aus Spalte 5 / Wert 2 mit Wert 3 usw. zu vergleichen.


    Dann kann ich mir alle Dokumente über einem gewissen Schwellwert ausgeben lassen und das Problem wäre erledigt.
    (zumindest mein Anteil des Problems :) )

  • Ohne genau zu wissen wo der Fehler auftritt ist das schwer zu sagen.


    Ein sauberer Errorhandler ist da Pflicht.


    Beim print fehlen auch noch & zum Verknüpfen des Results mit dem Text bzw sogar noch ein cstr drum um das ganze in einen String umzuwandeln