J'ai deux gros fichiers contenant des paragraphes de texte anglais:
- Le premier texte fait environ 200 pages et compte environ 10 paragraphes par page (chaque paragraphe fait 5 phrases).
- Le deuxième texte contient presque exactement les mêmes paragraphes et texte que le premier. Il comprend également 200 pages et 10 paragraphes par page. Cependant, les paragraphes sont randomisés et dans un ordre différent par rapport au premier texte. En outre, un grand pourcentage des paragraphes ont de petits changements de formulation par rapport à des paragraphes similaires. Par exemple, un paragraphe dans le premier texte pourrait avoir une phrase similaire
Like Jimmy, I wanted to go to the palace
tandis que la phrase correspondante dans le paragraphe du deuxième texte se liraitLike Jimmy, I really wanted to go to the castle
.
Je veux pouvoir capturer les changements ici comme l'ajout really
et la suppression de palace
avec le remplacement de castle
. Si les paragraphes étaient à peu près alignés, cela serait assez trivial car il existe de nombreuses façons de différencier le texte. Cependant, comme les paragraphes ne sont pas alignés, ce n'est pas le cas.
Si les fichiers étaient petits (quelques paragraphes), Levenshtein Distance fonctionnerait probablement bien, mais comme les fichiers sont énormes, il serait inefficace de comparer chaque paragraphe du texte 1 à chaque paragraphe du texte 2 pour savoir quels paragraphes correspondent.
Quelles seraient d'autres approches à ce problème pour le gérer efficacement?
Réponses:
La comparaison de 2000 paragraphes à 2000 paragraphes ne représente que quatre millions de comparaisons.
La clé du problème n'est pas d'utiliser une fonction qui calcule la distance de Levenshtein mais d'en utiliser une qui calcule la distance de Levenshtein si la distance est inférieure à un certain seuil , et échoue (ou, plutôt, renvoie + ∞) si la distance est supérieur au seuil.
En effet, vous n'êtes intéressé que par des paragraphes étroitement similaires. Vous n'avez aucun intérêt à la distance précise entre des paragraphes suffisamment différents pour ne pas être liés. Ainsi, dès qu'une distance est suffisamment élevée pour être inintéressante, la fonction peut sortir immédiatement; et cela se produira surtout très tôt lors de l'exécution de la fonction.
Plus le seuil est élevé, plus la durée de fonctionnement est longue, mais plus la proportion de faux négatifs est faible.
Si vous en savez plus sur les documents (par exemple, que chaque paragraphe correspond au plus à un paragraphe de l'autre document), vous pouvez effectuer un passage avec un seuil bas, exclure les paragraphes correspondants de plus amples considérations, effectuer un passage au-dessus de votre texte désormais réduit. corpus avec un seuil plus élevé, exclure les paragraphes réduits, etc.
Détail de l'implémentation: vous calculeriez probablement une distance Levenshtein sur les mots plutôt que sur les caractères. Si tel est le cas, vous devez d'abord attribuer un numéro à chaque mot - par exemple, en triant le corpus entier, en appelant le premier mot «1», le deuxième mot «2», etc. De cette façon, vos comparaisons de paragraphes se feraient en comparant des nombres plutôt que des mots, ce qui est plus rapide.
la source
Il pourrait être possible d'utiliser une approche composée. Peut-être que quelqu'un peut s'appuyer sur cela ...
Hachez le contenu du paragraphe de manière à ce que les paragraphes avec de légères différences aient des hachages similaires, puis ordonnez les hachages pour déterminer les paragraphes à comparer via une méthode plus exacte (diff ou quelque chose de similaire).
Par exemple, en tant qu'algorithme de hachage rudimentaire, que se passe-t-il si vous additionnez les valeurs ascii des caractères et modulez ensuite la somme par un grand nombre comme 2 000 000 000? Cela entraînerait 2 paragraphes avec seulement quelques mots ajoutés ou soustraits d'avoir des valeurs de hachage qui sont probablement plus proches les uns des autres que les paragraphes avec des mots très différents, et donc, ils seront beaucoup plus proches sur la liste que les paragraphes très différents (vous pourriez dire les hachages à proximité dans ce cas sont nécessaires mais pas suffisants pour des paragraphes similaires). Évidemment, vous devez tenir compte de l'habillage causé par modulo et considérer un paragraphe avec la valeur de hachage 1999,999,999 comme étant seulement une distance de 1 à un avec une valeur de 0, etc.
En conséquence, pourrait réduire le nombre de comparaisons entre les paragraphes que vous devez effectuer d'un montant substantiel (vous n'auriez pas à comparer chaque paragraphe d'un texte à chaque paragraphe de l'autre texte) - vous pourriez comparer un paragraphe à les paragraphes du texte 2 en fonction de la proximité de leurs hachages (effectuez d'abord les valeurs de hachage les plus proches) et invoquez ici un algorithme plus coûteux pour déterminer s'ils sont "suffisamment similaires" pour être considérés comme identiques.
la source