classification
Title: difflib SequenceMatcher 200 char length limitation for ratio calculation
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.6
process
Status: closed Resolution: duplicate
Dependencies: Superseder: difflib SequenceMatcher ratio() still have unpredictable behavior
View: 31889
Assigned To: Nosy List: Daniel Pezoa, tim.peters
Priority: normal Keywords:

Created on 2020-01-07 19:42 by Daniel Pezoa, last changed 2020-01-11 01:04 by terry.reedy. This issue is now closed.

Messages (2)
msg359534 - (view) Author: Daniel Pezoa (Daniel Pezoa) Date: 2020-01-07 19:42
I am using the SequenceMatcher object of the difflib library and I have noticed that a drastic failure occurs when the text strings exceed 200 characters

Source code:
=====================================================================

from difflib import SequenceMatcher

def main():
    # Throw a value of 7% when they are almost equal for having more than 200 characters
    text1 = "aceite y pez hirviendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las manos"
    text2 = "aceite y pedir viendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las manos"
    m = SequenceMatcher(None, text1, text2)
    x = m.ratio()
    porcentaje = (int)(x * 100)
    print("{}\n\n{}\n\n{}\n\nBad: {}%\n\n".format(text1, text2, x, porcentaje))

    # Throw the expected value of 99% for having less than 200 characters
    text1 = "aceite y pez hirviendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las"
    text2 = "aceite y pedir viendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las"
    text1 = "aceite y pez hirviendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas"
    text2 = "aceite y pedir viendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas"
    m = SequenceMatcher(None, text1, text2)
    x = m.ratio()
    porcentaje = (int)(x * 100)
    print("{}\n\n{}\n\n{}\n\nGood: {}%".format(text1, text2, x, porcentaje))


if __name__== "__main__":
    main()


Output:
======================================================================

aceite y pez hirviendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las manos

aceite y pedir viendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas y encendidas que no podan desprenderse ni arrancarse sin quemarse las manos

0.0794044665012407

Bad: 7%


aceite y pez hirviendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas

aceite y pedir viendo que vena de la plataforma y de la cual salan tambin muchsimas flechas rodeadas de estopas alquitranadas

0.9800796812749004

Good: 98%
msg359551 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2020-01-07 21:30
Try passing

    autojunk=False

to the SequenceMatcher constructor.

More on that here:

    https://bugs.python.org/issue31889
History
Date User Action Args
2020-01-11 01:04:50terry.reedysetstatus: open -> closed
superseder: difflib SequenceMatcher ratio() still have unpredictable behavior
resolution: duplicate
stage: resolved
2020-01-07 21:30:12tim.peterssetnosy: + tim.peters
messages: + msg359551
2020-01-07 19:42:59Daniel Pezoacreate