längster gemeinsamer Teilstring in R, der nicht zusammenhängende Übereinstimmungen zwischen den beiden Strings findet

9

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%     
IAMTubby 01.02.2015, 10:45
quelle

3 Antworten

4

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.

%Vor%

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.

%Vor%

Die M -Werte beziehen sich also auf alle Übereinstimmungen. Wir können die Teilstrings mit stri_sub()

holen %Vor%

Entschuldigung, ich habe das nicht sehr gut erklärt, da ich mich mit String-Distanz-Algorithmen nicht auskenne.

    
Rich Scriven 01.02.2015 13:55
quelle
0

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%     
lawyeR 01.02.2015 12:22
quelle
0

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:

%Vor%

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

%Vor%

Alle identifizieren nur 'hello ' als längste gemeinsame Teilzeichenfolge anstelle von ' hello r' :

%Vor%

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 :

betrachtet %Vor%

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 )

%Vor%

Schließlich, vergessen Sie nicht, adist können Sie in ignore.case = TRUE übergeben ( FALSE ist der Standardwert)

    
The Red Pea 28.10.2015 07:08
quelle

Tags und Links