2008-09-29 10 views
2

J'essaie d'utiliser Difflib.SequenceMatcher pour calculer les similitudes entre deux fichiers. Ces deux fichiers sont presque identiques sauf que l'un contient des espaces supplémentaires, des lignes vides et d'autres non. J'essaie d'utiliserDifflib.SequenceMatcher isjunk requête de paramètre facultatif: comment ignorer les espaces, les tabulations, les lignes vides?

s=difflib.SequenceMatcher(isjunk,text1,text2) 
ratio =s.ratio() 

dans ce but. Donc, la question est de savoir comment écrire l'expression lambda pour cette méthode isjunk de sorte que la méthode SequenceMatcher évite tous les espaces, les lignes vides, etc. J'ai essayé d'utiliser le paramètre lambda x: x == "", mais le le résultat n'est pas aussi bon. Pour deux textes très similaires, le ratio est très faible. Ceci est fortement contre-intuitif.

Pour des fins d'essai, voici les deux chaînes que vous pouvez utiliser sur les tests:

Que jwovu Motive pour faire votre travail Eh bien? OK, c'est une entrée en essayant de gagner 100 $ de développement de logiciels livres malgré le fait que je ne lire

livres de programmation. Afin de gagner le prix vous devez écrire une entrée et
ce motivatesfggmum pour faire votre travail bien. D'où ce post. Premier motivation

argent. Je sais, cela ne ressemble pas une grande inspiration à beaucoup, et disant que l'argent est l'un des facteurs de motivation pourrait juste sauter mes chances .

Comme si l'argent est un tabou dans la programmation monde. Je sais qu'il y a des gens qui ne peuvent pas être motivés par l'argent. Mme, sur D'autre part, je vis dans un monde réel ,

avec hypothèque de la maison à payer, moi-même aliments et les factures pour couvrir. Donc, je ne peux pas vraiment exclure l'argent de mon considération. Si je peux obtenir un grand somme d'argent pour

faire un bon travail, puis définitivement booster mon moral. Je ne vais pas prendre soin si J'utilise un vieux poste de travail, ou forcée de partager des chambres ou cabine avec autres

personnes, ou doivent mettre en place avec un patron ennuyeux, ou autre chose.Le fait à la fin de la journée, je marcherai avec un gros tas d'argent lui-même me suffit

pour à surmonter tous les obstacles, mis en place avec tous les sentiments durs et egos blessés, tolérer un ordinateur lent et même supporter

et voici une autre chaîne

Qu'est-ce qui vous motive à faire votre travail Eh bien? OK, ceci est une entrée en essayant de gagner 100 $ de valeur de développement de logiciels livres, en dépit du fait que je n'ai pas lire des livres de programmation. Afin de gagner le prix, vous devez écrire une entrée et décrit ce qui vous motive pour bien faire votre travail. D'où ce post.

Première motivation, argent. Je sais, ce ne ressemble pas à une grande source d'inspiration pour beaucoup, et en disant que l'argent est l'un des facteurs de motivation pourrait juste souffler mes chances loin. Comme si l'argent était un tabou dans le monde de la programmation. Je sais il y a des gens qui ne peuvent pas être motivés par l'argent. Bravo à eux. Moi, d'autre part, je vis dans un vrai monde , avec hypothèque maison à payer, moi-même pour nourrir et factures à couvrir. Donc, je ne peux pas vraiment exclure l'argent de mon considération.

Si je peux obtenir une grosse somme d'argent pour faire un bon travail, alors ce va certainement améliorer mon moral. Je ne vais pas prendre soin de si j'utilise un ancien poste de travail , ou forcé de partager des chambres ou une cabine avec d'autres personnes, ou avoir pour supporter un boss ennuyeux, ou peu importe. Le fait que la fin de le jour je vais partir avec un grand tas d'argent lui-même est assez pour moi pour surmonter tous les obstacles, mis avec tous les sentiments durs et blessé egos, tolérer un ordinateur lent et même endurent

j'ai couru la commande ci-dessus, et réglez l'isjunk lambda x: x == » », le rapport est seulement 0,36.

Répondre

6

Si vous correspondez à tous les espaces blancs la similitude est mieux:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio() 

Cependant, difflib n'est pas idéal pour un tel problème, car ce sont deux documents presque identiques, mais les fautes de frappe et de telles différences produisent pour difflib où un être humain n'en verrait pas beaucoup.

Essayez de lire sur tf-idf, Bayesian probability, Vector space Models et w-shingling

J'ai écrit une implementation of tf-idf application à un espace vectoriel et en utilisant le produit scalaire en tant que mesure de distance pour classer les documents.

+0

Le lien vers votre implémentation semble être cassé! – Priyank

1

Je n'ai pas utilisé Difflib.SequenceMatcher, mais avez-vous envisagé de pré-traiter les fichiers pour supprimer toutes les lignes vides et les espaces (peut-être via des expressions régulières), puis de faire la comparaison?

1

Utilisation de vos chaînes d'échantillons:

>>> s=difflib.SequenceMatcher(lambda x: x == '\n', s1, s2) 
>>> s.ratio() 
0.94669848846459825 

Fait intéressant, si « » est également comprise comme indésirable:

>>> s=difflib.SequenceMatcher(lambda x: x in ' \n', s1, s2) 
>>> s.ratio() 
0.7653142402545744 

On dirait les nouvelles lignes ont un effet beaucoup plus que les espaces.

1

Compte tenu des textes ci-dessus, le test est en effet comme le suggère:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio() 

Cependant, pour accélérer les choses un peu, vous pouvez profiter de method-wrappers de CPython:

difflib.SequenceMatcher(" \t\n".__contains__, doc1, doc2).ratio() 

Cela évite beaucoup Appels de fonction python.

Questions connexes