Я пишу функцию для сравнения двух строк (вариант использования заключается в сравнении банковской выписки с исходной строкой, созданной в момент выставления счета). Мне интересно узнать, сколько процентов (долей) меньшей строки 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
что правильно.
Теперь вопрос: есть ли более элегантный способ выполнить ту же задачу? Если я снова прочитаю этот код через несколько лет, я, вероятно, больше его не пойму...
В будущем так и сделаю, спасибо за подсказку.
Не изобретая заново велосипед, существует ряд четко определенных показателей, которые можно использовать для сравнения строк и оценки сходства, например. расстояние Левенштейна:
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), но только 0,34 в Левенштейне. Так что на данный момент я буду придерживаться своего алгоритма, даже если он уродлив. Ваш ответ дает много альтернативных результатов в Google, которые могут помочь кому-то еще. Для этого вы получаете принятый ответ.
Если ваш код работает и все, что вы хотите, это улучшить его, то вам следует опубликовать свой вопрос на codereview.stackexchange.com.