Я пытался сравнить набор строк с уже определенным набором строк.Например, вы хотите найти адресата письма, текст которого оцифровывается через OCR.
Существует массив адресов, в которых в качестве элементов используются словари.Каждый уникальный элемент содержит идентификатор, имя, улицу, почтовый индекс и город.Этот список будет иметь длину 1000 записей.
Поскольку отсканированный текст OCR может быть неточным, нам нужно найти наиболее подходящих кандидатов строк со списком, который содержит адреса.
Текст750 слов.Мы уменьшаем количество слов, используя подходящую функцию фильтра, которая сначала разбивает пробелы, удаляет больше пробелов из каждого элемента, удаляет все слова длиной менее 5 символов и удаляет дубликаты;длина полученного списка составляет 200 слов.
Поскольку у каждого адресата есть 4 строки (название улицы, почтовый индекс и город), а длина оставшейся буквы составляет 200 слов, мой компилятор должен выполнить 4 *1000* 200 = 800'000 раз.
Я использовал Python со средним успехом.Матчи были правильно найдены.Однако алгоритм обрабатывает много писем очень долго (до 50 часов на 1500 писем).Понимание списка было применено.Есть ли способ правильно (и не обязательно) реализовать многопоточность?Что делать, если это приложение должно работать на сервере с низкой спецификацией?Мой 6-ядерный процессор не жалуется на такие задачи, однако я не знаю, сколько времени потребуется для обработки большого количества документов на небольшом экземпляре AWS.
>> len(addressees)
1000
>> addressees[0]
{"Name": "John Doe", "Zip": 12345, "Street": "Boulevard of broken dreams 2", "City": "Stockholm"}
>> letter[:5] # already filtered
["Insurance", "Taxation", "Identification", "1592212", "St0ckhlm", "Mozart"]
>> from difflib import SequenceMatcher
>> def get_similarity_per_element(addressees, letter):
"""compare the similarity of each word in the letter with the addressees"""
ratios = []
for l in letter:
for a in addressee.items():
ratios.append(int(100 * SequenceMatcher(None, a, l).ratio())) # using ints for faster arithmatic
return max(ratios)
>> get_similarity_per_element(addressees[0], letter[:5]) # percentage of the most matching word in the letter with anything from the addressee
82
>> # then use this method to find all addressents with the max matching ratio
>> # if only one is greater then the others -> Done
>> # if more then one, but less then 3 are equal -> Interactive Promt -> Done
>> # else -> mark as not sortable -> Done.
Я ожидал более быстрой обработки длякаждый документ.(Максимум 1 минута), не 50 часов на 1500 букв.Я уверен, что это узкое место, так как другие задачи работают быстро и безупречно.
Есть ли лучший (более быстрый) способ сделать это?