Est-ce que quelqu'un connaît-il d'un package R qui résout Le plus long problème de substration commun ? Je cherche quelque chose de rapide qui pourrait travailler sur des vecteurs. P>
4 Réponses :
Consultez le "rlibstree" package sur omégahat github p>
Ceci utilise http://www.icir.org/christian/libstree/ . p>
Pouvez-vous poster des exemples de code du résultat de la comparaison de 'Hello World' code> et
'Hella Old' code>? Produit-t-il
'enfer' code> ou
'enfer vieux' code>?
Le premier lien est cassé
Je ne sais pas r, mais j'avais l'habitude de mettre en œuvre l'algorithme de Hirschberg qui est rapide et ne consommant pas trop d'espace. P>
Comme je me souviens que c'est seulement 2 ou 3 appelé de courtes fonctions courtes. P>
Voici un lien: http://wordaligned.org/articles/longest-commmon-subence P >
N'hésitez pas à la mettre en œuvre dans R, cela vaut l'effort puisqu'il s'agit d'un algorithme très intéressant. p>
Mais Vereb, c'est-à-dire l'algorithme de recherche courante le plus long? La recherche suivante est différente de la sous-chaîne, non? Comme demandé ici: Stackoverflow.com/q/28261825/1175496
Vous devez regarder la fonction LCS code> de
Qualv code>. Il est mis en œuvre C, donc assez efficace. P>
Remarque: cette fonction trouvera la recherche courante la plus longue (dans le sens mathématique de la séquence), pas la sous-chaîne. Ainsi, par exemple Il ignorera les personnages au milieu des cordes pour trouver des matchs entre eux. Pour plus de détails, voir ici:
La question ici n'est pas totalement claire sur l'application envisagée de la solution au plus long problème de sous-chaîne commun. Une application commune que je rencontre correspond à des noms de différents ensembles de données. Le package en bref strong>, parallélisation strong>: une autre caractéristique intéressante de Exemple d'application forte>: p> stringdist CODE> a une fonction utile
amorque () code> que je trouve approprié pour cette tâche.
amorque ( ) code> prendra en entrée deux vecteurs, le premier est
x code> le vecteur des chaînes que vous souhaitez trouver des correspondances (ceci peut aussi simplement être une seule chaîne), le second est
Table Code>, qui est le vecteur des chaînes que vous souhaitez faire des comparaisons et choisir le match avec la plus longue sous-chaîne commune.
amorch () code> retournera ensuite un vecteur dont la longueur est égale à celle de
x code> - chaque élément de ce résultat sera un index dans la table
code> qui contient le meilleure correspondance. p>
Amatch () code> prend une méthode code> argument code>, que vous spécifiez être
LCS code> si vous souhaitez correspondre sur la plus longue sous-chaîne commune. Il existe de nombreuses autres options pour différentes techniques de correspondance de chaînes (par exemple la distance par E. Levenshtein). Il existe également un argument obligatoire
maxdiste code>. Si toutes les chaînes de
Table code> sont plus grandes "distance" d'une chaîne donnée dans
x code>, alors
amorch () code> retournera
na code> pour cet élément de sa sortie. "Distance" est défini différemment en fonction de l'algorithme de correspondance de chaîne que vous choisissez. Pour LCS, il (plus ou moins) signifie simplement combien il y a de caractères différents (non correspondants). Voir la documentation pour plus de détails. P>
Amatch () code> est-ce qu'il mettra automatiquement la mise en place de l'opération pour vous, faisant des suppositions raisonnables sur ressources système à utiliser. Si vous souhaitez plus de contrôle sur ceci, vous pouvez basculer l'argument
NTthread code>. P>
Names1 = c(
"hello"
)
Names2 = c(
"hel123l5678o",
"hell"
)
Match_Idx = amatch(tolower(Names1), tolower(Names2), method = 'lcs', maxDist = Inf)
Matches = data.frame(Names1, Match = Names2[Match_Idx])
Matches
# 1 hello hell