Нечеткое сопоставление строк для распространенных многосимвольных ошибок OCR в python
Я пытаюсь сделать нечеткое сопоставление некоторых результатов распознавания и хочу учесть общие ошибки распознавания. В частности, я сопоставляю улицы с базой данных улиц. Я выяснил, как уменьшить вес общих односимвольных ошибок подстановки с помощью пакета weighted-levenshtein, но, похоже, он работает только с одиночными символами, когда многие из наиболее распространенных ошибок - это такие вещи, как "li" - "h".
Прямо сейчас, "Mam" наиболее близко соответствует "MAY ST", когда я действительно хотел бы, чтобы оно совпадало с "MAIN ST". Я хотел бы иметь возможность встроить что-то, что знает, что "IN" и "M" часто соответствуют, потому что "in" читается как "m" OCR.
Вот текущий код, с которым я работаю (я вставляю с понижением веса, потому что некоторые улицы, с которыми я работаю, сокращены или отсутствуют "St", "Ave" и т. Д.):
import numpy as np
from weighted_levenshtein import lev, osa, dam_lev
def lratio(str1,str2):
insert_costs = 0.5*np.ones(128, dtype=np.float64)
delete_costs = np.ones(128, dtype=np.float64)
substitute_costs = np.ones((128, 128), dtype=np.float64)
substitute_costs[ord('O'), ord('0')] = 0.25
substitute_costs[ord('0'), ord('O')] = 0.25
substitute_costs[ord('I'), ord('T')] = 0.5
substitute_costs[ord('T'), ord('I')] = 0.5
ldistance = lev(str1, str2, insert_costs=insert_costs, delete_costs=delete_costs, substitute_costs=substitute_costs)
return (1.0 - float(ldistance) / float(len(str1) + len(str2))) * 100.0
Я не думаю, что есть способ изменить взвешенный Левенштейн для многосимвольной замены. Но если бы было, было бы здорово. Бьюсь об заклад, есть пакет с такой способностью - возможно, пакет с уже встроенной библиотекой распространенных ошибок.
Есть идеи?