Дублирует узлы, не соединенные ребром в небольшом графе networkx - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь создать граф сети книг с использованием networkx.В моем примере я взял две книги с моей книжной полки и использовал API, чтобы извлечь «похожие книги» из Goodreads.Подобные книги читаются в словаре d1, используя приведенный ниже код.d1 выглядит так:

 #use requests to get book details based on id
 id_lst=[3431,6900]
 print(id_lst)
 from goodreads import client
 gc = client.GoodreadsClient(api_key,api_secret)

 d1 = {}
 for id in id_lst[:2]:
     book = gc.book(id)
     similar = book.similar_books
     similar_small = similar[0:4]
     print(book)

test=similar[1]
#print(test)

d1.update({book:similar_small})

print(d1)

{The Five People You Meet in Heaven: [
Harry Potter and the Deathly Hallows (Harry Potter, #7), 
Lord of the Flies, 
A Wrinkle in Time (Time Quintet, #1), 
Speak], 
Tuesdays with Morrie: [
Harry Potter and the Deathly Hallows (Harry Potter, #7), 
Lord of the Flies, 
Speak, 
Anna Karenina]}  

Затем я превращаю этот словарь в список краев, используя следующий код:

    output = []
    for key in d1:
        for i in d1[key]:
        output.append((key, i))
    print(output)

Возвращает этот список краев.

[(The Five People You Meet in Heaven, Harry Potter and the Deathly Hallows (Harry Potter, #7)), 
(The Five People You Meet in Heaven, Lord of the Flies), 
(The Five People You Meet in Heaven, A Wrinkle in Time (Time Quintet, #1)), 
(The Five People You Meet in Heaven, Speak), 
(Tuesdays with Morrie, Harry Potter and the Deathly Hallows (Harry Potter, #7)),
(Tuesdays with Morrie, Lord of the Flies), 
(Tuesdays with Morrie, Speak), 
(Tuesdays with Morrie, Anna Karenina)]

Затем я пытаюсь прочитать это в networkx, чтобы построить график.

    G = nx.from_edgelist(output)

Возвращает график с двумя различными кластерами, которые не связаны, несмотря на, например, «Гарри Поттер и Дары смерти» (Harry Potter, #7)) «появляется дважды, поэтому он должен быть связан как с« Пятью людьми, которых вы встречаете на небесах », так и с« Вторниками с Морри ».

Я очень новичок в Python и графовых сетях в целом, и япытаясь создать небольшой проект самостоятельно, поскольку моя организация начинает на них смотреть, и я хочу укрепить свое понимание.

РЕДАКТИРОВАТЬ: добавлен код, который создает словарь d1.график

введите описание изображения здесь

EDIT3: результат nx.draw (G)

введите описание изображения здесь

РЕДАКТИРОВАТЬ 4: Final edit - все решается преобразованием вывода API в строку ...

#use requests to get book details based on id
id_lst=[3431,6900]
print(id_lst)
from goodreads import client
gc = client.GoodreadsClient(api_key,api_secret)
str_ls=[]
d1 = {}
for id in id_lst[:2]:
    book = gc.book(id)
    books = str(book)
    similar = book.similar_books
    similar_small = similar[0:4]
    for s in similar_small:
        str_b = str(s)
        str_ls.append(str_b)
    d1.update({books:str_ls})

Спасибо всем, кто помог!

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

После нашего разговора я полагаю, что проблема заключается в именах вашей книги, которые не выходят правильно.Это единственное, что мы делаем по-другому (потому что вы выбираете его с помощью API, а мы копируем и вставляем его и уходим вручную).

0 голосов
/ 26 марта 2019

У меня нет API-ключа goodreads, поэтому я построил приведенный ниже пример, используя буквы, чтобы представить ту же структуру, что и данные вашей книги выше.

просто запустите:

import networkx as nx

d1 = {('a','c'),('a','d'),('a','e'),('a','f'),('b','c'),('b','d'),('b','f'),('b','g')}

G = nx.from_edgelist(G)

nx.draw(G)

и если все работает правильно, вы должны увидеть enter image description here

, что означает, что networkx работает правильно, и проблема связана с данными, которые вы передаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...