Этот вопрос является кульминацией двух фрагментов кода, руководствуясь двумя ответами здесь, на SO. Первый вопрос, который у меня было как сравнить сходство между двумя строками, и я получил хороший ответ, как видно here со следующим кодом:Сортировка словаря python после запуска функции itertools
код 1
def get_bigrams(string):
'''
Takes a string and returns a list of bigrams
'''
s = string.lower()
return { s[i:i+2] for i in range(len(s) - 1) }
def string_similarity(str1, str2):
'''
Perform bigram comparison between two strings
and return a percentage match in decimal form
'''
pairs1 = get_bigrams(str1)
pairs2 = get_bigrams(str2)
intersection = set(pairs1) & set(pairs2)
return (2.0 * len(intersection))/(len(pairs1) + len(pairs2))
После того, что мне нужен способ сортировки список имен для меня, чтобы запустить их через вышеуказанный код. Я получил код here, как показано ниже:
код 2
import itertools
persons = ["Peter parker", "Richard Parker", "Parker Richard", "Aunt May"]
similarity = []
for p1, p2 in itertools.combinations(persons, 2):
similarity.append(string_similarity(p1,p2))
print("%s - %s: " %(p1, p2) + " " + str(string_similarity(p1, p2)))
similarity = sorted(similarity, key=float)
print(similarity)
Теперь последнее препятствие в том, что мои данные не в списке, и на самом деле извлекается из базы данных с первичными ключами, который что я в конечном счете хочу отслеживать. Значение, когда я сравниваю несколько имен, мне нужно отметить это, например. Наиболее предпочтительными являются ID 1 и ID 2. Для меня, чтобы определить, что эти два идентификатора являются наиболее вариант, мне нужно сортировать результат «code1` выше, который выглядит, как показано ниже:
Peter parker - Richard Parker: 0.5454545454545454
Peter parker - Parker Richard: 0.5454545454545454
Peter parker - Aunt May: 0.0
Richard Parker - Parker Richard: 0.8333333333333334
Richard Parker - Aunt May: 0.0
Parker Richard - Aunt May: 0.0
[0.0, 0.0, 0.0, 0.5454545454545454, 0.5454545454545454, 0.8333333333333334]
В моей голове вместо этих имен там мне нужно Первичные идентификаторы с которые имена были взяты, поэтому я думаю, используя словарь. Есть ли способ запустить словарь из {PID: Name}, {PID1: Name1}, PID2: Name2}, используя code2
, получить значение подобия, используя code1
, отсортировать результат и узнать, что имена с наивысшим сходством - это PID1 и PID3? Или есть более элегантный и менее волосный путь, чем я сейчас думаю ...
Для "своего рода" словарь в Python см ** [Python: Сортировка словаря по значению] (http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value)** – MakeCents
Я прошел через несколько из тех, что «как отсортировать словарь», но в этом случае его разные. Мне нужен способ отделить ценность моего словаря от ключей, поместить это значение в список, запустить код подобия, получить результирующий балл, сортировать его по возрастанию и выяснить, для каких идентификаторов, которые были оценены. Еще лучше, есть ли другой способ выполнить эту задачу, даже не используя словарь, но все же отслеживать базовый идентификатор базы данных? – lukik
Используя форму кода предыдущей ссылки с пониманием, чтобы нарезать список. Скажем, что 'p = {'PID': 'Name', 'PID1': 'Name1', 'PID2': 'Name2'}' then 'print [p [pid] для pid в отсортированном (p, key = lambda x : x in p)] 'будет создавать список значений или' ['Name1', 'Name2', 'Name'] '. Всегда есть другой путь. – MakeCents