Python ускоряет цикл сравнения текстаPython

Программы на Python
Anonymous
 Python ускоряет цикл сравнения текста

Сообщение Anonymous »

У меня есть цикл, который сравнивает уличные адреса.
Затем он использует нечеткое сопоставление для токенизации адресов и сравнения адресов. Я пробовал это как с fuzzywuzzy, так и с Rapidfuzz.
После этого он показывает, насколько близко совпадение.
Цель состоит в том, чтобы попытаться взять все мои уличные адреса (30 тысяч или около того) и сопоставить вариант уличного адреса со структурированным уличным адресом в моем наборе данных.
Конечным результатом будет справочная таблица с двумя столбцами:
  • Столбец A — это адрес опорного столбца.
  • Столбец B — это адрес, совпадение которого достаточно хорошее, чтобы его можно было связать со столбцом A.
  • Столбец A может иметь много связанных адресов.
Я не большой пользователь Python, но знаю, что циклы for — это последнее средство для большинства проблем (третий ответ). Имея это в виду, я использовал циклы for. Однако мои циклы займут около 235 часов, что, мягко говоря, неоптимально. Ниже я создал воспроизводимый пример. Может ли кто-нибудь увидеть, где я могу внести какие-либо изменения? Я добавил индикатор выполнения, чтобы дать вам представление о скорости. Вы можете увеличить количество адресов, изменив строку на _ в диапазоне(20):
import pandas as pd
from tqdm import tqdm
from faker import Faker
from rapidfuzz import process, fuzz

# GENERATE FAKE ADDRESSES FOR THE REPRODUCIBLE EXAMPLE -----------------------------------------------
fake = Faker()
fake_addresses = pd.DataFrame()

for _ in range(20):
# Generate fake address
d = {'add':fake.address()}
df = pd.DataFrame(data = [d])

# Append it to the addresses dataframe
fake_addresses = pd.concat([fake_addresses, df])

fake_addresses = fake_addresses.reset_index(drop=True)

# COMPARE ADDRESSES ---------------------------------------------------------------------------------
# Here we are making a "dictionary" of the addresses where we use left side as a reference address
# We use the right side as all the different variations of the address. The addresses have to be
# 0% similar. Normally this is 95% similarity
reference = fake_addresses['add'].drop_duplicates()
ref_addresses = pd.DataFrame()

# This takes a long time. I have added tqdm to show how long when the number of addresses is increased dramatically
for address in tqdm(reference):
for raw_address in reference:
result = fuzz.token_sort_ratio(address, raw_address)

d = {'reference_address': address,
'matched_address': raw_address,
'matched_result': result}

df = pd.DataFrame(data = [d])

if len(df.index) > 0:
filt = df['matched_result'] >= 0
df = df.loc[filt]
ref_addresses = pd.concat([ref_addresses, df], ignore_index=True)
else:
ref_addresses = ref_addresses


Подробнее здесь: https://stackoverflow.com/questions/757 ... omparisons

Вернуться в «Python»