Нечеткое сопоставление URL в Python - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы найти инструмент, который хорошо справляется с нечетким сопоставлением URL, которые ожидают дополнительных параметров. Например, для моего варианта использования эти два URL одинаковы:

atest = (http://www.npr.org/templates/story/story.php?storyId=4231170', 'http://www.npr.org/templates/story/story.php?storyId=4231170&sc=fb&cc=fp)

На первый взгляд, fuzz.partial_ratio и fuzz.token_set_ratio fuzzywuzzy выполняют работу с порогом 100:

ratio = fuzz.ratio(atest[0], atest[1])
partialratio = fuzz.partial_ratio(atest[0], atest[1])
sortratio = fuzz.token_sort_ratio(atest[0], atest[1])
setratio = fuzz.token_set_ratio(atest[0], atest[1])
print('ratio: %s' % (ratio))
print('partialratio: %s' % (partialratio))
print('sortratio: %s' % (sortratio))
print('setratio: %s' % (setratio))
>>>ratio: 83
>>>partialratio: 100
>>>sortratio: 83
>>>setratio: 100

Но этот подход дает сбой и возвращает 100 в других случаях, например:

atest('yahoo.com','http://finance.yahoo.com/news/earnings-preview-monsanto-report-2q-174000816.html')

URL-адреса в моих данных и добавленные параметры сильно различаются. Мне интересно узнать, есть ли у кого-то лучший подход, использующий разбор URL или аналогичный?

1 Ответ

0 голосов
/ 30 апреля 2018

Если все, что вам нужно, это убедиться, что все параметры запроса в первом URL-адресе присутствуют во втором URL-адресе, вы можете сделать это более простым способом, просто установив разницу:

import urllib.parse as urlparse

base_url = 'http://www.npr.org/templates/story/story.php?storyId=4231170'
check_url = 'http://www.npr.org/templates/story/story.php?storyId=4231170&sc=fb&cc=fp'

base_url_parameters = set(urlparse.parse_qs(urlparse.urlparse(base_url).query).keys())
check_url_parameters = set(urlparse.parse_qs(urlparse.urlparse(check_url).query).keys())

print(base_url_parameters - check_url_parameters)

Это вернет пустой набор, но если вы измените базовый URL на что-то вроде

base_url = 'http://www.npr.org/templates/story/story.php?storyId=4231170&test=1'

будет возвращено {'test'}, что означает, что в базовом URL есть дополнительные параметры, которые отсутствуют во втором URL.

...