2013-09-09 1 views
0

Этот вопрос является кульминацией двух фрагментов кода, руководствуясь двумя ответами здесь, на 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? Или есть более элегантный и менее волосный путь, чем я сейчас думаю ...

+1

Для "своего рода" словарь в Python см ** [Python: Сортировка словаря по значению] (http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value)** – MakeCents

+0

Я прошел через несколько из тех, что «как отсортировать словарь», но в этом случае его разные. Мне нужен способ отделить ценность моего словаря от ключей, поместить это значение в список, запустить код подобия, получить результирующий балл, сортировать его по возрастанию и выяснить, для каких идентификаторов, которые были оценены. Еще лучше, есть ли другой способ выполнить эту задачу, даже не используя словарь, но все же отслеживать базовый идентификатор базы данных? – lukik

+0

Используя форму кода предыдущей ссылки с пониманием, чтобы нарезать список. Скажем, что 'p = {'PID': 'Name', 'PID1': 'Name1', 'PID2': 'Name2'}' then 'print [p [pid] для pid в отсортированном (p, key = lambda x : x in p)] 'будет создавать список значений или' ['Name1', 'Name2', 'Name'] '. Всегда есть другой путь. – MakeCents

ответ

1

Да, вам нужно связать пару (ID, имя). Для этого вы можете использовать dict, кортеж или даже класс. Например, используя кортежей ваш код 2 изменится на:

persons = [('id1', "Peter parker"), ('id2' ,"Richard Parker"), ('id3' ,"Parker Richard"), ('id4' ,"Aunt May")] 
similarity = [[p1, p2, string_similarity(p1[1], p2[1])] 
       for p1, p2 in itertools.combinations(persons, 2)] 

similarity = sorted(similarity, key=lambda x: x[2], reverse=True) 
for p1, p2, sim in similarity:  
    print "{} - {}: {}".format(p1, p2, sim) # p1[0], p2[0] to show ids only 

Вы получаете:

('id2', 'Richard Parker') - ('id3', 'Parker Richard'): 0.833333333333 
('id1', 'Peter parker') - ('id2', 'Richard Parker'): 0.545454545455 
('id1', 'Peter parker') - ('id3', 'Parker Richard'): 0.545454545455 
('id1', 'Peter parker') - ('id4', 'Aunt May'): 0.0 
('id2', 'Richard Parker') - ('id4', 'Aunt May'): 0.0 
('id3', 'Parker Richard') - ('id4', 'Aunt May'): 0.0 
+0

Вы получили это место. Спасибо, что нашли время. Я бы никогда не решил это на моем текущем уровне навыков питона. – lukik

 Смежные вопросы

  • Нет связанных вопросов^_^