Ich habe eine Frage bezüglich der Suche nach dem längsten gemeinsamen Teilstring in R. Während ich ein paar Posts auf StackOverflow durchsucht habe, habe ich etwas über das qualV-Paket erfahren. Ich sehe jedoch, dass die LCS-Funktion in diesem Paket tatsächlich alle Zeichen von string1 findet, die in string2 vorhanden sind, auch wenn sie nicht zusammenhängend sind.
Um zu erklären, ob die Strings sind string1: " hel lo" string2: " hel 12345lo" Ich erwarte, dass die Ausgabe hel ist, aber ich bekomme die Ausgabe als hallo. Ich muss etwas falsch machen. Bitte sehen Sie meinen Code unten.
%Vor%Ich habe auch die Rlibstree-Methode ausprobiert, aber ich bekomme immer noch Teilstrings, die nicht zusammenhängend sind. Auch die Länge des Teilstrings ist von meiner Erwartung entfernt. Siehe unten.
%Vor%Hier sind drei mögliche Lösungen.
%Vor% Es gibt auch adist()
und agrep()
in der Basis R, und das Paket stringdist
hat einige Funktionen, die die LCS-Methode ausführen. Hier ist ein Blick auf stringsidt
. Es gibt die Anzahl der ungepaarten Zeichen zurück.
Nun, da ich das ein bisschen mehr erforscht habe, denke ich, adist()
könnte der richtige Weg sein. Wenn wir counts=TRUE
setzen, erhalten wir eine Folge von Übereinstimmungen, Einfügungen usw. Wenn Sie also stri_locate()
angeben, können wir diese Matrix verwenden, um die Übereinstimmungen von a nach b zu erhalten.
Die M
-Werte beziehen sich also auf alle Übereinstimmungen. Wir können die Teilstrings mit stri_sub()
Entschuldigung, ich habe das nicht sehr gut erklärt, da ich mich mit String-Distanz-Algorithmen nicht auskenne.
Ich bin mir nicht sicher, was Sie getan haben, um Ihre Ausgabe von "Hallo" zu erhalten. Auf der Basis von Versuch-und-Irrtum-Experimenten unten scheint es, dass die Funktion LCS
(a) eine Zeichenfolge nicht als eine LCS betrachtet, wenn ein Zeichen folgt, was ansonsten eine LCS wäre; (b) mehrere gleich lange LCSs finden (im Gegensatz zu sub (), die nur die erste finden); (c) die Reihenfolge der Elemente in den Strings spielt keine Rolle - was unten keine Illustration hat; und (b) die Reihenfolge der Zeichenfolge in dem LCS-Aufruf spielt keine Rolle - auch nicht gezeigt.
Also, Ihr "Hallo" von a hatte keine LCS in b, da das "hel" von b von einem Zeichen gefolgt wurde. Nun, das ist meine derzeitige Hypothese.
Punkt A oben:
%Vor%Punkt B oben:
%Vor% Nutzen Sie @ RichardScriven's Einsicht, dass adist
verwendet werden könnte, aber diese Funktion kombiniert alles,
BEARBEITEN Das war schwierig, weil wir das longest_string
in zwei Kontexten bekommen mussten, also habe ich diese Funktion gemacht:
Dies kombiniert @ RichardSriven's Arbeit mit der Bibliothek ...
%Vor% Wir können es umschreiben, um die Verwendung von externen Bibliotheken zu vermeiden (aber immer noch adist
verwenden) ...
Alle identifizieren nur 'hello '
als längste gemeinsame Teilzeichenfolge anstelle von ' hello r'
:
EDIT Und seit der Bearbeitung funktioniert, unabhängig davon, welches Argument das längere der beiden ist:
%Vor%LETZTE BEARBEITUNG Aber das ist nur gut, wenn Sie dieses Verhalten akzeptieren. Beachten Sie dieses Ergebnis:
%Vor% Ich habe 'hello'
erwartet, aber da sich die Transformation tatsächlich (über die Löschung) bewegt, wird die o rld zur Hölle o , also nur die Hölle Teil wird als eine Übereinstimmung nach dem M
:
Dieses Verhalten wird mit [diesem Levenstein-Werkzeug] beobachtet - es gibt zwei mögliche Lösungen, die diesen beiden Transformationen entsprechen; Können wir a zeigen, welches wir bevorzugen? (der mit der größeren Anzahl von aufeinanderfolgenden M
)
Schließlich, vergessen Sie nicht, adist können Sie in ignore.case = TRUE
übergeben ( FALSE
ist der Standardwert)