Quels sont les moyens efficaces de trouver les différences entre deux grands corpus de texte qui ont un contenu similaire mais ordonné différemment?

8

J'ai deux gros fichiers contenant des paragraphes de texte anglais:

  1. Le premier texte fait environ 200 pages et compte environ 10 paragraphes par page (chaque paragraphe fait 5 phrases).
  2. 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 palacetandis que la phrase correspondante dans le paragraphe du deuxième texte se lirait Like Jimmy, I really wanted to go to the castle.

Je veux pouvoir capturer les changements ici comme l'ajout reallyet la suppression de palaceavec 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?

vikram7
la source
Les paragraphes sont-ils au moins proches les uns des autres, disons dans un "rayon" de 10 environ? Une idée générale serait de prétraiter d'une manière ou d'une autre. Par exemple, trouvez des mots qui changent rarement (noms?) Et ne comparez que ceux qui partagent au moins ces derniers.
Raphael
Vous pouvez essayer un outil de détection de clone. Ils sont destinés à être utilisés pour les langages de programmation, mais à part cela, conçus pour ce problème. CCFinder fonctionnerait probablement.
reinierpost
3
Voici un problème similaire avec quelques réponses: cs.stackexchange.com/questions/47794/…
wvxvw
1
Avez-vous essayé l'utilitaire de ligne de commande "diff"?
usul
@Raphael Pouvez-vous développer ce que vous entendez par prétraitement ici? De plus, les paragraphes apparaissent dans des "sections" du document, une section peut être assez longue (comme 50 à 60 paragraphes) et non ordonnée.
vikram7

Réponses:

1

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.

Martin Kochanski
la source
-1

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.

MajBoredom
la source
2
Si vous parlez de paragraphes de texte, la somme des valeurs ASCII mod deux milliards est la somme des valeurs ASCII. À moins que votre paragraphe ne compte plus de huit millions de caractères, c'est-à-dire ... Donc, cette réponse semble plutôt piratée, en fonction de ce à quoi vous pensiez à l'époque. Avez-vous des preuves que l'approche que vous proposez est efficace? Est-il soutenu par des expériences ou des recherches publiées?
David Richerby