Найти относительное совпадение двух строк

#python #python-3.x #pattern-matching #string-comparison #fractions

#python #python-3.x #сопоставление с образцом #сравнение строк #дроби

Вопрос:

Я пишу функцию для сравнения двух строк (вариант использования — сравнить банковскую выписку с исходной строкой, созданной в момент выставления счета). Мне интересно узнать, сколько процентов (долей) меньшей строки compareSting находится внутри исходной строки. Необходимо учитывать как минимум 4 последовательных символа. Порядок сопоставления не имеет значения.

 def relStringMatch(originalString,compareString):

    smallestMatch=4

    originalString=originalString.upper()
    compareString=compareString.upper()

    stringLength=len(compareString)
    lastTest=stringLength-smallestMatch

    index=0
    totalMatch=0
    while index < lastTest:
        nbChars = smallestMatch
        found=False
        while (index nbChars) <= stringLength:
            checkString=compareString[index:index nbChars]
            if originalString.find(checkString) <0:
                if (nbChars==smallestMatch): nbChars=0
                nbChars-=1
                break
            else: found=True
            nbChars =1
        if found:
            totalMatch =nbChars
            index =nbChars
        else: index =1
    return totalMatch / stringLength
 

Код работает хорошо, в качестве примера:

 relStringMatch("9999EidgFinanzverwaltungsteuer", "EIDG. FINANZVERWALTUNG")
 

выводит результат: 0.95 который является правильным.

Теперь вопрос: есть ли более элегантный способ выполнить ту же задачу? Если я снова прочитаю этот код через несколько лет, я, вероятно, больше не буду его понимать…

Комментарии:

1. Если ваш код работает, и все, что вы хотите, это улучшить его, тогда вам следует опубликовать свой вопрос в codereview.stackexchange.com .

2. Я сделаю это в будущем, спасибо за совет.

Ответ №1:

Не изобретая велосипед, существует ряд четко определенных показателей, которые вы можете использовать для сравнения строк и оценки сходства, например, расстояние Левенштейна:

https://en.wikipedia.org/wiki/Levenshtein_distance

Для каких библиотек python, реализующих его, уже существуют:

https://pypi.org/project/python-Levenshtein/

 from Levenshtein import ratio
ratio('Hello world!', 'Holly grail!')
# 0.583333...

ratio('Brian', 'Jesus')
# 0.0
 

Комментарии:

1. Отлично, спасибо. Левенштейн также может быть вариантом, поскольку он намного короче и понятнее для чтения. У этого есть недостаток: в финансовых транзакциях обычно очень мало орфографических ошибок, но часто порядок слов меняется или прерывается. Эти два фактора дают низкий коэффициент Левенштейна, даже если информация верна.

2. в финансовых отчетах вы часто находите слова, заменяющие друг друга: «Анна Роза» переходит в «Роза Анна», которые совпадают в моем алгоритме (результат = 1), но только 0,34 в Левенштейне. Поэтому на данный момент я буду придерживаться своего алгоритма, даже если он уродлив. Ваш ответ дает много альтернативных результатов в Google, которые могут помочь кому-то еще. Для этого вы получаете принятый ответ.