我试图将一组字符串与已定义的字符串集进行比较。例如,您想要找到信件的收件人,该信件的文本是通过OCR数字化的。
有一个地址数组,其中包含字典作为元素。每个唯一的元素都包含ID、名称、街道、邮政编码和城市。此列表将长达1000个条目。
由于OCR扫描的文本可能不准确,因此我们需要在包含地址的列表中查找最佳匹配的字符串候选项。
该文本长度为750个单词。我们使用适当的过滤函数来减少单词数量,首先按空格分割,从每个元素中删除更多空格,删除所有少于5个字符的单词并删除重复项;生成的列表长度为200个单词。
由于每个收件人都有4个字符串(姓名、街道、邮政编码和城市),而其余的信件长度为200个单词,我的比较必须运行4 * 1000 * 200 = 800,000次。
我已经使用Python取得了一定的成功。匹配已正确找到。但是,算法处理大量信件需要很长时间(每1500封信长达50小时)。已应用列表理解。有没有一种方法可以正确(而不是不必要地)实现多线程?如果此应用程序需要在低规格服务器上运行怎么办?我的6核CPU对这样的任务没有抱怨,但是我不知道在小型AWS实例上处理大量文档需要多长时间。
有一个地址数组,其中包含字典作为元素。每个唯一的元素都包含ID、名称、街道、邮政编码和城市。此列表将长达1000个条目。
由于OCR扫描的文本可能不准确,因此我们需要在包含地址的列表中查找最佳匹配的字符串候选项。
该文本长度为750个单词。我们使用适当的过滤函数来减少单词数量,首先按空格分割,从每个元素中删除更多空格,删除所有少于5个字符的单词并删除重复项;生成的列表长度为200个单词。
由于每个收件人都有4个字符串(姓名、街道、邮政编码和城市),而其余的信件长度为200个单词,我的比较必须运行4 * 1000 * 200 = 800,000次。
我已经使用Python取得了一定的成功。匹配已正确找到。但是,算法处理大量信件需要很长时间(每1500封信长达50小时)。已应用列表理解。有没有一种方法可以正确(而不是不必要地)实现多线程?如果此应用程序需要在低规格服务器上运行怎么办?我的6核CPU对这样的任务没有抱怨,但是我不知道在小型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分钟),而不是处理1500个字母需要50小时。我相信这是瓶颈,因为其他任务都能快速无误地完成。
有没有更好(更快)的方法来做到这一点?
SequenceMatcher
可能是二次的,这非常慢。你为什么选择了SequenceMatcher
? - Dani MesejoO(n^2)
。 - gold_cy